C 如何启用UDP校验和

C 如何启用UDP校验和,c,sockets,network-programming,udp,checksum,C,Sockets,Network Programming,Udp,Checksum,我正在从事一个项目,涉及VxWorks设备和Linux机器之间的UDP套接字通信。在这个项目中,我想利用UDP报头的校验和字段 似乎在VxWorks套接字接口中,传出UDP数据包的校验和字段默认启用 但是,对于通常的Unix套接字接口,似乎没有任何标志或其他方法来打开UDP套接字,该套接字将检查传入数据包的校验和,并填充传出数据包的校验和 对于通常的Unix套接字接口,是否存在这样的标志 谢谢 我不是专家,但关于这件事唯一要说的是它默认启用: UDP生成并检查校验和以捕获传输错误 它没有提到任何

我正在从事一个项目,涉及VxWorks设备和Linux机器之间的UDP套接字通信。在这个项目中,我想利用UDP报头的校验和字段

似乎在VxWorks套接字接口中,传出UDP数据包的
校验和
字段默认启用

但是,对于通常的Unix套接字接口,似乎没有任何标志或其他方法来打开UDP套接字,该套接字将检查传入数据包的校验和,并填充传出数据包的校验和

对于通常的Unix套接字接口,是否存在这样的标志


谢谢

我不是专家,但关于这件事唯一要说的是它默认启用:

UDP生成并检查校验和以捕获传输错误

它没有提到任何禁用它的方法

编辑:我懒得查找当前内核源代码,但建议删除带有无效校验和的数据包(csum\U copy\U err部分)。

(我不是专家。以下可能完全错误。)

网络接口(或驱动程序或类似的东西)应该检查传入数据包的校验和。所有位零的校验和表示“输出接口未生成校验和”。接口必须检查任何其他校验和(包括校验和字段使用的1补码编码中的所有位1,也称为“负零”),并且如果检查失败,必须丢弃数据包

因此,永远不允许对传入数据包禁用UDP校验和检查(如果这些数据包提供了校验和)。这只是UDP标准的强制性部分

接收接口可以丢弃没有校验和的数据包[1],或者将它们传递给应用程序(或者可以让应用程序配置其所需的行为,尽管如果这是可能的,我不知道如何做)

您可能唯一能够控制的是发送接口是否在传出数据包上生成校验和。它将是特定于平台的。我在下面收集了一些方法,它们可能有效,也可能无效;警告选择器

如果您只是采用平台的默认行为,那么默认情况下将生成UDP校验和-我会为此投入资金

[1] -:“允许应用程序选择性地丢弃校验和为零的UDP数据报[]。”


建议在Solaris上,您可以通过以下命令行全局禁用在传出数据包上生成UDP校验和:

ndd-set/dev/udp udp\u do\u校验和0
ndd
实用程序特定于Solaris内核,在Linux或FreeBSD上不存在。还有,甚至可以说:

udp\u do\u校验和
此参数控制UDP是否计算校验和
在传出UDP/IPv4数据包上。
违约
1(已启用)
何时改变
不要更改此参数。
(在Linux和FreeBSD上,我不知道Solaris上是否真的存在
/dev/udp


意味着在Windows上,您可以使用文档化的选项,以编程方式在每个套接字的基础上禁用UDP校验和生成:

DWORD trueValue=1;
int rc=setsockopt(fd,IPPROTO_UDP,UDP_NOCHECKSUM,(const char*)和yes,sizeof yes);
如果(rc!=0){perror(“setsockopt”);abort();}

这意味着在FreeBSD(例如Mac OS X)上,您可以使用其他未记录的(但自2018年1月起提供)选项,以编程方式在每个套接字的基础上禁用校验和生成:

int yes=1;
int rc=setsockopt(sock,IPPROTO_UDP,UDP_NOCKSUM,(void*)和yes,sizeof yes);
如果(rc!=0){perror(“setsockopt”);abort();}

最后,这意味着在Linux上,您可以使用一个未记录的(但从2018年1月开始)选项,以编程方式在每个套接字的基础上禁用校验和生成:

int yes=1;
int rc=setsockopt(sock,SOL_SOCKET,SO_NO_CHECK,(void*)&是,sizeof yes);
如果(rc!=0){perror(“setsockopt”);abort();}


关于@zneak的评论,现在允许在某些限制条件下(例如隧道流量)通过IPv6使用UDP零校验和。Linux为此定义了
UDP\u NO\u CHECK6\u TX
UDP\u NO\u CHECK6\u RX
套接字选项,请参阅。

如果它不生成或检查UDP校验和,则它不是UDP,而是其他。除非您在官方文档中读到vxworks没有检查UDP校验和,否则可以安全地假设它没有检查。@nos not QUEET true。您可以在接口中关闭生成校验和。@UDPLover关闭NIC本身上的CRC生成,因此操作系统必须这样做。@nos UDP协议指定校验和字段的值可以为0,这意味着未生成校验和,因此接收器不应尝试检查校验和。@nos其操作系统实现依赖。没有校验和的UDP数据包也是有效数据包。它是接收应用程序。对于IPv4上的UDP,校验和字段在技术上是可选的。如果该值为0,则忽略校验和。但是,IPv6上的UDP要求校验和为非零,必须丢弃校验和为零的数据报。如果校验和应为零,则必须将其作为FFFF发送。(在指定IPv6的RFC中查找“UDP校验和”)。校验和将查找错误?数据段将被删除??在UDP中