從 HTTP1.x 到 HTTP 2.0 變遷

前言

互聯網世界中,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主要改動

  1. 新的二進制格式
    http1.x誕生的時候使用明文協議,三部分組成:start line, header, body。協議解析,基于文本的,基于文本的協議解析存在缺陷,需要考慮的場景很多。

    http2.0 采用二進制格式,實現方便且健壯。http2.0的格式定義更接近tcp層的方式。

    • length:定義了整個frame的開始到結束。
    • type:定義frame的類型(一共10種)
    • flags: 用bit位定義一些重要的參數
    • stream ID 用作流控制
    • payload: request的正文
  2. 連接共享(多路復用)

    使用上面提到的Stream id用來作連接共享機制的。一個request對應一個stream并分配一個id,接收方可以根據id區分frame歸屬哪個不同的frame。可以調整優先級,并且可以動態調整。

  3. header壓縮

  4. 重置連接表現更好

  5. Server Push

    http2.0能通過push方式將客戶端需要的內容預先推送出去,所以也叫“cache push”.

  6. 流量控制(Flow control)

  7. 更安全的SSL

移動端的HTTP現狀

iOS下http現狀

iOS系統從iOS8開始通過NSURLSession來支持SPDY,在iOS9+開始支持HTTP2.0.新版本的ATS默認支持https進行網絡傳輸。

Android下HTTP現狀

http2.0只能在新系統中支持,SPDY作為過渡方案存在。

結束

HTTP1.x到SPDY,再到HTTP2.0的一些主要變遷技術點。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容