[http] 有關http2的主要知識點整理
一 介紹
[classic_tong @ http://www.rzrgm.cn/hugetong/p/12694322.html]
為了解決HTTP1的性能問題,HTTP2出現了。
http1有什么問題
1. 半雙工的。請求與回應一來一回,彼此等待對方到底。
2. 不能并發,一個TCP隧道只能處理一個 請求回應 隊列。
3. 隧道利用率低。大部分TCP連接,握手之后只通訊一次就結束了。
http2有什么新的
1. 在傳輸層與應用層直接,增加分幀層。
2. 增加流控制。
3. 增加服務器推送。
4. 增加頭壓縮。
二 分幀層
分幀層功能
1 分幀層使半雙工變成了全雙工。
2 分幀層在傳輸層之上實現了多條全雙工隧道。
3 隧道支持優先級。
分幀層模型
為了實現多個全雙工隧道的功能,引入以下三個概念:
1. 流 stream
2. 消息 message
3. 幀 frame
參考: https://developers.google.com/web/fundamentals/performance/http2?hl=zh-cn
三 包格式
應用層,也就是分幀層之上的一層。在邏輯結構和內容上,與http1相同。具體實現上有所差別。
幀結構
+-----------------------------------------------+
| Length (24) |
+---------------+---------------+---------------+
| Type (8) | Flags (8) |
+-+-------------+---------------+-------------------------------+
|R| Stream Identifier (31) |
+=+=============================================================+
| Frame Payload (0...) ...
+---------------------------------------------------------------+
詳見: https://tools.ietf.org/html/rfc7540#section-4.3
四 頭壓縮
HEADER就是HTTP中的HEADER,它是有壓縮的。
第一步,把常用的header name + value 用數組進行了替換,使用查表的方式進行約定,
表在這里: https://tools.ietf.org/html/rfc7541#appendix-A
后七個bit查表,第一個bit恒為1
0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ | 1 | Index (7+) | +---+---------------------------+
表中沒有約定的內容,仍然使用ascii碼的形式。
第二步,使用哈夫曼編碼進行字符壓縮。當然,其實也可以直接ascii碼,說的有點亂,詳見:https://tools.ietf.org/html/rfc7541#section-5.2
有三種情況:with indexing, without indexing, and never indexed, 格式類似,但是不完全相同。
第一種情況的格式是這樣的:
0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ | 0 | 1 | Index (6+) | +---+---+-----------------------+ | H | Value Length (7+) | +---+---------------------------+ | Value String (Length octets) | +-------------------------------+
要點:1 第二個bit是1代表當前這種情況。2 第9個bit是1代表后邊的內容使用哈夫曼編碼,如果是0直接使用ascii碼。
舉個例子: server: nginx
這個例子里,第三到第八個bit,查前文“第一步”里面的表,可以得到代表server的index值。填進去,在這里,它是54,加上第二個bit的1,16進制就是0x76。
如下圖:

如圖,0x76 84 aa 63 55 e7
76分析過了。84第一個bit是1,代表使用哈夫曼編碼,去掉1剩下的4代表長度4個字節。后邊的是個字節,就是哈夫曼編碼。
可以通過查表得到,是另一張表,在這:https://tools.ietf.org/html/rfc7541#appendix-B
字符串nginx查表結果二進制:(后邊的兩個 11 是padding)

我們的例子里的二進制,是這樣的。兩個對照,是一致的。

以上。header的編碼就是醬紫。
五 舉個例子
http2c.pcap
使用nginx + hghttp2工具實驗,抓到的包,截圖在這里:

六 與SPDY的區別
1 SPDY是用控制與數據兩種幀類型,HTTP2只使用一種。
2 HTTP2使用哈夫曼編碼壓縮,SPDY使用基于流的壓縮。
來自wiki:https://en.wikipedia.org/wiki/HTTP/2#Genesis_in_and_later_differences_from_SPDY
七 完
[classic_tong @ http://www.rzrgm.cn/hugetong/p/12694322.html]
浙公網安備 33010602011771號