SIP中存在兩種路由場景:
- 1,請求消息的路由
- 2弯蚜,響應消息的路由
<span style="font-family:'楷體';font-size:17px">其中,響應消息的路由非常簡單剃法,就是完全依靠Via來完成的碎捺。【說明:】一個SIP消息每經過一個Proxy(包括主叫)贷洲,都會被加上一個Via頭域收厨,當消息到達被叫后,Via頭域就記錄了請求消息經過的完整路徑优构。被叫將這些Via頭域原樣copy到響應消息中(包括各Via的參數诵叁,以及各Via的順序),然后下發(fā)給第一個Via中的URI钦椭,每個Proxy轉發(fā)響應消息前都會把第一個Via(也就是它自己添加的Via)刪除拧额,然后將消息轉發(fā)給新的第一個Via中的URI碑诉,直到消息到達主叫。</span>
重要概念
路由集
Route Set: 路由集侥锦。路由集合是一個順序的SIP或者SIPSURI进栽。這些URI描述了傳遞一個請求所必須經歷的代理列表。一個路由集可以是自適應的恭垦,因為包頭中包含了Record-Route(記錄路由)快毛,也可以是依賴配置得到的。(不包括目標地址)
相關頭域說明
Request-URI:目標用戶或者服務的地址番挺。
Via: Via頭域是用來描述請求當前經歷的路徑的唠帝,并且標志了應答所應當經過的路徑。Via頭域的branchID參數提供了事務的標志玄柏,并且用于proxy來檢查循環(huán)路由襟衰。只有當需要通過選擇傳輸設備到達下一個節(jié)點(hop)的時候,才需要在頭域中包含Via域禁荸。
Contact: Contact頭域提供了一個URI右蒲,指明了請求的資源或請求發(fā)起者,這個URI的含義取決于是在請求還是在應答中赶熟。
Record-Route:Record-Route頭域是proxy在請求中增加的瑰妄,用來強制會話中的后續(xù)請求經過本proxy的。
Route:Route頭域用于強制一個請求經過一個proxy路由列表映砖。
(strick routing)嚴格路由
<span style="font-family:'楷體';font-size:17px">Route頭域中的值中包含lr參數部分為嚴格路由间坐,不包含lr的為松散路由。嚴格路由實際指發(fā)送者指明了必須經過的路由邑退,如果下一跳路由找不到就返回錯誤竹宋;</span>
如果Route頭域的第一個值為嚴格路由,那么UA或Proxy必須根據下列步驟修改這個請求:
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參數部分為松路由。松散路由的處理不要求必須經過定死的路由列表作谚,它允許通過一些中間的轉換再到達下一跳三娩,比如: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