Проблема:Неправильный контрольная сумма полученного пакета 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-пакет также имеет неправильную контрольную сумму. Поймайте пакет с помощью проводов.
В Linux нет контрольных сумм не рассчитаны для пакетов с использованием интерфейса обратной петли. – marcolz
Эта ситуация также возникла на eth0. – Gordey
Решенный. Я ничего не знаю о разгрузке контрольной суммы: https://wiki.wireshark.org/CaptureSetup/Offloading – Gordey