一個網絡請求可以簡單分為連接配接伺服器 -> 擷取資料兩個部分。
其中連接配接伺服器前還包括 dns 解析的過程;擷取資料後可能會對資料進行緩存。
1. 不用域名,用 ip 直連
首次域名解析一般需要幾百毫秒,可通過直接向 ip 而非域名請求,節省掉這部分時間,同時可以預防域名劫持等帶來的風險。
當然為了安全和擴充考慮,這個 ip 可能是一個動态更新的 ip 清單,并在 ip 不可用情況下通過域名通路。
2. 伺服器合理部署
伺服器多營運商多地部署,一般至少含三大營運商、南中北三地部署。
配合上面說到的動态 ip 清單,支援優先級,每次根據地域、網絡類型等選擇最優的伺服器 ip 進行連接配接。
對于伺服器端還可以調優伺服器的 tcp 擁塞視窗大小、重傳逾時時間(rto)、最大傳輸單元(mtu)等。
1. 連接配接複用
節省連接配接建立時間,如開啟 keep-alive。
2. 請求合并
即将多個請求合并為一個進行請求,比較常見的就是網頁中的 css image sprites。 如果某個頁面内請求過多,也可以考慮做一定的請求合并。
3. 減小請求資料大小
(1) 對于 post 請求,body 可以做 gzip 壓縮,如日志。
(2) 對請求頭進行壓縮
這個 http 1.1 不支援,spdy 及 http 2.0 支援。 http 1.1 可以通過服務端對前一個請求的請求頭進行緩存,後面相同請求頭用 md5 之類的 id 來表示即可。
4. cdn 緩存靜态資源
緩存常見的圖檔、js、css 等靜态資源。
5. 減小傳回資料大小
(1) 壓縮
一般 api 資料使用 gzip 壓縮,下圖是之前測試的 gzip 壓縮前後對比圖。

(2) 精簡資料格式
如 json 代替 xml,webp 代替其他圖檔格式。關注公衆号 codekk,回複 20 檢視關于 webp 的介紹。
(3) 對于不同的裝置不同網絡傳回不同的内容 如不同分辨率圖檔大小。
(4) 增量更新
需要資料更新時,可考慮增量更新。如常見的服務端進行 bsdiff,用戶端進行 bspatch。
(5) 大檔案下載下傳
支援斷點續傳,并緩存 http resonse 的 etag 辨別,下次請求時帶上,進而确定是否資料改變過,未改變則直接傳回 304。
6. 資料緩存
緩存擷取到的資料,在一定的有效時間内再次請求可以直接從緩存讀取資料。
1. 預取
包括預連接配接、預取資料。
2. 分優先級、延遲部分請求
将不重要的請求延遲,這樣既可以削峰減少并發、又可以和後面類似的請求做合并。
3. 多連接配接
對于較大檔案,如大圖檔、檔案下載下傳可考慮多連接配接。 需要控制請求的最大并發量,畢竟移動端網絡受限。
優化需要通過資料對比才能看出效果,是以監控系統必不可少,通過前後端的資料監控确定調優效果。
注:伺服器部署方面的優化有參考手 q 和 qzone 去年的技術分享。