h2 的幀
h2 的傳輸過程中最重要的角色就是幀了。
h2 的其他相關(guān)文章
深入 HTTP2(幀染乌,消息,流)
H2 升級前的調(diào)研
-
Length
: 代表整個 frame 的長度肝匆,用一個 24 位無符號整數(shù)表示
但是這不意味著就能處理 2^24 16M大小的幀,一般是默認(rèn)只支持2^16 16k以下的幀顺献,而2^16 - 2^24 16M 的幀 需要接收端公布自己可以處理這么大的幀旗国,需要在 SETTINGS_MAX_FRAME_SIZE 幀中告知。
-
Type
: 定義 frame 的類型注整。幀類型決定了幀主體的格式和語義能曾,如果 type 為 unknown 應(yīng)該忽略或拋棄。
幀類型 | 編碼類型 | 用途 |
---|---|---|
DATA | 0x0 | 傳遞HTTP包體 |
HEADERS | 0x1 | 傳遞HTTP包頭 |
PRIORITY | 0x2 | 指定Stream 流的優(yōu)先級 |
RST_STREAM | 0x3 | 終止Stream流 |
SETTINGS | 0x4 | 修改連接或者Stream流的配置 |
PUSH_PROMISE | 0x5 | 服務(wù)端推送資源時(shí)描述請求的幀 |
PING | 0x6 | 心跳監(jiān)測兼具測量RTT的功能 |
GOAWAY | 0x7 | 優(yōu)雅的終止錯誤或通知錯誤 |
WINDOW_UPDATE | 0x8 | 實(shí)現(xiàn)流量控制 |
CONTINUATION | 0x9 | 傳遞較大HTTP頭部時(shí)的持續(xù)幀 |
-
Flags
:是為幀類型相關(guān)而預(yù)留的布爾標(biāo)識肿轨。標(biāo)識對于不同的幀類型賦予了不同的語義寿冕。
在HEADER幀中。(注意不同的幀中萝招,F(xiàn)lags不一樣)
R
: 是一個保留的比特位蚂斤。這個比特的語義沒有定義,發(fā)送時(shí)它必須被設(shè)置為 (0x0), 接收時(shí)需要忽略槐沼。Frame Payload
: 是主體內(nèi)容曙蒸,由幀類型決定
SETTING 幀
SETTING幀只運(yùn)行在 0 號流上。SETTING幀不是協(xié)商岗钩,而是通知纽窟。
幀類型
- SETTINGS_HEADER_TABLE_SIZE (0x1): 通知對端索引表的最大尺寸(單位字節(jié),初始 4096 字節(jié))用于解碼header塊的header壓縮表的最大尺寸兼吓。
- SETTINGS_ENABLE_PUSH (0x2): Value設(shè)置為 0 時(shí)可禁用服務(wù)器推送功能臂港,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):設(shè)置幀的最大大小,初始值 2^14 (16,384)字節(jié)
- SETTINGS_MAX_HEADER_LIST_SIZE (0x6): 知會對端頭部索引表的最大尺寸筋遭,單位字節(jié)打颤,基于未壓縮前的頭部