HTTP/2 協議常見疑問(譯)

爲何修訂 HTTP 協議

HTTP/1.1 應用於 Web 已有15年的歷史,協議的缺陷和不足開始顯現。nginx

對比過去,如今的 web 頁面須要加載更多資源,HTTP1.x 協議規定一個 TCP connection 不能並行發起多個 request 請求,這使得頁面在快速加載大量資源時變得困難。web

爲處理上述問題,HTTP1.1 協議容許瀏覽器使用多個 TCP connection 來並行發起多個 request 請求。這種處理方式存在缺陷,使用太多的 connection 會拔苗助長(TCP 擁塞控制會致使網絡效率低下),同時也會出現不公平現象(瀏覽器都設法佔用超出它本該分配的網絡資源)。瀏覽器

HTTP/2 跟 SPDY 有什麼關係

在 SPDY 協議被 Mozilla 和 nginx 等廠商實現後,相對於 HTTP/1.x 展示出了明顯的性能提高,這時 HTTP/2 協議的討論和指定開始提上議程。服務器

通過一輪提議和投票,最被選擇了 SPDY/2 做爲 HTTP/2 協議的基礎。此後,在工做組和實現者的討論下 HTTP/2 協議又作出了一系列變動。在這個過程當中,SPDY 協議的核心開發者參與了 HTTP/2 協議的開發,這其中包括 Mike Belshe 和 Roberto Peon。網絡

2015年9月,Google 宣佈爲了支持 HTTP/2 協議,未來再也不支持 SPDY 協議。併發

HTTP/2 跟 HTTP/1.x 的區別

整體來講區別有如下幾點:工具

  • 使用二進制來代替文本格式
  • 使用多路複用來代替有序和阻塞
  • 使用一個 connection 來處理並行請求
  • 使用 header 壓縮來減少 header 大小
  • 容許服務端使用 push 來預先推送客戶端須要的 cache

爲何 HTTP/2 是二進制的

二進制協議解析效率更高,更節省網絡資源,相對於 HTTP/1.1 協議使用文本格式的空格或空行來解析數據,二進制協議更不容易出錯性能

例如, HTTP/1.1 定義了四種不一樣解析消息的方式,HTTP/2 只有一種解析方式網站

雖然 HTTP/2 不能經過 telnet 來使用,可是可使用 Wireshark 等工具設計

爲何 HTTP/2 是多路複用

HTTP/1.x 存在所謂的「頭部阻塞」問題,也就是每一個 TCP connection 只能同時發起一個 request 請求。

HTTP/1.1 嘗試使用 pipelining 來解決這個問題,這沒有徹底陳述清楚該問題(一個大的或者慢的響應會阻塞這以後的其餘請求)。同時 pipelining 被證實很難部署,由於許多中間件和服務器不能正確的處理它。

這使得客戶只能經過猜想肯定與站點的哪一個鏈接發起請求,使用實際可用鏈接數的10倍來加載頁面是很常見的,這會嚴重影響性能,一般會致使請求阻塞。

多路複用容許多個請求和響應的 message 在一個 TCP 鏈接上並行處理來解決這個問題,甚至可讓不一樣 message 的內容同時混合在一塊兒處理,也就是客戶端可使用單個 TCP connection 來加載完整的頁面

爲何只有一個 TCP connection

使用 HTTP/1,瀏覽器能夠在每一個域名上打開四個到八個鏈接。不少網站同時使用多個子域,這樣加載單個頁面會打開多達30個 TCP 鏈接。

一個應用併發使用太多的鏈接打破了構建 TCP 協議的基礎設計,每一個鏈接會響應大量數據讓網絡的緩衝區溢出,從而觸發 TCP 的擁塞控制和 TCP 重傳機制

相關文章
相關標籤/搜索