天天看點

SIP消息路由機制

一:請求路由

    松散路由(Loose Router)和嚴格路由(Strict Router),這是SIP協定(RFC3261)中的一個非常重要的概念。

    在SIP消息的Route頭域或Record-route頭域中,攜帶的域值是SIP URI或SIPS URI,如果這個URI帶有”lr”屬性值,那麼,就表示URI的位址所辨別的SIP PROXY是松散路由的,否則,是嚴格路由的。如Record-Route: <sip:p1.example.com;lr>、Route: <sip:p2.example.com;lr>。

     松散路由是RFC3261所定義的消息路由規則,而嚴格路由則是RFC2543中所定義的路由規則。松散路由提供了對嚴格路由的相容機制。路由規則中,涉及了對Request URI域值的處理。嚴格路由時,要求Request URI為路由位址。

     嚴格路由是一種比較“死闆”的理由機制,這種路由機制在SIP協定的前身RFC 2534中定義,其機制非常簡單。它要求收到的消息的request-URI必須是自己的URI,然後它會把第一個Route頭域“彈”出來,并把其中的URI作為新的request-RUI,然後把該消息路由給該URI。而松散路由則提供了一種更為靈活的機制。

處理步驟:

Proxy首先會檢查消息的request-URI是不是自己屬于自己所負責的域。如果是,它就會通過定位服務将該位址“翻譯”成具體的聯系位址并以此替換掉原來的request-URI;否則,它不會動request-URI。

PROXY首先檢查路由表中的第一個位址是否為自己,如果是則從表中删除。

嚴格路由在發往下一跳前,将Request URI的域值更新為路由表中的表頭位址(下一跳)。

松散路由将路由如果發現Request URI是自己插入到路由表中的位址。從路由表中取出最後一個位址更新Request URI,并删除最後一個位址。

松散路由檢查下一跳是否為嚴格路由。如果不是,不處理;否則,将Request URI插入到路由表表尾,并用下一跳位址(嚴格路由的位址)更新Request URI。

如果路由表為空,則路由給Request URI。

     路由機制用于請求消息的路由,其中Route頭域攜帶路由表資訊,而Record-Route頭域則是SIP PROXY想讓自己保留在後續dialog中而插入的記錄。也就是說,通常初始化時,發起終端是沒有路由表的(當然也可以強制配置,這樣局限性太強),完成第一次消息互動後,雙方根據Record-Route資訊,各自更新路由表。

二:應答消息路由

     SIP應答消息的路由機制,相對請求來說,比較簡單,基本思想就是,請求從哪裡來,應答回哪裡去。那是如何實作的呢?很簡單,Via頭域就是完成這個差事的。Via頭域表說明了SIP請求實際的路由過程,用于應答消息的回程路由。

下面是一個via的示例(注意,換行僅是為了增強可讀性,沒其它意思)

        Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8

        ;received=192.0.2.1

繼續閱讀