sockets - 如何通过 RAW 套接字使用 TCP 校验和卸载

标签 sockets tcp checksum offloading

(使用 Linux)

使用原始套接字创建TCP 数据包 - 事实证明,计算校验和是我在高性能网络中的瓶颈。由于 NIC 将支持校验和卸载,并且 ethtool 也说它已启用,我希望我可以使用校验和卸载。

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

编辑:

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

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

最佳答案

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

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

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

关于sockets - 如何通过 RAW 套接字使用 TCP 校验和卸载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6610345/

相关文章:

sql-server - CHECKSUM 和 CHECKSUM_AGG : What's the algorithm?

hash - 确定 16 位校验和计算的最有效方法是什么? [CRC hell :-(]

java - Netty 中用于服务器端计划任务/事件的最佳方法

c - gethostbyname win32错误

c - 在c中发送十六进制值并检查其位设置

Java基本并发通信器-不完全接受连接

c++ - 在 C++ 中解析基于 TCP 的 TLV 协议(protocol)的问题

tcp - 视频流协议(protocol)——处理碎片

java - 在 Java 中获取文件的 MD5 校验和

c - 以编程方式查找阻止端口创建的应用程序