OpenSIPS-關於請求中Record Set和Loose Route再討論

2021-02-19 Asterisk開源派
前面的文章中介紹了關於初始請求和後續請求的處理,在初始請求和後續請求的使用中還有另外兩個比較重要的關於SIP 請求路由的處理方式需要大家注意。這兩個路由的概念就是Record Set和Loose Route。筆者雖然在以前的文章中多次做過介紹,但是那些介紹都是基於基本的SIP route做的介紹,沒有具體到軟交換層面,例如,OpenSIPS平臺的具體使用方式。本文章進一步討論關於Record Set和Loose Route的背景知識,希望能夠為讀者提供一個針對OpenSIPS的相對比較全面的理解。關於這些相關概念的定義和細節,讀者可以參考筆者的歷史文檔來進一步了解關於record set 和loose route的區別以及應用場景中可能出現的問題:除了以上的參考連結以外,筆者這裡再次多IR初始請求和SR後續請求做一點補充說明。為了判斷其請求以及後續的處理流程,首先SIP 路由需要驗證其請求是初始請求還是後續請求。針對loose route,如果是初始請求IR的話,初始請求創建dialog的,而後續請求則是在一個創建的dalog內的請求。因此,後續請求SR需要判斷是否支持了To-tag。如果有To-tag, 則說明是一個後續請求,如果沒有To-tag,說明是一個初始請求,例如, INVITE 或者SUBSCRIBE等。在介紹以上這兩個概念之前,我們有必要再稍微回顧一下前面文章中所討論的initinital request(IR,初始請求)和sequential requests(SR-後續請求)的基本概念。簡單來說,常見的初始請求包括我們通常呼叫發起的請求-INVITE,後續請求包括掛機的BYE請求,ACK確認或者re-INVITE請求。因為雙方的呼叫需要經過一個或者多個代理伺服器地址,每個代理伺服器地址需要對呼叫路徑做一個記錄。Record Set其實就是針對初始請求對呼叫路徑做的一個記錄值,記錄值包括IP位址和對端終端的Contact地址。以下圖例就是一個OpenSIPS的record route的處理流程,包括INVITE和200 OK的處理。

當被呼叫方返回到呼叫方時,被呼叫方通過後續請求對呼叫方進行查詢回溯,找到呼叫方地址。當然,被呼叫方返回時所使用的Record Set和呼叫方的Record Set是完全不同的,處理流程是正好相反的路徑。

和Record Set相比,loose route是一個相對比較動態靈活的路由,後續請求會使用此路由根據代理地址和RURI終端地址返回到源呼叫方地址。BYE請求就是一個典型的後續請求,它通過loose route的路徑按照route set 地址組的列表返回到呼叫方終端A,以下圖例就是一個OpenSIPS中關於loose route的使用示例。

前面筆者已經提及,根據SIP規範和OpenSIPS的處理流程,如果代理需要record route或者loose route時,首先需要判斷支持了has_totag()。如果支持了的話,就執行後續請求的處理,否則發起一個record route執行初始請求的路由處理。在OpenSIPS中,通過route路由處理模塊進行判斷處理。

