我今天抓包发现一个有趣的现象。
客户端发送一个HTTP请求,而服务器回应了6个二进制0的数据,然后,客户端没有等服务器的数据,就正常结束了。
其实这可能是一个问题。有可能客户端在处理 tcp 的数据区长度时,出现了如下的错误:
用整个数据包的长度,减去MAC头,IP头,TCP头,余下的数据,就是TCP数据区吗?
这种计算方法其实是不对的。
因为有时网卡会自作主张地填充一些字节,最典型的是填充6个0。本来数据长度是0的时候,整个包是54个字节,现在成了60个字节。
假如 pkt 是整个数据包的开头指针,data是数据区的指针,而pkthdr->len是整个包的长度。
ETHERNET_HEADER_LEN 是MAC头长度(为14)
计算tcp数据区长度的错误方法是
int datalen = ((char*)pkt+ pkthdr->len)-data;
而正确的方法,应该是从IP头中取出长度来计算。
int datalen = ((char*)pkt+ ntohs(iph->ip_len)+ETHERNET_HEADER_LEN)-data;
计算 tcp 的数据区长度的误区
最新推荐文章于 2025-04-29 18:45:42 发布
1159

被折叠的 条评论
为什么被折叠?



