移動互聯網SIP在線狀態方案分析

        經過近10年的發展,SIP己發展成做音視頻通信的首選標準協議。如今在移動互聯網背景下,SIP得到廣泛應用的同時也面臨諸多挑戰,我們今天要聊的在線狀態就是其中之一。SIP是一個非常靈活的協議,可應用於音視頻、IM等場景,基於其高擴展性,實際可用於任何數據的通信協商。在其主要應用場景音視頻通信中,爲保證用戶體驗,在線狀態的準確顯得尤爲重要。

        SIP協議在定義之初,主要是基於UDP進行設計。在線和離線是靠SIP REGISTER 請求完成的,當UA執行REGISTER後,服務器端會在返回的200OK消息中expires參數告知客戶端此次註冊有效期,UA需要在expires到期之前進行續約,如果到期未續約,服務器即認爲客戶端離線,在互聯網時候這看上去沒有什麼問題,因爲用戶的網絡多數情況下不會異常中斷。但加上移動兩個字,這一切就變得很糟糕了:用戶的網絡會隨時中斷,從一個WIFI自動換到另一個WIFI,進電梯出電梯,在移動設備上,斷網那是很正常的事,不斷纔不正常。如果用戶剛發送REGISTER後就斷網了,那此用戶的假在線狀態將持續到整個expires週期。下面分別就TCP和UDP探討一種可行性方案。

         理想中的在線狀態即服務端能以最短的時間探知客戶端狀態變化,基於UDP無連接的特點,一個看似簡單有效的方法縮短續約週期,如將REGISTER週期改爲60秒,同時客戶端斷線重連,這樣用戶狀態有效期只有60秒,一但超過60秒未註冊就將用戶狀態置爲離線,這樣至少存在三個嚴重問題:

1.流量高:SIP協議完成一次註冊再加上www-authenticate鑑權,需要耗費2K左右的流量,一天就需要3M左右,這樣的軟件用戶只能放棄。
2.狀態變更頻率:在3G網絡下,某些基站會對UDP包進行緩存(完全是看運營商心情的),優先級沒有TCP高,所以UDP延遲大是非常正常的事情,客戶端在註冊週期提前10秒進行註冊,也不能保證服務器能在10秒內接收到,因此在客戶端的好友端其在線狀態將容易出現反覆變化。
3.上面的週期假設了UDP NAT映射有效期至少大於60秒,但這個假設非常不靠譜。在實際應用環境中,國內某小運營商針對某些端口的有效期是8秒,難道我們要把續約週期改成8秒?

        針對以上問題,RFC 5626提出STUN keepalive方案,使用STUN來代替SIP的REGISTER保話NAT,因此可以將SIP REGISTER的週期加長。同時服務器需要做STUN保活檢測,即多少時間內累計多少次未收到客戶端STUN保活包即認爲客戶端離線,客戶端也需要做同樣檢測,多少次未收到STUN 響應包就認爲斷線並重新註冊,具體次數在RFC中有定義,也可以根據實際情況調整。這樣對前面前兩個問題能夠比較好的改善,但第三個問題呢? 這裏就需要實現UDP NAT保活自適應了,可先使用默認間隔發次STUN包,收到響應包發現NAT地址變化那就說明保話時間過短,然後再嘗試一個更短的間隔時間,當然具體算法可以再進行優化。服務器端支持STUN keepalive的有opensips、kamailio,SIP UA我知道pjsip支持,其他未考證。

        根據多個項目經驗,基於中國網絡的特點,移動互聯網SIP使用TCP傳輸會更適合一些,對於前面同樣的問題,RFC 5626也提出TCP sip keepalive方案。具體是客戶端以‘\r\n\r\n’作發送PING給服務器,服務器以'\r\n'爲PONG回覆。並且TCP是面向連接的,本身也可以使用TCP 協議層的keepalive,但TCP協議層的keepalive缺點是隻能檢測單方向的連接是否正確,如果要檢測兩方那通信雙方都需要開啓keepalive功能。opensips/kamailio同樣支持 TCP sip keepalive方案。在opensips/kamailio上實現這樣一個功能,當客戶端TCP連接斷開時,自動將客戶端的註冊信息刪除掉,這樣實現了當服務器端TCP連接斷開時將用戶設置爲離線,同時客戶端也需要使用TCP sip keepalive檢測到網絡斷線後自動進行重連,這樣就可以將註冊週期改到很長,且只要TCP不斷那用戶的註冊信息就一直有效。這種方案相比UDP更節省流量,客戶端和服務器都能更快/有效的判斷網絡是否斷線。對於TCP NAT保活也只有使用自適應的方法,TCP可以同時建立N個連接,然後以不同的週期發送keepalive包,以能夠成功保活的最長週期爲應用值,此方法好像被某公司申請過專利了。

       也許4G網絡的到來這一切就都迎刃而解,與之而來的是視頻通信的春天,還是技術壁壘的惡夢?


參考資料:
http://tools.ietf.org/html/rfc5626

新浪微博:@安靜的發狂者
郵箱:dennis.yu(@)live.cn
QQ:229675152
專注於移動互聯網音視頻通信,歡迎交流;本文爲原創,轉載請保留版權並聯系作者

kamailio/opensips 技術交流QQ羣:118791050

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章