闡述SIP路由機(jī)制的概念
SIP是VoIP業(yè)務(wù)中,最為重要的協(xié)議之一,那么對于這個協(xié)議,我們在之前的一些文章中個,也闡述過與之相關(guān)的一些基礎(chǔ)內(nèi)容。這里我們不在贅述。那么今天的重點(diǎn),就是講解一下SIP路由機(jī)制的相關(guān)知識。
總的來說,SIP路由機(jī)制包括兩個場景:
1,請求消息的路由
2,響應(yīng)消息的路由
其中,響應(yīng)消息的路由非常簡單,就是完全依靠Via來完成的,具體請見我關(guān)于RFC3261中會話流程的分析。下面我們只談SIP路由機(jī)制中,SIP請求消息的路由。首先我們要搞清楚什么是嚴(yán)格路由和松散路由。
嚴(yán)格路由(Strict Routing):
可以理解為比較“死板”的理由機(jī)制,這種路由機(jī)制在SIP協(xié)議的前身RFC 2534中定義,其機(jī)制非常簡單。要求接收到的消息的request-URI必須是自己的URI,然后它會把***個Route頭域“彈”出來,并把其中的URI作為新的request-RUI,然后把該消息路由給該URI。
松散路由(Louse Routing,lr):
該路由機(jī)制較為靈活,也是SIP路由機(jī)制的靈魂所在,在SIP根本大典RFC 3261中定義。下面介紹一下一個松散路由的Proxy的路由決策過程:
1,Proxy首先會檢查消息的request-URI是不是自己屬于自己所負(fù)責(zé)的域。如果是,它就會通過定位服務(wù)將該地址“翻譯”成具體的聯(lián)系地址并以此替換掉原來的request-URI;否則,它不會動request-URI。
2,Proxy檢查***個Route頭域中的URI是不是自己的,如果是,則移除之。
3,前面兩項都是準(zhǔn)備工作,下面該進(jìn)行真正的路由了。如果還有Route頭域,則Proxy會把消息路由給該頭域中的URI,否則就路由給request-URI。至于如何從下一跳URI確定出IP地址,端口以及傳輸協(xié)議那是另外一回事了。
好了,解了兩種路由機(jī)制,我們再來了解一下Route和Record-Route。如果說Via是為了給一個請求消息的響應(yīng)消息留后路,那么Record-Route就是為了給該請求消息之后的請求消息留后路。
【說明】SIP路由機(jī)制中,一個SIP消息每經(jīng)過一個Proxy(包括主叫),都會被加上一個Via頭域,當(dāng)消息到達(dá)被叫后,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,直到消息到達(dá)主叫。
而在一個請求消息的傳輸過程中,Proxy也可能(純粹自愿,如果它希望還能接收到本次會話的后續(xù)請求消息的話)會添加一個Record-Route頭域,這樣當(dāng)消息到達(dá)被叫后里面就有會有0個或若干個Record-Route頭域。被叫會將這些Record-Route頭域并入路由集,并并入自己的路由集,隨后被叫在發(fā)送請求消息時就會使用該路由集構(gòu)造一系列Route頭域,以便對消息進(jìn)行路由。
然后,被叫會像上面對待Via頭域一樣,將Record-Route頭域全部原樣copy到響應(yīng)消息中返回給主叫。 主叫收到響應(yīng)消息后也會將這些Record-Route頭域并入路由集,只是它會將其反序。該會話中的后續(xù)請求消息的Route頭域就會通過路由集構(gòu)造。
【注意】Record-Route頭域不用來路由,而只是起到傳遞信息的作用。Record-Route頭域不是路由集的***來源,路由集還可以通過手工配置等方式得到。