【问题标题】:Enable UDP packet checksum in C INET Socket Code在 C INET 套接字代码中启用 UDP 数据包校验和
【发布时间】:2013-09-06 02:24:00
【问题描述】:

我正在编写一个 UDP 客户端来连接到服务器并发送一些数据。我要连接的服务器确保 UDP 数据包校验和正确。在我使用的文档中包含以下行:The optional 16 bit checksum must be included in the header

我只是想知道如何确保将其包括在内。到目前为止,这是我的客户端代码:

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

#define ip_address "127.0.0.1"
#define port_num 32000

int main(int argc, char**argv)
{
  int sockfd,n;
  struct sockaddr_in servaddr,cliaddr;
  char sendline[1000];
  char recvline[1000];

  sockfd=socket(AF_INET,SOCK_DGRAM,0);

  bzero(&servaddr,sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr=inet_addr(ip_address);
  servaddr.sin_port=htons(port_num);

while (fgets(sendline, 10000,stdin) != NULL)
 {
     sendto(sockfd,sendline,strlen(sendline),0,
         (struct sockaddr *)&servaddr,sizeof(servaddr));
     n=recvfrom(sockfd,recvline,10000,0,NULL,NULL);
     recvline[n]=0;
     fputs(recvline,stdout);
 }
} 

【问题讨论】:

  • 来自pcvr.nl/tcpip/udp_user.htm,“尽管 UDP 校验和是可选的,但它们应该始终启用”和“很难检测特定系统是否启用了 UDP 校验和。应用程序通常不可能获取接收到的 UDP 头中的校验和字段。为了解决这个问题,作者在 tcpdump 程序中添加了另一个选项,打印接收到的 UDP 校验和。如果这个打印值为 0,则表示发送主机没有计算校验和。

标签: c sockets udp


【解决方案1】:

感谢评论中引用的 TCP/IP Illustrated,但它有点陈旧。抓包工具 Wireshark 会很高兴地向您展示 UDP 校验和。

您没有提及您的特定平台,但现在可以肯定地假设它可能是 Linux。民间传说(我没有参考资料)说它可能取决于网络接口设备驱动程序,但根据我的经验,当您通过常规 UDP 套接字发送数据包时,UDP 校验和总是在 Linux 上添加。

您的代码尝试捕获它自己发送的数据包的方式有点奇怪。我稍微修改了代码并使用 netcat 作为接收服务器。 我通过在客户端运行 wireshark 验证了 UDP 校验和存在且正确

这里是稍作修改的代码http://pastebin.com/X9cgH1S3的链接

请注意,使用 Linux 在 localhost 上进行测试将失败。我的猜测是,wireshark 捕获套接字在流中的错误点(在计算校验和之前)获取数据包,或者 localhost 的网络堆栈采用了快捷方式。无论如何,如果可以的话,在真正的互联网上进行测试。

【讨论】:

  • 谢谢,我确实在使用 Linux。默认情况下似乎启用了校验和,这很好,但我也想知道我必须编写什么代码来手动启用/禁用它们。
  • 我不认为有任何方法可以为常规 UDP 套接字关闭它。您必须创建一个原始/数据包套接字并格式化您自己的 udp 标头。甚至不可能为 UDPlite lxr.linux.no/#linux+v3.11/Documentation/networking/udplite.txt 关闭它正如内核文档所指出的那样,Internet 上禁止零校验和,所以我认为很多实现都不能关闭它 tools.ietf.org/html/rfc3828#section-3.1 。我知道有人讨论过禁用 VPN 内的校验和。
猜你喜欢
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 2015-11-26
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多