2015-07-22 4 views
1


Проблема:Неправильный контрольная сумма полученного пакета UdP

  • Я написал сниффер на сокет RAW. Он улавливает пакет udp и проверяет контрольную сумму;
  • Я написал udp клиент на разъем DGRAM. Его отправить пакет udp на localhost;
  • Контрольная сумма пакета неверна. Он включает только псевдо-заголовок.

Создание клиентского сокета:

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); 

Примечание:
Я не создаю UdP сервер на порт 4848 и перехватчик поймать ICMP пакет с недостижимым порт. Я думаю, что причина неправильной контрольной суммы может быть здесь.
Я пробую PacketSender для отправки пакета udp. И если сервер не запущен (у меня есть ответ ICMP, который недоступен для порта) контрольная сумма снова ошибочна.

Пожалуйста, кто-нибудь, вы можете объяснить мне, почему контрольная сумма udp packet = контрольная сумма pseudo udp header !?

P.S .: извините за мое правописание.

Обновление: TCP-пакет также имеет неправильную контрольную сумму. Поймайте пакет с помощью проводов.

+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() 
Смежные вопросы