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捕獲數據包。
在Linux上,沒有校驗和使用環回接口的數據包來計算。 – marcolz
這種情況也發生在eth0上。 – Gordey
已解決。我沒有任何關於校驗和卸載的知識:https://wiki.wireshark.org/CaptureSetup/Offloading – Gordey