在移動互聯網領域蓬勃發展的今天,APP的性能也成為各大公司重點關註的方向,該系列文章主要針對iOS的性能的幾個方面做一些研究。 什麼是HTTP2.0? 什麼是HTTP2.0? 網上很容易搜到關於HTTP2.0的概念的文章,這裡不再累述。 蘋果從iOS9開始支持HTTP2.0,對iOS開發人員來說,即 ...
在移動互聯網領域蓬勃發展的今天,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的文章:
http://www.floriangoessler.de/ios/2015/08/30/HTTP2-on-iOS.html