问题:
- 我在原始套接字上编写了嗅探器。它捕获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上创建UDP服务器,而嗅探器捕获了带有不可达端口的ICMP数据包。我认为错误校验和的原因可能在这里。
我尝试使用PacketSender发送UDP数据包。如果服务器未运行(我收到ICMP回复指出端口不可达),校验和再次出错。
请问有人能够解释一下为什么UDP数据包的校验和等于伪UDP头的校验和吗?
附言:对我的拼写错误感到抱歉。
更新:TCP数据包的校验和也是错误的。使用Wireshark捕获数据包。