计算 tcp 的数据区长度的误区

我今天抓包发现一个有趣的现象。
客户端发送一个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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值