因為語義上它與 HTTP/1 相容,所以報文還是由“Header+Body”構成的,但在請求傳送 前,必須要用“HPACK”演算法來壓縮頭部資料。頭部資料壓縮之後,HTTP/2 就要把報文拆成二進位制幀準備傳送。
頭部壓縮
HTTP/1 裡可以用頭欄位“Content-Encoding”指定 Body 的編碼方式,比如用 gzip 壓縮來節約頻寬,但報文的另一個組成部分——Header 卻被無視了,沒有針對它的優化手段。
http2在客戶端和伺服器兩端建立“字典”,用索引號表示重複的字串,這樣重複使用的欄位就不用每次都寫入請求頭中。
另外還釆用哈夫曼編碼來壓縮整數和字串。
二進位制資料
HTTP/1 裡純文字形式的報文了,它的優點是“一目瞭然”,用最簡 單的工具就可以開發除錯,非常方便。 但 HTTP/2 不再使用肉眼可見的 ASCII 碼,而是向下層的 TCP/IP 協議“靠攏”,全面採用二進位制格式。http2把原來的“Header+Body”的訊息“打散”為 數個小片的二進位制“幀”(Frame),用“HEADERS”幀存放頭資料、“DATA”幀存放 實體資料。同時這些“幀”(Frame)會包含一個序列號和流ID.流ID可以標識某個請求-響應。
虛擬的“流”
HTTP/2 為此定義了一個“流”(Stream)的概念,它是二進位制幀的雙向傳輸序列,同一 個訊息往返的幀會分配一個唯一的流 ID。也就是說一個請求-響應中,所有幀(Frane)都是同一個流ID.而這些資料幀按照次序組裝起來就是 HTTP/1 裡的 請求報文和響應報文。
由於流的存在,在一個tcp連線中可以同時傳輸多個“流”(“多路複用),而且多個請求-響應的順序也可以打亂,避免了“隊頭阻塞“問題。
HTTP/2 還在一定程度上改變了傳統的“請求 - 應答”工作模式,伺服器不再是完全被動地 響應請求,也可以新建“流”主動向客戶端傳送訊息。比如,在瀏覽器剛請求 HTML 的時 候就提前把可能會用到的 JS、CSS 檔案發給客戶端,減少等待的延遲,這被稱為“伺服器 推送”(Server Push,也叫 Cache Push)。
強化安全
加密版本的 HTTP/2 在安全方面做了強化,要求下層的通訊協議必須是 TLS1.2 以上,還要支援前向安全和 SNI,並且把幾百個弱密碼套件列入了“黑名單”,比 如 DES、RC4、CBC、SHA-1 都不能在 HTTP/2 裡使用,相當於底層用的 是“TLS1.25”。
nginx如何升級到http2
如果nginx已經配置了ssl,只需要在 server 配置裡再多加一個引數就可以搞定了,在listen 加上http2即可。
server {
listen 443 ssl http2;
server_name www.xxx.net;
ssl_certificate xxx.crt;
ssl_certificate_key xxx.key;
本作品採用《CC 協議》,轉載必須註明作者和本文連結