? 一、2015年, HTTP/2發布。
二、二進制協議
HTTP/2是一個二進制協議,頭信息和數據體都是二進制,并且統稱為“幀”(frame),頭信息幀和數據幀。
二進制協議的一個好處是,可以定義額外的幀。HTTP/2定義了近10種幀,為將來的高級應用打好了基礎。
三、多工
HTTP/2復用TCP連接,在一個連接里,客戶端和瀏覽器都可以同時發送多個請求東或回應,而不用按照順序一一對應,這樣就避免了“隊頭堵塞”。
舉個例來說,在一個TCP連接里面,服務器同時收到了A請求和B請求,于是先回應A請求,結果發現處理過程非常耗時,這時就可以發送A請求已經處理好的部分,接著回應B請求,完成后,再發送A請求剩下的部分。這樣雙向的實時的通信就叫做多工(Multiplexing)。
四、數據流
因為HTTP/2的數據包是不按順序發送的,同一個連接里面連接的數據包,可能屬于不同的回應。因此必須要對數據包作標記,指出它屬于哪個回應。
HTTP/2將每個請求或回應的所有數據包稱為一個數據流(stream)。每個數據流都有獨一無二的編號。數據包發送的時候都必須標記數據流ID,用來區分它屬于哪個數據流。另外還規定,客戶端發出的數據流ID一律為奇數,服務器發出的一律為偶數。
數據流發送到一半的時候客戶端和服務端都可以發送信號(RST_STREAM幀),取消這個數據流。1.1版本取消數據流的唯一方法就是關閉TCP連接。這就是說HTTP/2可以取消某一次請求,同時保證TCP連接還打開著,可為其它請求所用。
客戶端還可以指定數據流的優先級,優先級越高,服務器就會越早回應。
五、頭信息壓縮
HTTP協議不 帶有狀態,每次請求都必須附上所有信息。所以,請求的很多字段都是重復的,比如 Cookie 和 User Agent , 一模一樣的內容,每次請求都必須附帶,這會浪費很多帶寬,也影響速度。
HTTP/2對這一點作了優化,引入了頭信息壓縮機制(header compression)。 一方面,頭信息使用 gzip 或 compress 壓縮后再發送;另一方面,客戶端和服務端同時維護一張頭信息表,所有字段都會存入這個表,生成一個索引號,以后就不發送同樣字段了,只發送索引號,這樣就提高速度了。
六、服務器推送
HTTP/2允許服務器未經請求,主動向客戶端發送資源,這叫做服務器推送(server push)。
常見場景是客戶端請求一個網頁,這個網頁里面包含很多靜態資源。正常情況下,客戶端必須收到網頁后,解析 HTML 源碼,發現有靜態資源再發出靜態資源請求。其實,服務器可以預期到客戶端請求網頁后,很可能會再請求靜態資源,所以就主動把這些靜態資源隨著網頁一起發送給客戶端了。
原文參見:程序員的那些事