1. 程式人生 > >http協議不同版本之間的對比(1.0 1.1 2.0)

http協議不同版本之間的對比(1.0 1.1 2.0)

http區別

http 1.0

  • 短連接
    每一個請求建立一個TCP連接,請求完成後立馬斷開連接。這將會導致2個問題:連接無法復用,head of line blocking
    連接無法復用會導致每次請求都經歷三次握手和慢啟動。三次握手在高延遲的場景下影響較明顯,慢啟動則對文件類大請求影響較大。head of line blocking會導致帶寬無法被充分利用,以及後續健康請求被阻塞。
    </br>
    http 1.1
    為解決HTTP 1.0 的痛點而產生。
  • 長連接
    通過http pipelining實現。多個http 請求可以復用一個TCP連接,服務器端按照FIFO原則來處理不同的Request
  • 增加connection header

    該header用來說明客戶端與服務器端TCP的連接方式,若connection為close則使用短連接,若connection為keep-alive則使用長連接
  • 身份認證
  • 狀態管理
  • Cache緩存等機制相關的請求頭和響應頭
  • 增加Host header

http 2.0

  • 多路復用 (Multiplexing)
    多路復用允許同時通過單一的 HTTP/2 連接發起多重的請求-響應消息。在 HTTP/1.1 協議中瀏覽器客戶端在同一時間,針對同一域名下的請求有一定數量限制。超過限制數目的請求會被阻塞。這也是為何一些站點會有多個靜態資源 CDN 域名的原因之一,拿 Twitter 為例,http://twimg.com,目的就是變相的解決瀏覽器針對同一域名的請求限制阻塞問題。而 HTTP/2 的多路復用(Multiplexing) 則允許同時通過單一的 HTTP/2 連接發起多重的請求-響應消息。因此 HTTP/2 可以很容易的去實現多流並行而不用依賴建立多個 TCP 連接,HTTP/2 把 HTTP 協議通信的基本單位縮小為一個一個的幀,這些幀對應著邏輯流中的消息。並行地在同一個 TCP 連接上雙向交換消息。
  • 二進制分幀
    HTTP/2在 應用層(HTTP/2)和傳輸層(TCP or UDP)之間增加一個二進制分幀層。在不改動 HTTP/1.x 的語義、方法、狀態碼、URI 以及首部字段的情況下, 解決了HTTP1.1 的性能限制,改進傳輸性能,實現低延遲和高吞吐量。在二進制分幀層中, HTTP/2 會將所有傳輸的信息分割為更小的消息和幀(frame),並對它們采用二進制格式的編碼 ,其中 HTTP1.x 的首部信息會被封裝到 HEADER frame,而相應的 Request Body 則封裝到 DATA frame 裏面。

HTTP/2 通信都在一個連接上完成,這個連接可以承載任意數量的雙向數據流。在過去, HTTP 性能優化的關鍵並不在於高帶寬,而是低延遲。TCP 連接會隨著時間進行自我調諧,起初會限制連接的最大速度,如果數據成功傳輸,會隨著時間的推移提高傳輸的速度。這種調諧則被稱為 TCP 慢啟動。由於這種原因,讓原本就具有突發性和短時性的 HTTP 連接變的十分低效。HTTP/2 通過讓所有數據流共用同一個連接,可以更有效地使用 TCP 連接,讓高帶寬也能真正的服務於 HTTP 的性能提升。

這種單連接多資源的方式,減少服務端的鏈接壓力,內存占用更少,連接吞吐量更大;而且由於 TCP 連接的減少而使網絡擁塞狀況得以改善,同時慢啟動時間的減少,使擁塞和丟包恢復速度更快。

  • 首部壓縮(Header Compression)

HTTP/1.1並不支持 HTTP 首部壓縮,為此 SPDY 和 HTTP/2 應運而生, SPDY 使用的是通用的DEFLATE 算法,而 HTTP/2 則使用了專門為首部壓縮而設計的 HPACK 算法。
* 服務端推送(Server Push)

服務端推送是一種在客戶端請求之前發送數據的機制。在 HTTP/2 中,服務器可以對客戶端的一個請求發送多個響應。Server Push 讓 HTTP1.x 時代使用內嵌資源的優化手段變得沒有意義;如果一個請求是由你的主頁發起的,服務器很可能會響應主頁內容、logo 以及樣式表,因為它知道客戶端會用到這些東西。這相當於在一個 HTML 文檔內集合了所有的資源,不過與之相比,服務器推送還有一個很大的優勢:可以緩存!也讓在遵循同源的情況下,不同頁面之間可以共享緩存資源成為可能。

http協議不同版本之間的對比(1.0 1.1 2.0)