如何使用RAW套接字卸载TCP Checksum

时间:2011-07-07 12:09:38

标签: sockets tcp checksum offloading

(使用Linux)

使用TCP创建raw sockets数据包 - 事实证明,在高性能网络中,计算校验和是我的瓶颈。由于NIC支持校验和卸载,ethtool也表示它已启用,我希望我可以使用校验和卸载。

但是当我使用原始套接字时,似乎没有计算校验和。有没有办法使用原始套接字启用tcp校验和卸载?

修改

实际上我的机器/ NIC(Thinkpad x201)的行为似乎不太合乎逻辑:当发送具有正常tcp套接字的数据包时,所有校验和都是错误的,在回送接口上以及在机器之间。有趣的是,另一台机器默默地传送数据包了吗?

Edit2:现在好了,我只是查看错误机器上的数据包,卸载工作正常。但是当我离开tcp_checksum字段0时,它不会被填充,它只是保持为0。

1 个答案:

答案 0 :(得分:0)

我在这里遇到同样的问题:在原始套接字中发送TCP或UDP数据包,但无法利用其检查卸载功能打开的网卡。希望有一个setsockopt()或ioctl()类型的函数可以在原始套接字上启用校对卸载。

对于为什么wireshark显示数据包有校验和错误但目标主机无论如何都接受所有数据包的问题,​​原因是wireshark(如果在Windows上通过winpcap等)在数据包从OS到达NIC之前捕获数据包。数据包没有OS或应用程序正确填充的校验和字段---这就是NIC上的校验和卸载功能。

问题是,如何启用NIC在原始套接字上执行校验和卸载。