Http chunk方式传输数据

Http协议

响应格式:

HTTP/1.1 200 OK\r\n
[HeaderKey]:[空格][HeaderValue]\r\n
[HeaderKey]:[空格][HeaderValue]\r\n
[HeaderKey]:[空格][HeaderValue]\r\n
......这里省略很多
\r\n
[数据区]


请求格式:

GET/POST[空格][相对或者绝对路径][空格]HTTP/1.1\r\n
[HeaderKey]:[空格][HeaderValue]\r\n
[HeaderKey]:[空格][HeaderValue]\r\n
[HeaderKey]:[空格][HeaderValue]\r\n
....
\r\n
[数据区]


数据区的长度由协议头Content-Length指定

***当数据区的长度太长时,若还是按照上面这种格式传输,则对方会收到不数据,用wareshark抓包时也看不到这条数据(Http,用Tcp过滤还是看得到的)

这时,就要使用Chunk方式传送啦

Http chunk方式传输数据_第1张图片

先来看一条Chunk的示例

Content-Disposition: attachment; filename="文件名":这个协议头是让浏览器下载文件
"Transfer-Encoding", "chunked":必需的。

Chunk的协议头里没有 Content-Length

数据区里的数据格式有变化:

Http chunk方式传输数据_第2张图片

可以从上图看出每段的chunk数据是以\r\n结尾的,那每段的开始呢?

Http chunk方式传输数据_第3张图片

圈出来的就是每段chunk数据的开始,这个\39\63\30不难看出,这是此段Trunk的长度,不包括表示长度的这几个字节,也不包括结尾的\r\n,这段长度的这几个字节是个字符串,没有固定长度,占1个字节到4个字节,至于5个以上字节应该也行,不过没必要吧,不要直接把长度写入,要先转成字符串后再写,这个问题搞了半天。



Http chunk方式传输数据_第4张图片

最后结尾是\30\r\n\r\n

这个\30是什么意思,不清楚,反正没有会报错了


知道了chunk方式传输格式,就可以针对地写代码了吧,自己做爬虫时经常遇到,整得脑壳大

你可能感兴趣的:(通信协议)