http2 協議

http2 協議

HTTP/2 源自 SPDY/2,正式版http2規格標準叫做RFC 7540,發布于2015年5月15日。

HTTP/2 跟 SPDY 仍有不同的地方,主要是以下兩點:

  1. HTTP/2 支持明文 HTTP 傳輸,而 SPDY 強制使用 HTTPS

  2. HTTP/2 消息頭的壓縮算法采用 HPACK,而非 SPDY 采用的 DELEFT

http2 特點

http2 性能,http2 demo

  • HTTP/2's binary framing layer

  • Streams, messages, and frames

  • Request and response multiplexing

  • Stream prioritization

  • One connection per origin

  • Flow control

  • Server push

  • Header compression

(1)二進制

HTTP/2 采用二進制格式傳輸數據,而非 HTTP/1.x 的文本格式。二進制協議解析起來更高效。

(2)二進制格式

HTTP/1 的請求和響應報文,都是由起始行、首部和實體正文(可選)組成,各部分之間以文本換行符分隔。

HTTP/2 將請求和響應數據分割為更小的幀,并對它們采用二進制編碼。

幀(Frame):HTTP/2 數據通信的最小單位。

消息(Message):指 HTTP/2 中邏輯上的 HTTP 消息。例如請求和響應等,消息由一個或多個幀組成

流(Stream):存在于連接中的一個虛擬通道。流可以承載雙向消息,每個流都有一個唯一的整數 ID。

HTTP/2 中,同域名下所有通信都在單個連接上完成,這個連接可以承載任意數量的雙向數據流。每個數據流都以消息的形式發送,而消息又由一個或多個幀組成。多個幀之間可以亂序發送,因為根據幀首部的流標識可以重新組裝。

Frame 是 HTTP/2 二進制格式的基礎,Frame 的基本格式如下

+-----------------------------------------------+
|                 Length (24)                   |
+---------------+---------------+---------------+
|   Type (8)    |   Flags (8)   |
+-+-------------+---------------+-------------------------------+
|R|                 Stream Identifier (31)                      |
+=+=============================================================+
|                   Frame Payload (0...)                      ...
+---------------------------------------------------------------+

字段含義可查看協議

http2.png

(3)多路復用

HTTP/1.X 存在線端阻塞(head-of-line blocking)的問題。HTTP/1.1 試過用流水線(pipelining)來解決這個問題, 但是效果并不理想(數據量較大或者速度較慢的響應, 會阻礙排在他后面的請求)。HTTP 管道技術無法大規模使用。

多路復用,代替原來的序列和阻塞機制。就是所有的請求都是通過一個 TCP連接并發完成。流支持優先級流量控制

HTTP/2 的多路復用特性,使得可以在一個連接上同時打開多個流,雙向傳輸數據。每次請求/響應使用不同的 Stream ID。通過 Stream ID 標識,所有的請求和響應都同時跑在一條 TCP 鏈接上。 當流并發時,就會涉及到流的優先級和依賴。優先級高的流會被優先發送。圖片請求的優先級要低于 CSS 和 SCRIPT,這個設計可以確保重要的東西可以被優先加載完。http2上面每個流都擁有自己的公示的流量窗口,它可以限制另一端發送數據。

(4)頭壓縮

HTTP 1.1請求的大小變得越來越大,有時甚至會大于TCP窗口的初始大小,這會嚴重拖累發送請求的速度。因為它們需要等待帶著ACK的響應回來以后,才能繼續被發送。

HTTP/2 對消息頭采用 HPACK (專為http2頭部設計的壓縮格式)進行壓縮傳輸,能夠節省消息頭占用的網絡的流量。而 HTTP/1.x 每次請求,都會攜帶大量冗余頭信息,浪費了很多帶寬資源。

(5)服務端推送

服務端可以在發送頁面 HTML 時主動推送其它資源,而不用等到瀏覽器解析到相應位置,發起請求再響應。例如服務端可以主動把 JS 和 CSS 文件推送給客戶端,而不需要客戶端解析 HTML 再發送這些請求。

服務端可以主動推送,客戶端也有權利選擇接收與否。如果服務端推送的資源已經被瀏覽器緩存過,瀏覽器可以通過發送 RST_STREAM 幀來拒收。

瀏覽器和web服務支持情況

http2 支持清單

安裝部署

從 Nginx 1.9.5 開始,http_v2_module 已經替換了 ngx_http_spdy_module,安裝版本用1.10.1

nginx

./configure --with-http_v2_module

mac

brew options nginx
brew install nginx --with-http2

配置https

HTTP/2 協議本身并沒有要求必須基于 TLS 部署,但是 Chrome 和 Firefox 均表示只支持 HTTP/2 Over TLS。一方面更安全,希望保護以及尊重用戶的隱私,一方面利用 TLS 的加密機制可以更好地穿透網絡中間節點。需要先配置https。

# 創建一個私鑰文件:

openssl genrsa -des3 -out server.key 1024

openssl req -new -key server.key -out server.csr

openssl rsa -in server.key -out server_nopass.key

# 結合密鑰和證書生成請求,創建一個自簽署的CA證書

openssl req -new -x509 -days 3650 -key server_nopass.key -out server.crt

配置nginx

server
{
    listen 443 ssl http2;
    server_name  www.kailian.com;
    index index.php index.html;
    root  /data/web/www;
    ssl on;
    ssl_certificate /usr/local/etc/nginx/server.crt;
    ssl_certificate_key /usr/local/etc/nginx/server_nopass.key;
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
    keepalive_timeout 70;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m; 

    charset utf-8;
    location ~ .*\.php$
    {
        include fastcgi.conf;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
    }

}

測試

chrome插件

ssllabs查看https配置是否夠快

在 Chrome 地址欄輸入chrome://net-internals/#http2,打開 Chrome 自帶的 HTTP/2 查看工具,可查看 HTTP/2 幀信息

Wireshark抓包查看

相關資料

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容