HTTP协议中的chunked编码解析
“?HTTP協(xié)議中的chunked傳輸編碼全接觸。”
在HTTP協(xié)議中,服務(wù)器發(fā)往客戶端的數(shù)據(jù)中,通常都包括HTTP頭和HTTP體,當(dāng)存在HTTP體的時(shí)候,HTTP體的長(zhǎng)度通常是由HTTP頭內(nèi)的“Content-Length”字段確定。
就像下圖:
不過(guò),“Content-Length”字段并非總是存在,這就涉及到今天要講的chunked編碼,它在HTTP協(xié)議標(biāo)準(zhǔn)的早期并不存在,而是在HTTP 1.1 才開(kāi)始被引入到協(xié)議中。
chunked編碼允許服務(wù)器發(fā)出的數(shù)據(jù)被分成多個(gè)部分,這樣,服務(wù)器就可以在發(fā)送數(shù)據(jù)前無(wú)需知道待發(fā)送內(nèi)容的總大小。因?yàn)樗恍枰畛?span style="color:rgb(62,62,62);font-size:16px;">“Content-Length”字段。
當(dāng)HTTP使用chunked編碼進(jìn)行傳輸?shù)臅r(shí)候,在HTTP頭部會(huì)出現(xiàn)字段“Transfer-Encoding: chunked”。同時(shí),“Content-Length”字段相應(yīng)地就不會(huì)出現(xiàn)了。
如圖:
當(dāng)HTTP頭部標(biāo)示了HTTP體的數(shù)據(jù)為chunked編碼時(shí),整個(gè)HTTP體將是chunked編碼。
chunked編碼的一般格式如下:
len1\r\ndata1\r\nlen2\r\ndata2\r\n........0\r\n\r\n
即數(shù)據(jù)采用分塊的模式進(jìn)行傳輸,編碼后的每塊數(shù)據(jù)包含一個(gè)長(zhǎng)度值和對(duì)應(yīng)長(zhǎng)度的傳輸內(nèi)容,長(zhǎng)度值為16進(jìn)制數(shù)據(jù)的字符串形式,如上圖的b50表示該塊數(shù)據(jù)的傳輸內(nèi)容長(zhǎng)度為0xb50字節(jié)。長(zhǎng)度值之后為固定值"\r\n",傳輸內(nèi)容之后也是固定值"\r\n"。chunked編碼的最后一塊為“0\r\n\r\n”,即數(shù)據(jù)塊的長(zhǎng)度為0。
在解析chunked編碼時(shí),按每塊的長(zhǎng)度將傳輸?shù)膬?nèi)容進(jìn)行拼接,直至塊長(zhǎng)為0的塊即完成一個(gè)chunked編碼的解析。如上圖的圖片,就僅一個(gè)0x158字節(jié)的數(shù)據(jù)塊,它的第二塊chunked就已經(jīng)是“0\r\n\r\n”了。
chunked編碼很簡(jiǎn)單,是不是?
不過(guò),在協(xié)議還原的實(shí)現(xiàn)過(guò)程中,如何高效高性能地對(duì)chunked進(jìn)行解碼,是一件值得挑戰(zhàn)的事哦。畢竟,HTTP的流量占比不小的。
長(zhǎng)按進(jìn)行關(guān)注。
總結(jié)
以上是生活随笔為你收集整理的HTTP协议中的chunked编码解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: QP编码详解
- 下一篇: gzip格式分析与识别