错误校验
问题描述:
问题:错误校验
- 我写的嗅探器的原始套接字。它捕获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和嗅探器捕获与ICMP不可达报文UDP服务器港口。我认为错误校验和的原因可以在这里。
我尝试使用PacketSender发送udp数据包。如果服务器没有运行(我有ICMP回复端口无法访问)校验和再次错误。
请有人,你能解释为什么udp数据包的校验和=校验和伪udp头?!
问题:抱歉我的拼写错误。
更新:TCP数据包也有错误的校验和。用wireshark捕获数据包。
答
我有同样的问题用QEMU + centos7,只需设置卸载掉:
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()
在Linux上,没有校验和使用环回接口的数据包来计算。 – marcolz
这种情况也发生在eth0上。 – Gordey
已解决。我没有任何关于校验和卸载的知识:https://wiki.wireshark.org/CaptureSetup/Offloading – Gordey