2015-07-22 147 views
1


问题:错误校验

  • 我写的嗅探器的原始套接字。它捕获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捕获数据包。

+0

在Linux上,没有校验和使用环回接口的数据包来计算。 – marcolz

+0

这种情况也发生在eth0上。 – Gordey

+0

已解决。我没有任何关于校验和卸载的知识:https://wiki.wireshark.org/CaptureSetup/Offloading – Gordey

回答

0

我有同样的问题用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()