2015-07-22 452 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()