收到的UDP包校验和错误。

3


问题:

  • 我在原始套接字上编写了嗅探器。它捕获UDP数据包并重新检查校验和;
  • 我在DGRAM套接字上编写了UDP客户端。它在本地主机上发送UDP数据包;
  • 数据包的校验和是错误的。它仅包括伪头部。

创建客户端套接字:

sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
raddr.sin_family = AF_INET;
raddr.sin_addr.s_addr = inet_addr("127.0.0.1");
raddr.sin_port = htons(4848);
sendto(sock, buf, 256, 0, (struct sockaddr*) &raddr, addrlen);

创建嗅探器套接字:
sock_raw = socket(AF_PACKET, SOCK_RAW, ETH_P_ALL);
struct sockaddr_ll *s = (struct sockaddr_ll*) &sll;
        s->sll_family = AF_PACKET;
        s->sll_ifindex = if_nametoindex("lo");
        s->sll_protocol = htons(protocol);
size = sizeof(struct sockaddr_ll);
bind(sock_raw, &sll, size);
data_size = recvfrom(sock_raw, buffer, BUFSZ, 0, NULL, NULL);

注意:
我没有在端口4848上创建UDP服务器,而嗅探器捕获了带有不可达端口的ICMP数据包。我认为错误校验和的原因可能在这里。
我尝试使用PacketSender发送UDP数据包。如果服务器未运行(我收到ICMP回复指出端口不可达),校验和再次出错。
请问有人能够解释一下为什么UDP数据包的校验和等于伪UDP头的校验和吗?
附言:对我的拼写错误感到抱歉。
更新:TCP数据包的校验和也是错误的。使用Wireshark捕获数据包。

1
在Linux上,使用环回接口传输的数据包不会计算校验和。 - marcolz
这种情况也发生在eth0上。 - Gordey
已解决。我对校验和卸载一无所知:https://wiki.wireshark.org/CaptureSetup/Offloading - Gordey
1个回答

0

我在使用qemu+centos7时也遇到了同样的问题,只需把offload关闭即可:

def set_iface_offload_off(ifname):
        print "setting %s offloading off" % ifname
        f = os.popen('/usr/sbin/ethtool --offload ' + ifname + ' rx off  tx off')
        f.close()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接