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方式传送啦
先来看一条Chunk的示例
Content-Disposition: attachment; filename="文件名":这个协议头是让浏览器下载文件
"Transfer-Encoding", "chunked":必需的。
Chunk的协议头里没有 Content-Length
数据区里的数据格式有变化:
可以从上图看出每段的chunk数据是以\r\n结尾的,那每段的开始呢?
圈出来的就是每段chunk数据的开始,这个\39\63\30不难看出,这是此段Trunk的长度,不包括表示长度的这几个字节,也不包括结尾的\r\n,这段长度的这几个字节是个字符串,没有固定长度,占1个字节到4个字节,至于5个以上字节应该也行,不过没必要吧,不要直接把长度写入,要先转成字符串后再写,这个问题搞了半天。
最后结尾是\30\r\n\r\n
这个\30是什么意思,不清楚,反正没有会报错了