iOS性能之HTTP2.0


在移動互聯網領域蓬勃發展的今天,APP的性能也成為各大公司重點關注的方向,該系列文章主要針對iOS的性能的幾個方面做一些研究。

  • 什么是HTTP2.0?

網上很容易搜到關於HTTP2.0的概念的文章,這里不再累述。

蘋果從iOS9開始支持HTTP2.0,對iOS開發人員來說,即是iOS9開始,NSURLSession可以支持HTTP2.0

因為蘋果已經打算廢棄NSURLConnection,所以NSURLConnection不能支持HTTP2.0

UIWebView也不能支持HTTP2.0(當然,如果你使用UIWebView,然后使用NSURLProtocol,在NSURLProtocol中使用NSURLSession,這樣也是可以支持HTTP2.0的),WKWebView是可以的。

  • HTTP2.0相對HTTP1.1的優勢是什么?

主要有幾點:

1. 相同的Host占用一個TCP鏈接

2. 請求可以設置優先級

3. 采用二進制協議,而不是之前的文本協議

4. 多路復用

5. 部壓縮

 

這幾點優勢里面,我個人認為最為重要的,就是多路復用頭部壓縮,正是這兩項優勢,讓請求的性能得到了極大的提升。

  • 多路復用

什么是多路復用呢?在HTTP1.1時代,一個TCP鏈接可以發送多個請求,但是需要排隊,一個一個的發送(遵循FIFO的原則),這就很容易產生阻塞(傳說中的head-of-line blocking),如下圖:

 

可以看到,相同的connectionId里面的多個請求,都是串行的(Timeline-Start time那一欄),所以,一旦有某個請求阻塞了,后面的請求都不能繼續進行。

到了HTTP2.0,在一個TCP鏈接中,請求不再需要排隊,而是輪詢發送的,如下圖:

 

相同的connectionid里面的多個請求,幾乎都是同時發起的(可以想象成單CPU,多線程的CPU輪詢機制),這樣性能就得到了極大提高

  • 頭部壓縮

這個概念比較好理解,現在APP的需求也是越來越復雜,導致了請求的頭部信息也越來越多(Cookie,請求參數等),動輒超過1k,2k,十分影響性能。而HTTP2.0會對請求頭和響應頭做壓縮以提升請求性能。

  • 什么是TCP鏈接?

前面有提到HTTP2.0對於一個Host會占用一個TCP鏈接,這里需要簡單介紹下TCP鏈接。

從底到高來看:

IP協議:對應於網絡層

TCP協議:對應於傳輸層

HTTP協議:對應於應用層

 

TCP在建立鏈接的過程中,需要經過三次握手, HTTP協議是建立在TCP協議之上的,不過HTTP是短鏈接,一旦請求結束,鏈接要被釋放,但是為了提升服務端於客戶端之間請求的效率(減少TCP建立鏈接的性能損耗),所以雖然HTTP鏈接被釋放了,但是底層TCP鏈接還在(可以用wireshark抓包看看)。

但是TCP鏈接也不是無限多,iOS的NSURLSession是分配的4個TCP鏈接,MAC是6個。

 

這里有兩篇比較全面的HTTP2.0的文章:

https://medium.com/apps-and-networking/http-2-makes-media-loading-3-15-times-faster-on-mobile-a455c3e68135#.kxd9z7eq4

 

http://www.floriangoessler.de/ios/2015/08/30/HTTP2-on-iOS.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM