最近使用Socket实现一个抓包工具,在对Http协议进行解析时,遇到了获取完整Http报文的问题,总结如下:
- 短连接:如果没有启用keepalive,可以通过判断连接状态界定报文实体的边界;
- 请求头中有Content-length,根据该字段值,得到请求实体的长度;
- 请求头中有Transfer-Encoding: chunked,代表该请求是分块的,也是本文介绍的重点:
3.1 分块编码仅在http 1.1协议中有效;
3.2 在每段数据块前,使用 “[数据块长度]\r\n” 来标记接下来数据块的长度;
3.3 最后一个数据块的长度必须为0,也可以理解为http报文以0\r\n\r\n来结尾。
通过以上三点描述,我们既可以安全完整的从TCP报文中解析出http报文
网友评论