需要注意,通過以上針對路由處理的流程可以看出,如果是初始請求(IR)的話,初始請求需要耗費更多的資源來進行驗證,查詢,定位等服務。如果是SR後續請求的話,它基本上不會消耗太多系統資源,它僅按照路由表返回呼叫方就可以。因此,後續請求處理速度相對比較快,也更高效。
因為SIP規範和應用場景,以及呼叫路徑的變化很大。一個SIP呼叫可以經過多個網元和多個代理伺服器地址,包括SBC,防火牆等。在早期的SIP規範RFC2543中規定了比較早的route方式-strict route(嚴格路由), 而Loose route則是SIP v 2版本,RFC3261中所支持的比較靈活的路由方式。後者可以支持R-URI不被修改,可以兼容RFC2543中的嚴格路由方式。嚴格路由是在初始請求創建dialog之前就已經明確定義好了路由的路徑以及路由表。每個代理伺服器嚴格按照路由表指定的路徑執行,如果路由路徑中其中一個網元出現故障都會導致呼叫失敗。另外,如果UA支持了outbound-proxy以後就會出現其他的問題。因此,為了更加靈活地支持SIP的路由策略,loose route比較好的解決了這個問題,它通過:lr參數支持,允許每個目的地地址來路由數據包,並且每個目的地都有各自的機制兼容支持了嚴格路由策略。關於以上討論的具體細節,讀者可以參考RFC3261-16.12了解更多規定。在SIP路由中,除了我們前面討論的以上路由表以外,還有一個比較重要的定義是Via。Record route其目的是在路由消息中充當一個角色來影響Reg-URL(通過:lr參數決定request-URL。如果路由組中的第一個路由URL包含:lr, 則不會影響request-URL;如果如果路由組中的第一個路由URL不包含:lr,UA就會把第一個路由組的URL設置為request-URL,然後處理其餘的路由組流程。),當然也在VIA中支持部分的描述內容。另外,VIA是被UAS用來決定響應的下一個目的地地址的,它只是不斷添加代理Via地址,對Via地址不做修改,返回時刪除相應的Via地址。最後,Via是基於事務層的路由記錄,請求所創建的事務完成以後,Via就會被丟棄;而Record Set是基於dialog的,呼叫的路徑會貫穿整個dialog中。Record route和loose route在SIP 路由中分別進行不同的處理。本文章重點介紹了關於OpenSIPS中兩種路由方式的區別以及發起方的不同,另外介紹了在OpenSIPS中如何發起兩種路由方式,最後討論了其他關於SIP路由,VIA一些區別。通過以上進一步的討論,希望讀者對OpenSIPS中的Record route和loose route有一個比較完整的認識,結合前面各種opensips的cfg場景配置文件能夠更多了解開源OpenSIPS的使用方式。

參考資料:

www.opensips.org

www.freepbx.org.cn

www.freesbc.cn

融合通信/IPPBX/FreePBX商業解決方案:www.hiastar.com

最新Asterisk完整中文用戶手冊詳解:www.asterisk.org.cn

Freepbx/FreeSBC技術文檔: www.freepbx.org.cn如何使用免費會話邊界控制器-FreeSBC,qq技術分享群:334023047關注微信公眾號:asterisk-cn,獲得有價值的通信行業技術分享

