Android網絡優化——應用層策略

網絡性能指標:

1.建立連接的速度  2.傳輸速度  3.到達率(TCP/IP底層已經有錯誤重傳機制,但是並不是專門爲移動端設計的)4.長連接的存活率

 

優化切入口:

1.DNS優化(一般是優化的首選),使用HTTPDNS替代LocalDNS

DNS是指根據域名查出IP地址,是HTTP協議的前提,所以網絡優化的第一步就是DNS優化。

DNS優化主要體現在兩點:1.安全性:減少或避免由於DNS劫持造成服務不可用。2.速度:解決由於DNS調度不準確影響網絡性能(1.DNS調度不準確2.運營商如果修改DNS的TTL會導致DNS修改生效延時,不同運營商實現細節不同,難以保證DNS解析的耗時)

HTTPDNS:大部分標準DNS都是基於UDP與DNS服務器交互的,HTTPDNS則是利用HTTP協議與DNS服務器交互,繞開了運營商的Local DNS服務,有效防止了域名劫持,提高域名解析效率,下圖是HTTPDNS的原理。

 

 

2.連接重用,避免重複握手:

HTTP1.1的Keep-Alive。

如果之前已經連接過,會盡量重用之前的連接(15S好像)(不一定滿足所有場景,國內比較樂觀,國外)

客戶端擁塞算法與服務端延時算法(服務端維護一個擁塞隊列等待客戶端ACK)衝突

解決方法:截包,看是不是每個請求都延時一定時間,如果有這種情況,可以選擇關閉TCP delay的開關(發送方)

 

缺點:H1連接複用需要網絡請求的域名和端口號一致,複用率有限。keep-alive必須等當前請求完全結束才能發起下一次請求,無法併發。

HTTP2.0的多路複用。

進一步提升複用率,支持一條連接同時處理多個請求,H2支持同一域名的複用。

缺點:1.一條連接只支持同一域名

2.後端支持H2需要額外的改造

3.同一域名只保留一條連接,所有請求都集中在一條連接,網絡擁塞的時候會出現TCP隊首阻塞。對於像視頻播放,文件下載這樣的場景,可能會遭到服務器單條連接的限速

針對H2的這些缺點,我們有如下應對措施:

1.不改造後端實現H2:在統一接入層做改造,統一接入層實現將數據轉換到H1再由H1轉發到域名對應服務器。

如圖:

2.針對視頻播放,文件下載這樣的場景,遭到服務器單條連接的限速時。我們可以通過修改網絡庫,也可以簡單地禁用H2協議來解決。

 

 

3.壓縮與加密

上面是連接過程的優化,接下來是發送接收的優化。

發送與接收的優化可以通過減少傳輸的數據量實現。也就是數據壓縮

HTTP請求的數據包括三部分:URL,請求header,請求body。

1.如果我們的協議採用是HTTP/2,那麼數據本身就是支持頭部壓縮技術,所以壓縮主要體現在URL和body的壓縮。

2.URL一般會攜帶很多參數,其中大部分參數是不變的,這些不變的參數只需上傳一次即可,其他請求可以在接入層進行擴展

3.請求body,網絡傳輸中最流行的兩種數據序列化方式:JSON和Protocol Buffers。Protocol Buffers使用起來會比較複雜(需考慮使用成本),但是在壓縮率和序列化反序列化的效率上都遠勝JSON

 

數據壓縮還可以通過壓縮算法實現,比如Gzip,Google的Brotli和FaceBook的Z-standard等。其中,最常見的是Gzip。

 

 

 

 

經典問題:1.優化與優化碰一起的錯誤。

客戶端:防止擁塞的算法,把所有小請求壓縮到一起,一次發過去,這樣的好處是可以避免每一個小請求都有請求頭。

服務端:延遲確認算法,維持一個隊列,客戶端的請求不一定會馬上執行,會把他hold住,等下一次請求過來在一起回來,這樣減少一次回執時間,提供網絡利用率   

但是兩個一起用,兩邊都會在等對方的下一個請求,所有請求延遲40ms或者200ms。這是一個很經典的問題。

如何處理,截包,看是否每個請求都是固定的delay,如果有,關閉tcp delay的開關。

Rfc1122規定迭代時間不超過500ms就可以

Nagle算法規定同一時間只能有一個隊列在堵住請求,客戶服務端不能同時有擁堵隊列

 

2.慢啓動,防止擁塞:

TCP能發送的包有限,不要在一開始把所有請求在開機一開始全部做了。

 

網絡優化的手段是需要應變的,沒有萬金油的。

 

內容內嵌,把圖片(小圖不超過2 3K)變成base64,直接decode一個二進制的流(比如請求微博,頭像這種小圖,可以在json裏面直接搞,一次請求獲得大量信息,以後直接用)。比如,減少請求次數,圖片不要在後臺去加載

 

HTTPS可以防止DNS劫持,HTTPS加密本身並不會加大多少開銷,但是換了HTTPS之後你還是會覺得有卡頓。最影響性能的是HTTPS的證書鏈。1.確認證書鏈上每個證書不是廢棄狀態,可信任狀態(而且DNS服務器很難去優化)

2.中間證書的頒發機構如果比較小(便宜),可能延遲很久。用錢可以解決。而OKHTTP3.0以上,證書這一塊已經做好了接口,添加域名和sha就可以,不過有一定安全性問題。

 

如果想跳過DNS,可以選擇IP直連。Mars在這一塊有好些網絡優化策略

 

OkHttp的最新版本3.10.0,2018年2月25日發佈,特性如下:

 

  • 支持HTTP2,默認採用TLS 1.2
  • GZIP壓縮 
  • 緩存響應對象
Gzip可通過攔截器實現

HTTP2在RealConnection中,就默認會查詢服務器是否支持,支持就開啓

HTTP2.0優化:

 

 優點:
        1)採用二進制格式傳輸數據,而非http1.1文本格式,二進制格式在協議的解析和優化擴展上帶來了跟多的優勢和可能
        2)多路複用,相同host的請求可以共用一個socket連接
        3)壓縮頭信息(對消息頭採用Hpack進行壓縮傳輸,能夠節省消息頭佔用的網絡流量,
                    http1.1每次請求,都會攜帶大量冗餘的頭信息,浪費了很多寬帶資源)
        4)請求劃分優先級
        5)支持服務器端主動推送 
        6)保持與HTTP 1.1語義的向後兼容
 

 

長連接心跳的意義:不僅是告訴服務端連接還在   防止NAT超時纔是主要的

確認網絡狀態

 

錯誤重傳:TCP指數推幣,get請求可以隨意重傳,可能修改數據的請求(post,delect)要謹慎重試

 

短連接:HTTP請求數據是報文(類似字符串一樣的東西)  長連接:二進制流

 

 

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