基於OpenSIPS做註冊服務下,場景A打B,一方發起BYE結束通話後收到500,另一方無法結束通話的問題
阿新 • • 發佈:2020-08-07
基於OpenSIPS做註冊服務下,場景A打B,一方發起BYE結束通話後收到500,另一方無法結束通話的問題
最近在工作中遇到一個看似很奇怪的,排除起來很費勁,但最後的解決方式又及其簡單的問題,下面我們一起來看看具體發生了什麼吧!
一句話概括:那都是OpenSIPS Dialog模組的default_timeout 惹的禍(學業不精,木辦法呀……)
問題現象:
View Code
- A打B,電話接通後,持續通過話5分鐘後,任意一方結束通話電話,另一方無法正常結束通話,另一方電話始終顯示正在通話中。
- 如果通話時長在4分鐘以內,任何一方結束通話,則另一方都能正常結束。
- OpenSIPs為分機提供註冊服務
- OpenSIPs為FreeSWITCH提供Load balance服務,將電話轉接至相應FreeSWITCH
- OpenSIPs為FreeSWITCH提供Gateway服務
問題分析:
- 通過抓包分析,發現主被叫任意一方結束通話後,FS收到bye後,直接回給OpenSIPS 500 (Internal Server Error), 而導致OpenSIPS沒能將bye訊號發給另一方電話終端
- OpenSIPS 給FS和電話終端發OPTIONS檢測會話狀態只發4分鐘後,就不再發了,並且主被雙方可以繼續通話
- 如果OpenSIPS關閉掉對FS的dialog會話OPTIONS檢測,FS收到BYE後,能轉發到另一方電話終端,但終端會返回500
- 四分之內正常結束通話的BYE報文,跟超過4分鐘無法結束通話的BYE報文構造形式完全相同
1 ------------------------------------------------------------------------ 2 recv 839 bytes from udp/[10.2.32.112]:5060 at 20:13:12.270989: 3 ------------------------------------------------------------------------ 4 BYE sip:[email protected]:5080;transport=udp SIP/2.0 5 Via: SIP/2.0/UDP 10.2.32.112:5060;branch=z9hG4bK4a88.a1534783.0 6 Via: SIP/2.0/UDP 10.32.26.19:1150;branch=z9hG4bK-d87543-eb259935be711165-1--d87543- 7 Max-Forwards: 69 8 Contact: <sip:[email protected]:1150;transport=udp> 9 To: "9001"<sip:[email protected]>;tag=p4v8FyNvv3S5D 10 From: "9003"<sip:[email protected]>;tag=e7553b0b 11 Call-ID: NzA5YjM0OGVlM2JmMDA4NTAyZDliZmNhZWE2NjhiMDA. 12 CSeq: 3 BYE 13 Proxy-Authorization: Digest username="9003",realm="10.2.32.112",nonce="5f2bf37b000000d2afc1e61869246645da21b40ab086deaf",uri="sip:[email protected]:5080;transport=udp",response="6a89ecdf3476a98ce0a89ee15ba29312",algorithm=MD5 14 User-Agent: eyeBeam release 1011d stamp 40820 15 Reason: SIP;description="User Hung Up" 16 Content-Length: 0 17 18 ------------------------------------------------------------------------ 19 send 375 bytes to udp/[10.2.32.112]:5060 at 20:13:12.271131: 20 ------------------------------------------------------------------------ 21 SIP/2.0 500 Internal Server Error 22 Via: SIP/2.0/UDP 10.2.32.112:5060;branch=z9hG4bK4a88.a1534783.0 23 Via: SIP/2.0/UDP 10.32.26.19:1150;branch=z9hG4bK-d87543-eb259935be711165-1--d87543- 24 From: "9003"<sip:[email protected]>;tag=e7553b0b 25 To: "9001"<sip:[email protected]>;tag=p4v8FyNvv3S5D 26 Call-ID: NzA5YjM0OGVlM2JmMDA4NTAyZDliZmNhZWE2NjhiMDA. 27 CSeq: 3 BYE 28 Content-Length: 0
問題原因: 通過上面分析,我們可以猜測這是由於OpenSIPS對dialog做OPTIONS探測引起的。仔細檢測OpenSIPS的dialog 模組配置,我發現dialog模組的 default_timeout = 240 (秒)。 這就能充分解釋上面‘問題分析’中的第2點了(只發4分鐘OPTIONS), 因為4分鐘後dialog就過期了,OpenSIPS不再發送探測包。 FreeSWITCH 和 電話終端(如Yealink話機) 都遵循 SIP 協議規範,如果一通已建立的電話,在通話過程中,FS或電話終端有收到上游(如OpenSIPS)的OPTIONS探測,那麼電話從接通到結束通話,都必須收到週期性的進行OPTIONS探測, 如果超過週期時長了,FS或電話終端仍沒有收到OPTIONS探測, 那麼FS和電話終端就會認為通話存在錯誤,後面在收到BYE時,就會返回 500 (Internal Server Error)。 解決辦法: 將 OpenSIPS 的 default_timeout 值改大,如改成10800 即3小時,重啟OpenSIPS即可解決問題。
loadmodule "dialog.so" modparam("dialog", "db_mode", 1) modparam("dialog", "dlg_match_mode", 1) modparam("dialog", "default_timeout", 10800) # 3 hours timeout 【正確配置】 #modparam("dialog", "default_timeout", 240) # 4 mins 【錯誤配置 :如果使用了create_dialog("Pp"),當一同電話超過 default_timout + options_pint_interval ,就會出現終端返回500】 modparam("dialog", "profiles_with_value", "caller ; callee") modparam("dialog", "options_ping_interval", 60) # 1 mins route{ if (is_method("INVITE")) { if ( !create_dialog("Pp") ) { # 對OpenSIPS上進出兩個dialog(如主/被叫)都進行OPTIONS探測 xlog("create_dialog error : Internal Server Error"); send_reply("500","Internal Server Error"); exit(); } } }
&nbs