SIP: From ,Contact, Via 和Record-Route/Route head

http://iruler.spaces.live.com/blog/cns!80E98768A739044!324.entry
Q: via的作用一方面起到事务标识的作用,另一方面它指示了应答信息应当回送的地址,如果一个proxy在请求中加了Record_Route,它不也是指示应答信息要经过本proxy吗?via和Record_Route两者有什么区别?哪位大侠能讲解一下。

A: 举个例子说吧。假设有两个UA:A和B,两个Proxy:P1和P2,SIP URI/地址分别记为Addr[A]、Addr[B]、Addr[P1]和Addr[P2]。当A向B发送一个INVITE请求时需要依次经过P1和P2。下面通过几个步骤来说明via:
1、A向P1发送INVITE请求,此时via:Addr[A];P1收到请求后返回100trying,此时via:Addr[P1]。
2、P1向P2转发INVITE请求,此时via:Addr[A],Addr[P1];P2收到请求后向P1返回100Trying,此时via:Addr[P2]。
3、P2向B转发INVITE请求,此时via:Addr[A],Addr[P1],Addr[P2];B收到请求后先向P2返回200OK,此时via:Addr[B]。
4、P2将200OK应答转发给P1,此时via:Addr[B],Addr[P2]。
5、当A收到200Ok应答时via:Addr[B],Addr[P2],Addr[P1],从这里可以看到Via的功能是记录路径。
6、当B收到A返回的ACK,建立了语音会话之后。假设某一时刻,B希望通过发送一个BYE请求来结束这次通话,在一般情况下B会将BYE请求发送到先前 INVITE请求中的Contact域中的目的地址,但是此时B发现先前的INVITE请求中有一个record-route域,且值为Addr[P1] (假设该域的值是P1添加的),则B必须将该BYE请求直接发送到Addr[P1](请注意:不是把该地址赋给TO域,该请求的TO域还是A的URI)。
7、倘若该次会话结束以后,则该Record-Route域失效。


http://akalius.javaeye.com/blog/174520
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头域发送。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值