admin 管理员组

文章数量: 887021

SIP: From ,Contact, Via 和 Record

From: 

如果一个SIP消息中没有Contact或者Record-Route头域,那么callee就会根据From头域产生后续的Request。比如:如果 Alice打一个电话给Bob,From头域的内容是 From:Alice<sip:alice@example.org>。那么Bob打给Alice时就会使用 sip:alice@example.org作为To头域和Request-URI头域的内容。 

Contact: 

后续Request将根据Contact头域的内容决定目的地的地址,同时将Contact头域的内容放到Request-URI中。它还可以用来指示没 有在Record-Route头域中记录的Proxies的地址。同时它还可以被用在Redirect servers和REGISTER requests 和responses。 

Record-Route/Route: 

Record-Route头域一般是被proxies插入到request中的,这样后续的Request如何有着和前面一样的call-id就会被路由 到这些proxies。它也会被User Agent作为发送后续request的依据。这套机制很像source-route,Record-Route头域的信息被复制到Route头域中。并 且Request-URI头域会被设置为第一个Route头域的内容。 

Via: 

Via头域是被服务器插入request中,用来检查路由环的,并且可以使response根据via找到返回的路。它不会对未来的request 或者是response造成影响。 

总的来说,如果有Route,request就应该根据Route发送,如果没有就根据Contact头域发送,如果连Contact都没有,就根据From头域发送。 

dialog, transaction, session

SIP中3个很重要的概念,就是dialog, session和transaction。 
以下是我学习中对这三个概念的心得,贴出来和大家探讨。 

dialog的建立是收到UAS的响应(To tag)时开始建立的。收到180响应时建立的 
dialog叫做早期对话(early dialog),收到2XX的应答开始才是真正的dialog建立。 

session 是媒体交换之后才建立的。具体而言就是通过offer/answer方式交换sdp的媒体。 
session的建立可以使INVITE-200 也可以是200-ACK。这要看媒体的交换发生的时间。 
具体来说,INVITE 中的消息体用sdp语言来描述自己可处理的媒体类型,200OK中 
带回UAS端可处理的媒体类型。这个时候媒体交换就算是完成了。也就是session建立起 
来了。 

dialog是end-point对end-point的关系。而transaction 是hop by hop的关系。dialog通过 
From tag, To tag(应该说local tag, remote tag--这两个tag随着UAC和UAS而不同。)以及 
Call-ID 来判别。而transaction是一个SIP entity和下一个SIP entity之间请求和应答关系,(无状态代理服务器不再此列) 
是通过对Via里的branch来判别的。 

Transaction:

维护hop to hop状态,包括一个请求和其触发的所有响应,包括若干暂时响应和一个最终响应。生命周期从请求产生到收到最终响应。 

Dialog:

维护peer to peer状态,目前只有invite和subscribe请求会触发dialog。其生命周期贯穿一个端到端会话的始终

本文标签: SIP From Contact Via 和 Record