相關焦點

  • OpenSIPS新CLI工具OpenSIPS-CLI 使用概覽 - 國內 - CTI論壇-中國...
    OpenSIPS是運營級的SIP 信令伺服器,它本身支持RFC3261官方,同時也支持了很多豐富的接口來調用OpenSIPS引擎的其他模塊,監控系統狀態和SIP伺服器的狀態。opensips-3.0以前的版本一直使用opensipsctl 來實現對伺服器端的一些配置的管理,常見的場景例如添加SIP 帳號分機等。
  • C# 9.0中引入的新特性init和record的使用思考
    .NET 5.0已經發布,C# 9.0也為我們帶來了許多新特性,其中最讓我印象深刻的就是init和record type,很多文章已經把這兩個新特性討論的差不多了,本文不再詳細討論,而是通過使用角度來思考這兩個特性。
  • 使用雲部署的openSIPS測試Zoiper和SIP話機之間的通話
    界面系統,讀者需先參考歷史文檔:最完整快速的安裝方式安裝開源OpenSIPS-3.1和CP控制界面-class 8關於NAT問題和ALG問題,讀者查看歷史文檔,或者在opensips前端部署FreeSBC支持NAT穿越。
  • The flying Frenchman set to smash round the world record
    And just like Beamon, who astonished the world with his record-breaking long-jump in 1968, the French sailor Francis Joyon is rewriting the nautical record books in an unprecedented fashion.
  • Next five years set to be hottest on record
    >UNITED NATIONS - A UN report published on Sunday said the world is falling badly behind in the race to avert climate disaster because of runaway warming, with the five-year period ending 2019 set
  • Traceroute與Tracert區別?
    一、在UNIX中的程序traceroute(Ciscoand Juniper應用),可以用來跟蹤一個數據包從源點到終點的路徑,通俗講就是跟蹤路由的工具
  • 【乾貨】Traceroute與Tracert區別?
    在UNIX中的程序traceroute(Ciscoand Juniper應用),可以用來跟蹤一個數據包從源點到終點的路徑,通俗講就是跟蹤路由的工具。如下圖來說明traceroute的思想:R1要去往R3數據包要經過路由器R2,但是在大多數情況下,我們並不知道這個網絡拓撲。R1和R3之間可能有很多的設備。
  • 英語實用知識點教學:關於set用法的匯總
    「 set 」中文意思除了放置、設定、設置的基本定義,還有什麼其他英文意思或用法呢?to put something in a place or position放置ex. I always set my keys on the counter.
  • Kubernetes 疑難雜症排查分享: 詭異的 No route to host
    比如在 server 滾動更新過程中,舊的 Pod 中的進程很快就停止了(網卡還未完全銷毀),但 client 所在節點的 iptables/ipvs 規則還沒更新,包就可能會被轉發到了這個停止的 Pod (由於 k8s 的 controller 模式,從 Pod 刪除到 service 的 endpoint 更新,再到 kube-proxy watch 到更新並更新 節點上的 iptables/ipvs
  • ACL與route-policy中permit/deny的關係
    一條關於192.168.1.0 路由信息permit的規則,並通過route-policy調用,查看現象發現R3上只留下了192.168.1.0這個網段的路由信息。192.168.2.0和192.168.3.0之所以沒有配置中是因為在第一個node沒有匹配中後,會往下繼續查看下一個node,直到最後一個node,而route-policy在匹配末尾預設一條deny ,會把192.168.2.0和192.168.3.0給拒絕掉,從而不能正常重發步在OSPF域中。
  • Cut loose
    Could you explain 「cut loose」?However, to 「cut loose」 means to relax, be free and have a good time.After drinking a few bottles of beer, one may 「cut loose」 either by telling a lot of jokes and being laid back with friends, or hitting the dance floor.
  • Track record
    A track record, therefore, is, literally, a record of someone’s past deeds put together.Anyways, that’s what a track record is, and it can be either good or bad. Delly’s track record is not very good in Horford’s eyes.
  • 中考英語7: realize,understand, 和set短語
    When』ll you set out for London?set off    出發,啟程  含開始(旅行、賽跑等)的意思  I』ll set off for home the day after tomorrow.set up     創立,建立;(a record)創造……記錄  Mr.
  • 揭秘JavaScript的全新類型之Record和Tuple
    在這個博客文章中,我們首先看看ECMAScript提案"Record&Tuple"(https://github.com/tc39/proposal-record-tuple)。是原始類型我們可以看到,當我們使用typeof時,Record和Tuple是原始類型:> typeof #{x: 1, y: 4}'record'> typeof #['a', 'b']'tuple'
  • 關於Kafka區分請求處理優先級的討論
    再舉一個例子,同樣是在積壓大量數據類請求的broker上,如果用戶刪除了topic,那麼StopReplica請求無法及時處理,導致topic無法真正刪除,增加了刪除topic的延時。最後還可以舉個例子說明對UpdateMetadata的影響。
  • route是路線,one是一,那route one是什麼意思?
    我們知道route有「路線,路途」的意思,one是指數字一,那習語route one是什麼意思呢?route one的意思是「 to drive a football towards an opponent's goal by a long kick upfield from the rear」,即「(足球) 長傳(直接)進攻」。
  • Lose和Loose,傻傻分不清楚怎麼辦?|遊遊英語第33期
    在學習英語單詞時,我們會因為粗心,把一些單詞給記混了,比如lose和loose,僅僅一個字母的差別就讓這兩個詞的意思產生顯著的差異。今天就讓我們學習下lose和loose,看看這兩個單詞有什麼「花樣」吧!
  • 接口測試實戰| GET/POST 請求區別詳解
    在日常的工作當中,HTTP 請求中使用最多的就是 GET 和 POST 這兩種請求方式。
  • 考場詞 「set」 的用法【高中】
    單詞 「set」屬於高考必考詞/考場詞,在考試中主要以動詞和動詞短語的形式在閱讀完型中出現。