如果说上面的示例主要关注的是SIP路由流程,那么本示例关注的则是严格路由与松散路由的区别。
场景:U1->P1->P2->P3->P4->U2其中,P3是严格路由的,其余Proxy都是松散路由的,并且4个Proxy都很乐意增加Record-Route头域。
消息流:我们直接给出了到达被叫的INVITE消息:
1.INVITE sip:callee@u2.domain.com SIP/2.0
2.Contact: sip:caller@u1.example.com
3.Record-Route: <sip:p4.domain.com;lr>
4.Record-Route: <sip:p3.middle.com>
5.Record-Route: <sip:p2.example.com;lr>
6.Record-Route: <sip:p1.example.com;lr>
这中间的其他消息我们就不过问了,直接看一下被叫最后发出的BYE消息大概是什么样子:
1.BYE sip:caller@u1.example.com SIP/2.0
2.Route: <sip:p4.domain.com;lr>
3.Route: <sip:p3.middle.com>
4.Route: <sip:p2.example.com;lr>
5.Route: <sip:p1.example.com;lr>
因为P4在第一个Route里,因此被叫将BYE消息发给了P4。
P4收到该消息后,发现自己不负责域u1.example.com,但是第一个Route头域中的URI正是自己,因此删除之。在SIP路由机制中,P4还发现新的第一个Route头域中的URI是一个严格路由器,因此它把request-URI中的URI添加到最后一个Route的位置,并且将第一个Route“弹出”并且覆盖原来的request-URI。然后将消息转发给当前的request-URI,也就是P3。
1.BYE sip:p3.middle.com SIP/2.0
2.Route: <sip:p2.example.com;lr>
3.Route: <sip:p1.example.com;lr>
4.Route: <sip:caller@u1.example.com>
P3收到该消息后,直接把消息作出如下变换并且发给P2:
1.BYE sip:p2.example.com;lr SIP/2.0
2.Route: <sip:p1.example.com;lr>
3.Route: <sip:caller@u1.example.com>
P2收到该消息后,发现消息中的request-URI是自己的,因此在进一步处理先首先对消息做如下变换:
1.BYE sip:caller@u1.example.com SIP/2.0
2.Route: <sip:p1.example.com;lr>
然后,P2发现自己不负责域u1.example.com 。第一个Route中的URI也不是自己的,因此将消息转发给该URI,也就是P1。
P1收到该消息后,发现自己不负责域u1.example.com,但是第一个Route头域中的URI正是自己,因此删除之。
消息变成下面的样子:
1.BYE sip:caller@u1.example.com SIP/2.0
既然Route头域已经是空,因此P1把消息发给u1.example.com。
到这里,两个SIP路由实例已经讲解完了,不知道大家对这部分知识是否了解了,希望本文的总结,能够让给大家一些参考。