溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

HTTP/2協(xié)議中二進(jìn)制楨的示例分析

發(fā)布時(shí)間:2021-11-18 09:33:40 來(lái)源:億速云 閱讀:330 作者:小新 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)HTTP/2協(xié)議中二進(jìn)制楨的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。


 
一、楨格式

HTTP/2協(xié)議中二進(jìn)制楨的示例分析

 
1.楨格式說(shuō)明

楨的格式由9個(gè)字節(jié)的楨頭和楨數(shù)據(jù)Payload構(gòu)成;楨頭由3個(gè)字節(jié)的楨長(zhǎng)度、1個(gè)字節(jié)的楨類型、1個(gè)字節(jié)的標(biāo)志位、4個(gè)字節(jié)的流標(biāo)識(shí)符(含1位R保留位)構(gòu)成。

楨長(zhǎng)度
楨長(zhǎng)度由24位3個(gè)字節(jié)大小表示。取值在2^14(16,384)與2^24-1(16,777,215)之間;可在接收方SETTINGS_MAX_FRAME_SIZE設(shè)置。

楨類型
楨類型用8位1個(gè)字節(jié)表示,說(shuō)明楨的格式和語(yǔ)義。具體楨的類型詳見(jiàn)下文介紹。

標(biāo)志位
標(biāo)志位用8位1個(gè)字節(jié)表示。例如:END_HEADERS標(biāo)志表示頭數(shù)據(jù)傳輸結(jié)束;END_STREAM表示單方向數(shù)據(jù)傳輸結(jié)束。

R
R即1位保留字段,未定義,以0x0結(jié)尾。

流標(biāo)識(shí)符
流標(biāo)識(shí)符用31位表示,上限為2^31。接收方可以根據(jù)流標(biāo)識(shí)ID進(jìn)行組裝,同一個(gè)Stream中內(nèi)Frame必須是有序的,所以接受方根據(jù)流ID可以拼接成有序的流。另外:客戶端發(fā)起的流用奇數(shù)表識(shí);服務(wù)器發(fā)起的流用偶數(shù)標(biāo)識(shí)。正因?yàn)槭褂昧肆鳂?biāo)識(shí),接收端可以將并發(fā)的Stream進(jìn)行有序拼接,實(shí)現(xiàn)多路復(fù)用。

楨數(shù)據(jù)
傳輸?shù)臄?shù)據(jù)內(nèi)容Payload由楨類型決定。

 
2.Wireshark抓包截圖

HTTP/2協(xié)議中二進(jìn)制楨的示例分析

 
二、楨類型
 1.DATA楨

數(shù)據(jù)楨主要存儲(chǔ)HTTP/2數(shù)據(jù)報(bào)文,具體格式如下圖:

HTTP/2協(xié)議中二進(jìn)制楨的示例分析

字段含義
Padding: 8位填充字節(jié),填充字節(jié)可以改變DATA楨的大小,可以啟到安全性功能
Pad Length: 填充字節(jié)的長(zhǎng)度;PADDED標(biāo)記為true時(shí)表明有填充字節(jié)
Data: 具體傳輸?shù)臄?shù)據(jù)

Wireshark抓包截圖

HTTP/2協(xié)議中二進(jìn)制楨的示例分析

 2.Header楨

Header楨的結(jié)構(gòu)如下圖:

HTTP/2協(xié)議中二進(jìn)制楨的示例分析

字段含義
Pad Length:填充字節(jié)的長(zhǎng)度,填充字節(jié)含義同上述Data楨
E:表識(shí)流是否為獨(dú)占的。設(shè)置PRIORITY時(shí)才有值
Stream Dependency:該流的依賴流。設(shè)置PRIORITY時(shí)才有值
Weight:流優(yōu)先級(jí)權(quán)重。設(shè)置PRIORITY時(shí)才有值
Header Block Fragment:Header塊片段
Padding:填充的字節(jié)長(zhǎng)度

Wireshark抓包截圖

HTTP/2協(xié)議中二進(jìn)制楨的示例分析


 
 3.PRIORITY幀

發(fā)送流的優(yōu)先級(jí),格式如下,各字段含義與抓包截圖見(jiàn)Header楨。

HTTP/2協(xié)議中二進(jìn)制楨的示例分析

 4.RST_STREAM幀

當(dāng)發(fā)生錯(cuò)誤或者取消時(shí),用于終止一個(gè)流。

HTTP/2協(xié)議中二進(jìn)制楨的示例分析

字段含義
Error Code: 32位錯(cuò)誤代碼,指發(fā)生錯(cuò)誤的原因。

Wireshark抓包截圖

HTTP/2協(xié)議中二進(jìn)制楨的示例分析


 
 5.SETTINGS幀

用于傳達(dá)連接端點(diǎn)之間的配置參數(shù)。
SETTINGS幀的標(biāo)記ACK為0表示被對(duì)等的SETTINGS楨使用;ACK不為0時(shí)表示FRAME_SIZE_ERROR的連接錯(cuò)誤。

楨格式

HTTP/2協(xié)議中二進(jìn)制楨的示例分析

Identifier參數(shù)含義
SETTINGS_HEADER_TABLE_SIZE:通知接收方header解碼表(解碼header塊)的最大尺寸
SETTINGS_ENABLE_PUSH:初始值1表示允許服務(wù)端推送,0表示不允許服務(wù)端推送
SETTINGS_MAX_CONCURRENT_STREAMS:最大的并發(fā)流數(shù)(發(fā)送者)
SETTINGS_INITIAL_WINDOW_SIZE:stream窗口大小,默認(rèn)為65535
SETTINGS_MAX_FRAME_SIZE:楨負(fù)載大小
SETTINGS_MAX_HEADER_LIST_SIZE:Header列表的最大值

Wireshark抓包截圖

HTTP/2協(xié)議中二進(jìn)制楨的示例分析


 
 6.PUSH_PROMISE幀

服務(wù)端向客戶端推送的楨,客戶端可以返回RST_STREAM拒絕。
圖中R為保留位。

HTTP/2協(xié)議中二進(jìn)制楨的示例分析

 7.PING幀

心跳檢測(cè),測(cè)量發(fā)送往還時(shí)間,確定連接是否正常。
標(biāo)記ACK為0即false表示為PING楨的響應(yīng)(response);1即True表示PING楨。
楨格式

HTTP/2協(xié)議中二進(jìn)制楨的示例分析

Wireshark抓包截圖

HTTP/2協(xié)議中二進(jìn)制楨的示例分析

 8.GOAWAY幀

用于關(guān)閉連接或者發(fā)出錯(cuò)誤,允許停止接受新的流并完成前面的流處理。
楨格式

HTTP/2協(xié)議中二進(jìn)制楨的示例分析

Wireshark抓包截圖

HTTP/2協(xié)議中二進(jìn)制楨的示例分析

 9.WINDOW_UPDATE幀

用于連接和流的流量控制。

HTTP/2協(xié)議中二進(jìn)制楨的示例分析

Wireshark抓包截圖

HTTP/2協(xié)議中二進(jìn)制楨的示例分析

 
10.CONTINUATION

CONTINUATION一種持續(xù)楨用于繼續(xù)傳輸Header頭塊片段。通常在Header塊比較大,在HEADERS、PUSH_PROMISE、CONTINUATION楨之后繼續(xù)傳輸。 

關(guān)于“HTTP/2協(xié)議中二進(jìn)制楨的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI