iOS效能之HTTP2.0,ioshttp2.0
在移動互連網領域蓬勃發展的今天,APP的效能也成為各大公司重點關注的方向,該系列文章主要針對iOS的效能的幾個方面做一些研究。
網上很容易搜到關於HTTP2.0的概念的文章,這裡不再累述。
蘋果從iOS9開始支援HTTP2.0,對iOS開發人員來說,即是iOS9開始,NSURLSession可以支援HTTP2.0。
因為蘋果已經打算廢棄NSURLConnection,所以NSURLConnection不能支援HTTP2.0。
UIWebView也不能支援HTTP2.0(當然,如果你使用UIWebView,然後使用NSURLProtocol,在NSURLProtocol中使用NSURLSession,這樣也是可以支援HTTP2.0的),WKWebView是可以的。
主要有幾點:
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會對要求標頭和回應標頭做壓縮以提升請求效能。
前面有提到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