前言
互聯網世界中,HTTP協議算是使用最廣泛的協議。最近Http2.0誕生再次使得互聯網技術成為關注的焦點。接下來我們一起看看關于HTTP的那些事。
HTTP
說道HTTP難免會提及TCP協議,HTTP是建立在TCP協議之上的,TCP協議作為傳輸層協議其實離應用層并不遠。
TCP協議的性能直接影響了HTTP:
- TCP建立連接時需要三次握手1.5個RTT
- 慢啟動(slow start)
目前,影響網路請求的兩個主要因素: 帶寬和延遲。隨著網絡基礎設施建設帶寬得到極大提升,大部分是延遲在影響響應速度。
HTTP 1.0 最大問題:
- 連接無法復用
- head-of-line blocking (隊頭阻塞)
連接無法復用會導致每次都需要進行三次握手和慢啟動。
head-of-line blocking 則會導致帶寬無法充分利用,以及后續健康請求阻塞。
解決連接無法復用問題
在HTTP 1.0協議里設置Connection: Keep-Alive
。可以在一定時間內復用連接。對于PC端瀏覽器來說效果明顯,對移動APP來說成效不大。
方案一: 基于TCP的長鏈接
基于TCP協議,使用TCP的Socket編程技術。 成熟方案如:Google的protobuf。
缺點:實現難度大,需要自己制定協議。
有點:信息的上報和推送變及時,減輕服務器壓力。
方案二: http long-polling
客戶端在初始狀態就會發送一個polling請求到服務器,服務器并不會馬上返回業務數據,而是等待有新的業務數據產生的時候再返回。
難度:鏈接增多會增加服務器壓力,移動網絡不穩定需要考慮重建鏈接,穩定性不好,需要業務數據過期機制。
方案三: http streaming
同long-polling不同的是,server并不會結束初始的streaming請求,而是持續的通過這個通道返回最新的業務數據。
方案四:web socket
優點:雙向的數據通道,提供了http所缺少的長連接功能。
缺點:較新,大部分瀏覽器不支持。
head-of-line blocking
http pipelining
缺點:只適用于http1.1,絕大部分http代理服務器不支持等
其他技術
- Spriting (圖片合并)
- Inlining (內容內嵌)
- Concatenation (文件合并)
- Domain Sharding (域名分片)
SPDY
為了解決http1.0和1.1存在的問題,Google在2012年提出了SPDY方案。
目標:
- 降低延遲,客戶單的單鏈接單請求,server的FIFO響應隊列都是延遲的大頭。
- http 最初是客戶端發請求,服務器響應,服務器無法主動push內容。
- 壓縮http header。
SPDY設計:
位于HTTP之下,TCP和SSL之上,兼容老版本,還可以使用已有的SSL功能。SPDY分為基礎功能和高級功能,基礎功能默認開啟,高級功能手動開啟。
基礎功能
- 多路復用(multiplexing)。多路復用通過多個請求stream共享一個tcp連接的方式。解決了隊頭阻塞,降低了延遲提高帶寬利用率。
- 請求優先級(request prioritization)。在多路復用的時候會出現關鍵請求被阻塞。SPDY 允許每次request設置優先級。
- header壓縮。壓縮率達到80%以上。
高級功能
- server推送(server push) 。開啟server push 之后,服務器通過
X-Associated-Content header
告知客戶端有新內容推送過來。 - server暗示(server hint) 。不推送,只提示有新內容。
HTTP 2.0
SPDY的誕生和表現說明了兩件事:
- 一是現有互聯網設施基礎和http協議廣泛使用的前提下,可以通過修改協議層來優化http1.x。
- 針對http1.x的修改業界反饋很好
優點: 多路復用,請求壓縮,優先級控制,server push等亮點。
HTTP2.0主要改動
-
新的二進制格式
http1.x誕生的時候使用明文協議,三部分組成:start line, header, body。協議解析,基于文本的,基于文本的協議解析存在缺陷,需要考慮的場景很多。http2.0 采用二進制格式,實現方便且健壯。http2.0的格式定義更接近tcp層的方式。
- length:定義了整個frame的開始到結束。
- type:定義frame的類型(一共10種)
- flags: 用bit位定義一些重要的參數
- stream ID 用作流控制
- payload: request的正文
-
連接共享(多路復用)
使用上面提到的Stream id用來作連接共享機制的。一個request對應一個stream并分配一個id,接收方可以根據id區分frame歸屬哪個不同的frame。可以調整優先級,并且可以動態調整。
header壓縮
重置連接表現更好
-
Server Push
http2.0能通過push方式將客戶端需要的內容預先推送出去,所以也叫“cache push”.
流量控制(Flow control)
更安全的SSL
移動端的HTTP現狀
iOS下http現狀
iOS系統從iOS8開始通過NSURLSession來支持SPDY,在iOS9+開始支持HTTP2.0.新版本的ATS默認支持https進行網絡傳輸。
Android下HTTP現狀
http2.0只能在新系統中支持,SPDY作為過渡方案存在。
結束
HTTP1.x到SPDY,再到HTTP2.0的一些主要變遷技術點。