序言算法
對於APP而言,啓動時間是很是重要的性能指標。以前有統計指出,從點擊到首頁顯示的時間與用戶流失率正相關。試想,若是點開手淘一直轉菊花,那你確定果斷關掉點開京東的。淘寶自2010年all in 無線至今已經九年,對於啓動加載優化、業務rpc拆解等等已經很是成熟,這裏談談無線網絡環境下客戶端網絡請求優化的問題,畢竟首頁就算部分資源可以緩存,基於用戶畫像展現的動態商品頁是必須經過網絡請求數據的。json
接以前的文章:淘寶APP消息推送模型緩存
我的開發APP,網絡模塊能夠直接使用okhttp網絡庫封裝,或者直接調用系統接口作好發送和接收數據的緩存處理,作好線程分發就能夠知足基本要求。可是對於國民級APP,會從各個點上去優化,去提升請求成功率。拋開其餘因素,通常主要從三個方面來優化:速度、安全、穩定,下面先討論速度。安全
速度服務器
以前說過,正常的網絡請求爲如下步驟:微信
一、DNS解析URL對應IP;網絡
二、與服務器完成TCP三次握手建聯;架構
三、TLS加密握手;tcp
四、發送http請求數據;分佈式
五、接收數據並解析,交給應用層。
DNS解析
DNS解析大體過程就是先從本機緩存獲取IP,若沒有再從運營商(通常指中國移動,聯通,電信)的localdns獲取,獲取不到localdns會迭代查詢到權威域名服務器,可參考網上的一張圖片:
這裏就會有一些問題:運營商偷懶,通常會對部分URL進行緩存,請求到的IP地址更新不及時;對部分頁面進行緩存,隨意添加廣告;或者在運營商直接進行就近轉發,從而致使客戶端獲取不到最快的IP列表。好比,淘寶在全國各大城市都部署了服務器,客戶端訪問通常會遵循就快原則,廣東的手淘用戶會分配訪問廣州的服務器,但運營商若是把dns請求轉發到上海,那麼這個手淘用戶就會訪問上海的服務器,致使鏈接速度顯著變慢。
爲了解決這些問題,一個優化是域名收斂,即將大部分靜態資源放在一個域名下面,減小dns解析,更多優化能夠上csdn搜一下前段優化。另一個更重要的優化就是httpdns,原理很簡單,就是本身部署httpdns服務器,全部URL請求都發給這個服務器,再由httpdns服務器經過http請求查詢自家後臺URL對應的IP地址。客戶端這邊只須要定時更新httpdns服務器的IP地址。
這樣好處不少,能夠避免dns劫持,同時dns解析模塊由本身控制,能夠根據客戶端網絡情況返回速度最快的IP。若是將httpdns服務器和cdn服務器合理部署(好比粗暴的部署到同一機房),客戶端請求某些靜態資源時能夠直接命中服務器緩存,甚至無需後面的tcp握手等流程。
經過dns解析拿到服務器IP地址之後,就是經過tcp握手創建鏈接,相關內容在文章:文件下載的斷點續傳是如何實現的?TCP的基礎特性有哪些?中講過。http默認請求一次資源就關閉鏈接,試想一下,若是每次加載資源都要經歷三次握手和四次揮手,這絕對是個耗時大戶。這一塊的優化就是複用鏈接,http1.1中keep-alive字段默認開啓,即請求完成後不當即釋放鏈接。http能夠在同一tcp管道上發送多個請求,可是因爲tcp的有序性,全部請求都必須有序迴應,若是有一個請求阻塞或丟失,那麼後面全部的請求都會延時,就像平時排隊買票同樣,這種現象稱爲隊頭阻塞(Head-of-line blocking)。http2採用frame結構解決了這個問題,可是傳輸層即tcp的對頭阻塞未能解決。TCP 協議依賴操做系統實現以及部分手機硬件的定製,甚至部分中間節點已經將傳輸層的解析硬件化了,修改起來難度至關大。Google提出了新的協議quic,目前手淘根據最新的draft實現了quic代碼,就是基於udp實現http2的功能,具體性能有待正式灰度檢驗。
TLS加密握手
接下來就是TLS握手,標準協議TLS保證了數據傳輸的安全,目前https基本就是http協議層加上tls協議,基本大一點的網站都已經支持。安全協議優化主要圍繞兩點:保證數據安全;減小加密成本。借用網上一張圖片:
完整的tls握手須要通過2rtt報文交互才能開始數據請求,並且中間若是證書鏈較大的話,客戶端還得停止握手流程請求證書下載,這種場景耗時更長。這裏面優化也比較多,最經常使用的就是0rtt,即客戶端保存對稱祕鑰Session,後續握手時直接使用加密發送數據。其次就是固定祕鑰交換算法,省略加密算法選擇步驟。而後就是TLS搶跑(False start),也就是在第二個rtt發送ChangeCipherSpec時帶上加密後的應用數據,無需等待服務器確認,省去一個rtt交互時間。
數據傳輸
接下來就是正式的數據傳輸。數據對請求速度的影響分兩方面,一是壓縮率,二是解壓序列化反序列化的速度。目前主流的數據序列化格式是json和protobuf,json格式可讀性更好,而protobuf格式壓縮性能更強大,序列化速度上相對也更有優點,基本阿里系全部APP(手淘支付寶釘釘等)都接入使用,強烈推薦。
壓縮算法也處於不斷演進的過程,Z-standard能夠根據歷史數據訓練合適的字典,提升壓縮率,其它性能指標也較高。http2協議中Hpack採用靜態索引表和動態索引表的方式壓縮http頭部,也能夠借鑑。而後,對於私有協議,能夠檢查有沒有冗餘結構,對標準化參數進行壓縮,能夠進一步減小報文長度。
這裏只討論了速度,還有兩塊內容:安全、穩定,後續再探討。
往期文章:
公衆號:機械猿
本文分享自微信公衆號 - 機械猿(on_ourway)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。