h2 的幀
h2 的傳輸過程中最重要的角色就是幀了。
h2 的其他相關(guān)文章
深入 HTTP2(幀,消息,流)
H2 升級前的調(diào)研

標準幀頭部
-
Length: 代表整個 frame 的長度,用一個 24 位無符號整數(shù)表示
但是這不意味著就能處理 2^24 16M大小的幀,一般是默認只支持2^16 16k以下的幀,而2^16 - 2^24 16M 的幀 需要接收端公布自己可以處理這么大的幀,需要在 SETTINGS_MAX_FRAME_SIZE 幀中告知。
-
Type: 定義 frame 的類型。幀類型決定了幀主體的格式和語義,如果 type 為 unknown 應該忽略或拋棄。
| 幀類型 | 編碼類型 | 用途 |
|---|---|---|
| DATA | 0x0 | 傳遞HTTP包體 |
| HEADERS | 0x1 | 傳遞HTTP包頭 |
| PRIORITY | 0x2 | 指定Stream 流的優(yōu)先級 |
| RST_STREAM | 0x3 | 終止Stream流 |
| SETTINGS | 0x4 | 修改連接或者Stream流的配置 |
| PUSH_PROMISE | 0x5 | 服務端推送資源時描述請求的幀 |
| PING | 0x6 | 心跳監(jiān)測兼具測量RTT的功能 |
| GOAWAY | 0x7 | 優(yōu)雅的終止錯誤或通知錯誤 |
| WINDOW_UPDATE | 0x8 | 實現(xiàn)流量控制 |
| CONTINUATION | 0x9 | 傳遞較大HTTP頭部時的持續(xù)幀 |
-
Flags:是為幀類型相關(guān)而預留的布爾標識。標識對于不同的幀類型賦予了不同的語義。
在HEADER幀中。(注意不同的幀中,F(xiàn)lags不一樣)
HEADER 中的 Flags R: 是一個保留的比特位。這個比特的語義沒有定義,發(fā)送時它必須被設置為 (0x0), 接收時需要忽略。Frame Payload: 是主體內(nèi)容,由幀類型決定
SETTING 幀
SETTING幀只運行在 0 號流上。SETTING幀不是協(xié)商,而是通知。

SETTING
幀類型
- SETTINGS_HEADER_TABLE_SIZE (0x1): 通知對端索引表的最大尺寸(單位字節(jié),初始 4096 字節(jié))用于解碼header塊的header壓縮表的最大尺寸。
- SETTINGS_ENABLE_PUSH (0x2): Value設置為 0 時可禁用服務器推送功能,1 表示啟用推送功能。如果禁用對端就不能發(fā)送PUSH_PROMISE 幀,如果客戶端收到PUSH_PROMISE 就視為PROTOCOL_ERROR 的連接錯誤。
- SETTINGS_MAX_CONCURRENT_STREAMS (0x3): 告訴接收端允許的最大并發(fā)流數(shù)量。
- SETTINGS_INITIAL_WINDOW_SIZE (0x4): 聲明發(fā)送端的窗口大小,用于Stream級別流控,初始值2^16-1 (65,535)
字節(jié) - SETTINGS_MAX_FRAME_SIZE (0x5):設置幀的最大大小,初始值 2^14 (16,384)字節(jié)
- SETTINGS_MAX_HEADER_LIST_SIZE (0x6): 知會對端頭部索引表的最大尺寸,單位字節(jié),基于未壓縮前的頭部
