微信開源的終端跨平台組件——Mars在移動網絡的探索和實踐
內容來源:2017年3月19日,微信高級工程師在“OSC源創會第59期【深圳站】”進行《Mars在移動網絡的探索和實踐》演講分享。IT大咖說作為獨家視頻合作方,經主辦方和講者審閱授權發布。
閱讀字數: 2019 用時: 6分鍾
嘉賓演講視頻:https://t.cn/R9S82aJ
移動網絡概述
丟包和誤碼
在進行網絡請求的時候,延遲到一定程度就是失敗,而影響延遲的兩個主要因素就是IP層的丟包和誤碼。
無線網絡的丟包率比有線網絡要高,在白天使用的移動設備較多,丟包率更為嚴重。
而無線網絡的誤碼率已經嚴重到和有線網絡不在同一個層級了。
核心網絡架構
核心網絡架構圖主要包括四部分延遲:
控製麵延遲用於控製網絡資源,一般耗時0-100毫秒;
用戶麵延遲是指手機數據發送到基站的耗時,大約為5毫秒;
核心網絡延遲也就是運營商內部的延遲,大概是30-100毫秒;
互聯網路由延遲不確定。
特別需要注意的是控製麵延遲,最多可達100毫秒,最少是0毫秒。
RRC
在使用移動網絡的情況下,長時間不收發數據將會進入空閑態。處於空閑態時隻能監聽來自網絡的控製信號,客戶端沒有無線電資源。
要想收發數據,必須先從空閑態進入連接態,這期間的耗時就是控製麵延遲,大概需要100毫秒。
移動網絡特點
由於環境電波,用戶到基站的距離遠,導致誤碼率高。
因為手機信號問題、用戶多、誤碼率高,致使丟包率高。
丟包和誤碼就需要重試,造成延遲不穩定。
基站距離和用戶數量也會使帶寬不穩定。
移動網絡優化
連接之前
用域名提供服務避免不了DNS解析,但目前業界DNS有不少缺點,比較常見的就是域名劫持、解析轉發和更新緩慢。
域名劫持就是請求一個域名,它返回了一個錯誤的IP。
解析轉發常見於比較小的運營商,因為他們不一定有自己的DNS解析服務器。當進行一個DNS解析請求的時候,它會把請求轉發到有DNS解析服務器的大運營商,這時初步IP已經發生改變,解析到的IP不是原來的IP了。
因為要有TTL的生存時間,所以更新比較緩慢。
微信有一個“NEW DNS”的概念,和HTTP DNS有同樣的功能。
複合連接
如果用一個IP端口直接進行連接,連不上服務器就當作連接失敗,未免有些粗暴。所以一般我們會采用並行連接和串行連接。
並行連接是同時用多個端口進行連接。它能較快找到可用的IP,但是對服務器的負載較高,網絡資源競爭大。
串行連接是一次連接失敗後再換個IP嚐試進行下一次連接。它的優點是沒有服務器的負載問題,但是要花很長時間才能找到可用IP。
結合這兩種方式的優點,我們使用了複合連接。它的連接成功率提升了5%,能更快地找到可用鏈路和IP輪轉。
Nagle
網絡協議棧主要分為應用層、傳輸層、網絡層以及量入層。
當發送方產生數據比較慢或接收方處理數據慢的時候,就會導致真正能發送的數據很少,但會帶來很多頭部,我們稱之為“煳塗窗口綜合症”。
針對這個問題提出了Nagle算法。如果發送請求達到一個mss的話,它會允許發送;當發送請求要結束這個連接的時候,也會允許發送。
除此之外超時才能發送,應用發送小數據最極端的情況可能要被延遲200毫秒,設置nodelay發送小數據才是比較推薦做的。
發送超時
首包超時
首包超時是從發出請求到收到第一個回包的最大耗時。
根據發送的包的大小計算出最慢耗時,第二部分就是服務器收到請求並處理的耗時,還要考慮並發量。
讀寫超時
讀寫超時可以定義為從發出第一個請求到收到完整回包的最長等待時間,所以還要加上回包發送的時間。
動態超時
根據最近曆史任務的完成情況估算值替換之前的最大值。
接收
循環接收的buffer不要太小,業務處理線程和網絡線程進行分離。
長連接
長連接的優點就是消息及時,省電省流量,提高發送速度。
技術方案
應用特點
隨時啟動與終止;
並發少狀態多;
盡量少的資源盡量快的網絡。
方案選擇
基礎庫:不重複造輪子,要設配各個接口不同的平台。
線程模型:多線程可以並發或並行提高效率,但容易造成死鎖,析構時序異常;而消息隊列的時序清晰編程簡單,但是串行運行導致效率略低。
跟進問題
Crash依賴各個平台自己的實現去捕捉相應crash。
通過查看用戶日誌,或看review代碼去解決bug。
其它難解決的網絡問題隻能使用tcpdump了。
Benchmark
測試網絡敏感度。初始設置100%loss網絡參數,分別在不同的時間後,恢複為正常網絡,觀察Mars和AFNetworking的表現。
每種時間段進行3次測試,記錄完成時間的差值,正數表明Mars先完成CGI,負數表明競品先完成。
測試結果說明Mars更占優勢。
在android平台上,使用同樣的測試方法, Mars和OKHttp對比,結果同樣是Mars占優勢。
在弱網絡環境下的表現依然是Mars更好。
如何快速接入
Xlog是高可靠性高性能的運行期日誌組件。
STN是信令分發網絡模塊,也是Mars最主要的部分。
第一步,了解:閱讀wiki,運行demo。
第二步,定製:擴展協議,重新編製。
第三步,接入:接入項目,後台聯調。
未來規劃
這個運維模式可能響應速度和迭代效率沒那麼快,但基本可以保證內部和外部使用的是同一套代碼,而且外部所有代碼都是經過微信用戶驗證過的。
我們現在要實現有日誌提供加密默認,長連接支持http、socks5代理,Windows平台支持。
以上是我今天分享的內容,感謝聆聽!
最後更新:2017-08-13 22:33:40