HTTP 1.0
在HTTP1.0版本,存在一個問題:建立的一次連接,只有包含一個請求響應(也就是對應一個資源)。
如果有多個請求,那么效率就會很低。
HTTP 1.1
在HTTP 1.1 中 connection: keep-alive 是默認開啟的。
改進一:連接復用
一次連接,可以有多個請求響應(對應多個資源)。
改進二:管線化傳輸(pipeline)
下一次的請求不需要等待上一個響應來之后再發送。
但響應的順序是不變的,FIFO(先進先出)
依舊存在的問題:
- 請求是按次序的,后來者需要排隊等待。
- 請求頭大多類似,重復傳輸浪費資源。
- 同一域名的瀏覽器有最大並行請求限制。
HTTP 2.0
多路復用
由於 HTTP 1.X 是基於文本的,因為是文本,就導致了它必須是個整體,在傳輸是不可切割的,只能整體去傳。
但 HTTP 2.0 是基於二進制流的。有兩個非常重要的概念,分別是幀(frame)和流(stream)
- 幀代表着最小的數據單位,每個幀會標識出該幀屬於哪個流。
- 流就是多個幀組成的數據流。
將 HTTP 消息分解為獨立的幀,交錯發送,然后在另一端重新組裝。
- 並行交錯地發送多個請求,請求之間互不影響。
- 並行交錯地發送多個響應,響應之間互不干擾。
- 使用一個連接並行發送多個請求和響應。
簡單的來說: 在同一個TCP連接中,同一時刻可以發送多個請求和響應,且不用按照順序一一對應。
之前是同一個連接只能用一次, 如果開啟了keep-alive,雖然可以用多次,但是同一時刻只能有一個HTTP請求。