兩個SIP路由實例分析
前面我們通過《闡述SIP路由機制的概念》一文,了解了關于SIP路由機制的有關定義和概念。那么接下來,對于這些抽象概念的解析,就讓實例來幫助大家理解吧。接下來,我們利用兩個SIP路由實例幫助大家把這些概念來融會貫通一下。
SIP路由示例1:
場景:兩個UE間有兩個Proxy,U1 -> P1 -> P2 -> U2,并且兩個Proxy都樂意添加Record-Route頭域。
消息流:
【說明】由于我們在此只關心SIP路由機制,因此下面消息中跟路由機制無關的頭域都省略了。
U1發(fā)出一個INVITE請求給P1(P1是U1的外撥代理服務器):
- INVITE sip:callee@domain.com SIP/2.0
- Contact: sip:caller@u1.example.com
P1不負責域domain.com,消息中也沒有Route頭域,因此通過DNS查詢得到負責該域的Proxy的地址并且把消息轉(zhuǎn)發(fā)過去。這里P1在轉(zhuǎn)發(fā)前就添加了一個Record-Route頭域,里面有一個lr參數(shù),說明P1是一個松散路由器,遵循RFC3261中的路由機制。
- INVITE sip:callee@domain.com SIP/2.0
- Contact: sip:caller@u1.example.com
- Record-Route: <sip:p1.example.com;lr>
P2負責域domain.com,因此它通過定位服務得到callee@domain.com
對應的設備地址是callee@u2.domain.com ,在SIP路由機制中,因此用新的URI重寫request-URI。消息中沒有Route頭域,因此它就把該消息轉(zhuǎn)發(fā)給request-URI中的URI,轉(zhuǎn)發(fā)前它也增加了一個Record-Route頭域,并且也有l(wèi)r參數(shù)。
- INVITE sip:callee@u2.domain.com SIP/2.0
- Contact: sip:caller@u1.example.com
- Record-Route: <sip:p2.domain.com;lr>
- Record-Route: <sip:p1.example.com;lr>
位于u2.domain.com的被叫收到了該INVITE消息,并且返回一個200OK響應。其中就包括了INVITE中的Record-Route頭域。
- SIP/2.0 200 OK
- Contact: sip:callee@u2.domain.com
- Record-Route: <sip:p2.domain.com;lr>
- Record-Route: <sip:p1.example.com;lr>
被叫此時也就有了自己的路由集:
- (<sip:p2.domain.com;lr>,<sip:p1.example.com;lr>)
并且它本次會話的遠端目的地址設置為INVITE中Contact中的URI:caller@u1.example.com,此后被叫在該會話中的請求消息就發(fā)到這個URI。同樣,被叫在200 OK響應中也攜帶了自己的聯(lián)系地址,主叫收到該響應消息后也會把本次會話的遠端目的地址設置為:callee@u2.domain.com,此后主機在該會話中的請求消息就發(fā)到這個URI。同樣,主叫也有了自己的路由集,只是跟被叫的是反序的:
- (<sip:p1.example.com;lr>,<sip:p2.domain.com;lr>)
通話完畢后,我們架設主叫先掛機,則主叫發(fā)出BYE請求:
- BYE sip:callee@u2.domain.com SIP/2.0
- Route: <sip:p1.example.com;lr>,<sip:p2.domain.com;lr>
可以看到,BYE的Route頭域正是主機的路由集構造來的。由于p1在***個Route中,因此BYE首先發(fā)給P1。
P1收到該消息后,發(fā)現(xiàn)request-URI中的URI不屬于自己負責的域,而消息有Route頭域,并且***個Route頭域中的URI正是自己,因此刪除之,并且把消息轉(zhuǎn)發(fā)給新的***個Route頭域中的URI,也就是P2:
- BYE sip:callee@u2.domain.com SIP/2.0
- Route: <sip:p2.domain.com;lr>
P2收到該消息后,發(fā)現(xiàn)request-URI中的URI不屬于自己負責的域(P2負責的是domain.com,而不是u2.domain.com),***個Route頭域中的URI正是自己,因此刪除之,此時已經(jīng)沒有Route頭域了,因此就轉(zhuǎn)發(fā)給了request-URI中的URI。
被叫就會收到BYE消息:
- BYE sip:callee@u2.domain.com SIP/2.0
#P#
SIP路由示例2:
如果說上面的示例主要關注的是SIP路由流程,那么本示例關注的則是嚴格路由與松散路由的區(qū)別。
場景:U1->P1->P2->P3->P4->U2其中,P3是嚴格路由的,其余Proxy都是松散路由的,并且4個Proxy都很樂意增加Record-Route頭域。
消息流:我們直接給出了到達被叫的INVITE消息:
- INVITE sip:callee@u2.domain.com SIP/2.0
- Contact: sip:caller@u1.example.com
- Record-Route: <sip:p4.domain.com;lr>
- Record-Route: <sip:p3.middle.com>
- Record-Route: <sip:p2.example.com;lr>
- Record-Route: <sip:p1.example.com;lr>
這中間的其他消息我們就不過問了,直接看一下被叫***發(fā)出的BYE消息大概是什么樣子:
- BYE sip:caller@u1.example.com SIP/2.0
- Route: <sip:p4.domain.com;lr>
- Route: <sip:p3.middle.com>
- Route: <sip:p2.example.com;lr>
- Route: <sip:p1.example.com;lr>
因為P4在***個Route里,因此被叫將BYE消息發(fā)給了P4。
P4收到該消息后,發(fā)現(xiàn)自己不負責域u1.example.com,但是***個Route頭域中的URI正是自己,因此刪除之。在SIP路由機制中,P4還發(fā)現(xiàn)新的***個Route頭域中的URI是一個嚴格路由器,因此它把request-URI中的URI添加到***一個Route的位置,并且將***個Route“彈出”并且覆蓋原來的request-URI。然后將消息轉(zhuǎn)發(fā)給當前的request-URI,也就是P3。
- BYE sip:p3.middle.com SIP/2.0
- Route: <sip:p2.example.com;lr>
- Route: <sip:p1.example.com;lr>
- Route: <sip:caller@u1.example.com>
P3收到該消息后,直接把消息作出如下變換并且發(fā)給P2:
- BYE sip:p2.example.com;lr SIP/2.0
- Route: <sip:p1.example.com;lr>
- Route: <sip:caller@u1.example.com>
P2收到該消息后,發(fā)現(xiàn)消息中的request-URI是自己的,因此在進一步處理先首先對消息做如下變換:
- BYE sip:caller@u1.example.com SIP/2.0
- Route: <sip:p1.example.com;lr>
然后,P2發(fā)現(xiàn)自己不負責域u1.example.com 。***個Route中的URI也不是自己的,因此將消息轉(zhuǎn)發(fā)給該URI,也就是P1。
P1收到該消息后,發(fā)現(xiàn)自己不負責域u1.example.com,但是***個Route頭域中的URI正是自己,因此刪除之。
消息變成下面的樣子:
- BYE sip:caller@u1.example.com SIP/2.0
既然Route頭域已經(jīng)是空,因此P1把消息發(fā)給u1.example.com。
到這里,兩個SIP路由實例已經(jīng)講解完了,不知道大家對這部分知識是否了解了,希望本文的總結,能夠讓給大家一些參考。