http1 http2 發展與特性

2021-07-23 06:28:29 字數 3416 閱讀 7697

http協議已經被廣泛應用在web應用中,常用於一下幾種場景:

http協議本身就是基於請求/應答模式的,只要伺服器響應,本次http連線就結束了,但這不意味著tcp通道關閉。

所謂的長連線通常是指tcp連線,tcp通道連線客戶端和伺服器端,可以保持一段時間不關閉。

http1.1引入了長連線,使用connection:keep-alive首部欄位來保證tcp通道長時間存在(需要服務端和客戶端同時設定)。

長連線的tcp通道客戶端一般不會主動關閉,服務端會自動關閉在一段時間內(可設定)未進行使用的tcp通道連線(超時處理)。

http1.0有兩個很大的缺點:

在tcp通道上,http1.0不支援長連線,每次的請求/響應結束後,tcp通道立即關閉。

因此,一般pc端會向乙個網域名稱同時建立6~8個連線,手機端則是4~6個,會導致延遲和開銷增大。

此外,隊首阻塞有兩個層面。

http應用層隊首阻塞:http1協議規定嚴格按照優先順序進行請求傳送,意味著低優先順序請求的傳送必須等待高優先順序響應後進行。

tcp傳輸層隊首阻塞:tcp要求分組嚴格按照順序交付,乙個分組未收到,就會阻塞後續的所有高序號分組。直到重傳那個丟失的分組。

http1.1已經被廣泛使用。在http1.0的基礎上,新增了以下功能:

http1.1的新增特性解決了http1.0的兩個大難題,實現了tcp通道連線復用,並支援多個請求同時傳送,互不影響。

持久的tcp通道並不能解決所有問題,同一時間一條tcp通道只能有乙個請求/應答。

客戶端無法再通過tcp通道是否關閉來判斷響應傳送完成,因此響應中必須包含content-length首部來輔助瀏覽器判斷一次響應的結束。

瀏覽器會根據content-length的值來判斷響應是否傳送完成,若該首部屬性的值過大,則會一直處於pending狀態,過小則會對響應體進行擷取。

雖然http1.1實現了tcp通道在一段時間內的復用,這對於pc端很適用,但對於移動端則不然。

移動端的請求比較分散,時間跨度大,因此移動端往往在應用層做處理,常常使用一下幾種方式:

長輪詢是實現http層面(應用)的偽長連線,並沒有在模式上進行改變,仍然是請求/應答模式,能夠在很大的時間跨度上保持長連線

客戶端向伺服器傳送乙個請求

伺服器端不是立刻響應處理,而是保持http會話

伺服器端需要推送訊息時進行響應

客戶端接受響應並再次傳送乙個請求

缺點:短輪詢與長輪詢不同處在於,客戶端向伺服器傳送請求後,伺服器會立刻返回響應,

http流這種處理方式與長輪詢類似,不同之處在於伺服器推送響應後,不會停止這次http會話,而是繼續保持阻塞狀態,等待下一次推送或超時(超時後通知客戶端重新傳送請求)。

http流的方式處理時,利用ajax的readystate == 3來判斷伺服器是否有推送資料,進行讀取,但在ie中,readystate ==3時不能夠讀取資料,因此ie不支援http流的方式。

http流的實現方式很簡單,是通過在響應頭新增首部transfer-encoding: chunked,該首部的值chunked會使報文採用分塊傳輸。

報文的分塊傳輸不需要關閉tcp通道,也不用content-length首部來輔助瀏覽器判斷響應的結果。

分塊傳輸是針對響應體,服務端可以間斷的傳送響應體,每次響應都會包含具體位元組長度。

這裡有篇文章專門介紹了chunked分段傳輸。

web socket 是h5推出的新技術,基於tcp協議。

web socket通訊只使用了一次http請求,建立tcp通道,利用http響應的101狀態碼來觸發協議切換,公升級到web socket自身協議,後續的請求和響應都是遵循web socket協議。

http1.0和http1.1仍然有很多的問題,http2.0目標便是解決http1.1版本中的兩個問題:

為了實現低延遲和高吞吐量,http2增加了了二進位制分幀層和首部壓縮技術。

在http應用層,加入了一層二進位制分幀層,在http層使用二進位制對http請求進行編碼。

傳輸層從應用層獲取到的將是純二進位制,原先http1的乙個請求文字會被分割成多個二進位制幀傳遞給傳輸層。

二進位制分幀層將乙個請求切成碎片(幀,http2.0網路傳輸的最小單位)打亂傳送,解決了隊首阻塞的問題。

二進位制分幀使用二進位制格式來替換原有的文字格式,在解析和差錯檢測上更加的精準方便(不用考慮換行、空格等)。

由於http是無狀態的,因此每次請求/響應都有首部來對所傳輸的資源進行描述。

在http1中,http層是以文字進行傳輸的,首部加上cookie可以達到上千位元組。

http2採用了首部壓縮,目的是減少每次請求的請求頭大小,提公升了效能,節約開銷。

瀏覽器和伺服器同時維護一張首部表,裡面會記錄一些常用鍵值對(使用者**、可接受的**型別等),擁有唯一序號來與之對應。

每次傳送請求時,會從首部表中比較常用鍵值對,以唯一序號來代替,同時會將該請求首部(首部表以外的屬性)與上一次的請求進行比較,只傳送有差異性的首部屬性。

最終確定出來需要傳送的首部,會以哈夫曼編碼進行再次壓縮。

二進位制分幀層將請求和響應分為了乙個又乙個的幀,這些幀在乙個tcp通道中是被打亂傳輸的。

為了能夠完整準確的在客戶端和服務端將其重新拼接,http2.0引入了流(stream)的概念,變相的實現了多路復用

將乙個tcp通道在邏輯上切割成了多個並行存在的流,乙個流只服務於乙個請求/應答,而在實際tcp傳輸中,其仍然是打亂傳送的。

參考博文

http1 和 http2 的區別

網路延遲問題主要由於隊頭阻塞 head of line blocking 導致頻寬無法被充分利用。隊頭阻塞是指當順序傳送的請求序列中的乙個請求因為某種原因被阻塞時,在後面排隊的所有請求也一併被阻塞,會導致客戶端遲遲收不到資料。由於報文header一般會攜帶 user agent cookie acc...

HTTP1和HTTP2的區別

缺陷 執行緒阻塞,在同一時間,同一網域名稱的請求有一定數量限制,超過限制數目的請求會被阻塞。2.http1.0 短連線 缺陷 瀏覽器與伺服器只保持短暫的連線,瀏覽器的每次請求都需要與伺服器建立乙個tcp連線 tcp連線的新建成本很高,因為需要客戶端和伺服器三次握手 伺服器完成請求處理後立即斷開tcp...

深入理解http1 x http 2和https

持久連線 管道機制 分塊傳輸編碼 新增請求方式 1.二進位制協議 2.完全多路復用 3.報頭壓縮 4.伺服器推送 1 對資料進行加密,並建立乙個資訊保安通道,來保證傳輸過程中的資料安全 2 對 伺服器進行真實身份認證。1 https是加密傳輸協議,http是名文傳輸協議 2 https需要用到ssl...