中文字幕无码久久精品,13—14同岁无码A片,99热门精品一区二区三区无码,菠萝菠萝蜜在线观看视频高清1

您當(dāng)前的位置是:  首頁 > 資訊 > 國內(nèi) >
 首頁 > 資訊 > 國內(nèi) >

opensips學(xué)習(xí)筆記-關(guān)于stateless和stateful 模式討論和retransmissions演示

2021-01-05 10:19:05   作者:james.zhu    來源:Asterisk開源派   評論:0  點(diǎn)擊:


  在SIP協(xié)議中針對UAS有兩個非常關(guān)鍵的定義stateless和stateful模式。筆者在以前的歷史文章中多次通過各種方式做了一些比較粗淺的介紹,為了更進(jìn)一步了解其具體應(yīng)用的場景和語法,筆者再次結(jié)合一些非常基礎(chǔ)的概念和重傳示例來幫助讀者了解stateless(無狀態(tài))和stateful(有狀態(tài))模式。首先,我們了解一下有狀態(tài)和無狀態(tài)代理在SIP協(xié)議規(guī)范中的定義。RFC3261-16.11 定義了關(guān)于Stateful Proxy的細(xì)節(jié),具體說明如下:
  When stateful, a proxy is purely a SIP transaction processing engine.
  Stateful  模式下,opensips會保持所有transaction 事務(wù)狀態(tài)的消息內(nèi)容,所有消息會存儲在內(nèi)存中。因此,當(dāng)然,有狀態(tài)模式會消耗大量的系統(tǒng)資源。
  RFC3261-16.2定義了關(guān)于Stateless Proxy的細(xì)節(jié):讀者可以參考:SIP協(xié)議規(guī)范RFC3261中文分享-12
  1state是什么意思?
  根據(jù)前面的介紹,我們知道,其實(shí)這個state是針對transaction 來定義的。那么,transaction又是什么意思呢?關(guān)于transaction 建議讀者參考:
  Kamailio/OpenSIPS學(xué)習(xí)筆記-SIP相關(guān)基礎(chǔ)
  SIP講座系列-各種SIP服務(wù)器介紹
  實(shí)際上,我們在前面的文章中已經(jīng)使用了opensips的transaction 模塊,包括
  Kamailio/OpenSIPS學(xué)習(xí)筆記-如何測試SIP 408響應(yīng)超時,調(diào)用了$T_fr_timeout等變量。opensips中的tm 模塊是一個非常重要的模塊,支持的配置功能也非常靈活,相對比較復(fù)雜。因?yàn)槠P(guān)系,這里不再做太多介紹。
  實(shí)話說,stateless 目前生產(chǎn)環(huán)境中沒有看到太多的應(yīng)用場景。在某些環(huán)境可能被使用,例如,作為一個SBC,SIP發(fā)起方可能對SIP服務(wù)器端不斷發(fā)送option消息驗(yàn)證其是否是存活狀態(tài),OpenSIPS可以設(shè)置為一個stateless狀態(tài),檢測到是option以后,然后丟棄。很多時候,如果用戶ping 運(yùn)營商的SBC的話,為了防止系統(tǒng)過載,SBC可能沒有返回任何消息。
  Stateful 模式是SIP UAS或者proxy主要的應(yīng)用場景。它可以支持SIP呼叫場景基本上所有必要的相關(guān)應(yīng)用, 例如,處理重傳,失敗路由處理,定時器調(diào)整,NAT轉(zhuǎn)換處理,CDR/計(jì)費(fèi),CANCELs和ACKs消息的路由管理等。我們花費(fèi)一點(diǎn)時間重點(diǎn)介紹在有狀態(tài)模式下的處理流程。
  2OpenSIPS中stateless和stateful的兩種狀態(tài)
  首先讀者一定要明確,默認(rèn)環(huán)境下,opensips是以stateless 狀態(tài)啟動的。在stateless模式下,opensips通過core 模塊提供SIP的信令功能,具體的函數(shù)包括forward()和sl_send_reply()。stateful模式的函數(shù)功能由transaction module提供,包括t_relay()和t_reply()。絕大部分的應(yīng)用環(huán)境中,opensips是在有狀態(tài)的模式下工作的,但是,默認(rèn)opensips啟動時又是一個無狀態(tài)的模式,如果opensips需要從stateless切換到stateful 狀態(tài)的話,opensips需要通過調(diào)用事務(wù)模塊的函數(shù)從無狀態(tài)模式切換到有狀態(tài)模式。接下來,筆者介紹一下從無狀態(tài)模式切換到有狀態(tài)模式的兩種方式。
  3啟動stateful狀態(tài)的兩種方式
  啟動opensips的有狀態(tài)模式可以通過以下兩種方式。一種是手動通過明確的外部調(diào)用函數(shù)-t_newtrans()的方式來啟動opensips的有狀態(tài)模式; 另外一種是自動啟動的方式,通過t_relay()和t_reply()函數(shù)來自動啟動有狀態(tài)模式。
  這里,讀者需要注意,前一種方式是對請求創(chuàng)建了一個事務(wù)狀態(tài),但是它執(zhí)行的是無SIP信令處理;后一種方式是如果沒有創(chuàng)建有狀態(tài)模式事務(wù)的話,它們會自動創(chuàng)建一個事務(wù),并且執(zhí)行SIP 信令操作。
  4retransmissions測試示例
  retransmissions是SIP網(wǎng)絡(luò)環(huán)境中經(jīng)常遇到的一個問題。如果opensips要處理retransmissions的話,opensips需要在有狀態(tài)模式中進(jìn)行處理。retransmissions支持兩種retransmissions,一種是incoming 請求的檢測和重新傳輸; 入局的請求通過檢測可以再進(jìn)行處理,否則的話,重傳流程可能進(jìn)入到其他的cfg腳本中,或者查詢數(shù)據(jù)庫等流程,這樣就會耗費(fèi)更多的系統(tǒng)資源。因此,opensips進(jìn)行重傳檢測是非常必要的,如果發(fā)現(xiàn)是一個重傳遞請求,則系統(tǒng)可能直接回復(fù)相關(guān)的響應(yīng)即可。另外一種retransmissions基本上是針對被呼叫方來進(jìn)行的,opensips獲得被呼叫方的回復(fù)以后再進(jìn)行其他的業(yè)務(wù)流程處理。
  為了演示如何使用t_new_tran(),這里,我們提供重傳的示例演示,呼叫入局時,如果檢測到一個不存在的地址以后,如何進(jìn)行重傳處理。具體的配置步驟如下:
  首先,需要在cfg文件中加載-loadmodule "cfgutils.so" 模塊。
  添加cfg腳本處理流程:
  ## requests for my domain
  if (is_method("PUBLISH|SUBSCRIBE")) {
  send_reply(503, "Service Unavailable");
  exit;
  }
  if ($rU==NULL) {
  # request with no Username in RURI
  send_reply(484,"Address Incomplete");
  exit;
  }
  #發(fā)送呼叫1002到地址 地址1.1.1.1
  if ($rU=="1002") {
  #設(shè)置request uri是 1.1.1.1
  $rd="1.1.1.1";
  t_relay();
  exit;
  }
  // 創(chuàng)建一個新的事務(wù),切換到有狀態(tài)模式。
  t_newtran();
  #進(jìn)行呼叫,休眠2秒鐘。
  if(is_method("INVITE")) {
  sleep(2);
  }
  以上腳本中,我們偽造了一個不存在的地址是1.1.1.1。使用一個SIP 終端呼叫另外一個終端1002的話,這里的目的地地址是一個不存在的地址,用戶可能感覺到呼叫流程相對比較慢,因?yàn)樵诤艚兄刑砑恿艘粋休眠時間。
  5總結(jié)
  在本文章中,筆者討論了關(guān)于opensips中關(guān)于UAS的兩種狀態(tài)的具體使用方式和函數(shù)調(diào)用,以及價格應(yīng)該注意到示例語法。首先,筆者介紹了stateless和stateful的基本區(qū)別,以及各自的應(yīng)用場景,包括函數(shù)調(diào)用方式。接下來,筆者主要重點(diǎn)介紹了在無狀態(tài)啟動的情況下,opensips如何切換為有狀態(tài)模式環(huán)境,以及兩種切換方式和各自的不同。最后,筆者通過retransmissions的應(yīng)用場景介紹了如何使用 t_newtran()實(shí)現(xiàn)opensips從無狀態(tài)模式切換到有狀態(tài)模式的示例,通過一個示例說明opensips如何在有狀態(tài)環(huán)境中對入局呼叫進(jìn)行處理。
  參考資料:
  https://opensips.org/html/docs/modules/1.8.x/tm.html
  www.freesbc.cn
  www.asterisk.org.cn
  
【免責(zé)聲明】本文僅代表作者本人觀點(diǎn),與CTI論壇無關(guān)。CTI論壇對文中陳述、觀點(diǎn)判斷保持中立,不對所包含內(nèi)容的準(zhǔn)確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔(dān)全部責(zé)任。

專題

CTI論壇會員企業(yè)