?
?
在HTTP0.9中,只有GET方法,沒有請求頭headers,沒有狀態碼,只能用于傳輸HTML文件。
?
到了HTTP1.0(1996),HTTP1.0傳輸請求頭,有狀態碼,并且新增了POST和HEAD方法。
HTTP1.0中,使用短連接,當服務器返回數據之后,就會斷開連接,每次發送請求,都要重新建立連接(三次握手)然后傳輸數據,然后再斷開連接。如果一個HTML文件中有多個CSS JS等文件的請求,就會建立多個連接。串行請求。
?
到了HTTP1.1(1997年),HTTP1.1默認開啟長連接。每次一個請求處理完成后連接不會直接斷開,一次通信中,可以發送多個請求,沒有不斷建立和斷開連接的開銷。它允許瀏覽器端不必等待上一個請求響應,就可以發送下一個請求。但是服務器端必須按順序響應并返回。
服務器發送響應時,可以不等整個響應完畢再返回,可以返回小的響應塊,這可能會加快初始頁面的呈現速度。
HTTP1.1還增加了cache-control緩存機制,ETag、If-Modified-Since。
但HTTP1.1存在隊頭阻塞的問題,如果一個請求的響應需要很久,后續的響應就必須等待上一個響應返回才能處理。
?
HTTP2(2015)引入了二進制幀,多路復用,首部壓縮和服務器推送。
二進制幀:HTTP2采用二進制傳輸數據,而非文本格式,更加高效。
將請求和響應數據分割為更小的幀,并且它們采用二進制編碼。每個數據流都以消息的形式發送,而消息又由一個或多個幀組成。多個幀之間可以亂序發送,根據幀首部的流標識可以重新組裝,這也是多路復用同時發送數據的實現條件。
多路復用:允許一個TCP連接中,同時發送多個請求和多個響應。響應不用按照順序一一對應。避免了隊頭堵塞。
首部壓縮/頭部壓縮:建立頭部索引表,將傳輸過的頭部存入表中,下次傳輸時,如果表中有這個頭部,就傳輸索引號,否則傳輸請求頭。
服務器推送:服務器向客戶端建立連接。一般請求都是客戶端向服務器發起,但有了服務器推送,服務器端可以告知客戶端還有信息要傳輸,客戶端不關閉連接,而是待機等待。
?