SIP中存在兩種路由場景:
- 1,請求消息的路由
- 2,響應(yīng)消息的路由
<span style="font-family:'楷體';font-size:17px">其中,響應(yīng)消息的路由非常簡單,就是完全依靠Via來完成的?!菊f明:】一個SIP消息每經(jīng)過一個Proxy(包括主叫),都會被加上一個Via頭域,當消息到達被叫后,Via頭域就記錄了請求消息經(jīng)過的完整路徑。被叫將這些Via頭域原樣copy到響應(yīng)消息中(包括各Via的參數(shù),以及各Via的順序),然后下發(fā)給第一個Via中的URI,每個Proxy轉(zhuǎn)發(fā)響應(yīng)消息前都會把第一個Via(也就是它自己添加的Via)刪除,然后將消息轉(zhuǎn)發(fā)給新的第一個Via中的URI,直到消息到達主叫。</span>
重要概念
路由集
Route Set: 路由集。路由集合是一個順序的SIP或者SIPSURI。這些URI描述了傳遞一個請求所必須經(jīng)歷的代理列表。一個路由集可以是自適應(yīng)的,因為包頭中包含了Record-Route(記錄路由),也可以是依賴配置得到的。(不包括目標地址)
相關(guān)頭域說明
Request-URI:目標用戶或者服務(wù)的地址。
Via: Via頭域是用來描述請求當前經(jīng)歷的路徑的,并且標志了應(yīng)答所應(yīng)當經(jīng)過的路徑。Via頭域的branchID參數(shù)提供了事務(wù)的標志,并且用于proxy來檢查循環(huán)路由。只有當需要通過選擇傳輸設(shè)備到達下一個節(jié)點(hop)的時候,才需要在頭域中包含Via域。
Contact: Contact頭域提供了一個URI,指明了請求的資源或請求發(fā)起者,這個URI的含義取決于是在請求還是在應(yīng)答中。
Record-Route:Record-Route頭域是proxy在請求中增加的,用來強制會話中的后續(xù)請求經(jīng)過本proxy的。
Route:Route頭域用于強制一個請求經(jīng)過一個proxy路由列表。
(strick routing)嚴格路由
<span style="font-family:'楷體';font-size:17px">Route頭域中的值中包含lr參數(shù)部分為嚴格路由,不包含lr的為松散路由。嚴格路由實際指發(fā)送者指明了必須經(jīng)過的路由,如果下一跳路由找不到就返回錯誤;</span>
如果Route頭域的第一個值為嚴格路由,那么UA或Proxy必須根據(jù)下列步驟修改這個請求:
S_1、接收到的消息的request-URI必須是自己的URI
S_2、把第一個Route頭域“彈”出來,并把其中的URI作為新的request-RUI.
S_3、然后把該消息路由到新的request-URI。
(loose routing)松散路由
<span style="font-family:'楷體';font-size:17px">Route頭域中的值中不包含lr參數(shù)部分為松路由。松散路由的處理不要求必須經(jīng)過定死的路由列表,它允許通過一些中間的轉(zhuǎn)換再到達下一跳,比如:a-->b是,他可以是先到c再到b</span>
處理步驟:
1、Loose Router和Strict Router首先都會檢查Router字段的第一個地址是否為自己,如果是則從Router字段中刪除自己。
2、Strict Router在發(fā)往下一跳時將使用Router字段中的下一跳地址更新Request URI。
3、Loose Router首先會檢查Request URI是否為自己:如果不是,則不作處理;如果是,則取出Route字段的最后一個地址作為Request URI地址,并從Route字段中刪去最后一個地址。
4、Loose Router其次會檢查下一跳是否為Strict Router:如果不是,則不作處理;如果是,則將Request URI添加為Route的最后一個字段,并用下一跳Strict Router的地址更新Request URI。
SIP-URI是一個Hop(節(jié)點)-to-Hop(節(jié)點)的屬性,所以有可能被Proxy改變;
From和To屬性在消息的路由過程中一直保持不變;它們在Request消息中確定,此后對端發(fā)來的所有Response消息的From和To都是原樣拷貝Request消息中的From和To;
- Route優(yōu)先級高于contact高于from