原始套接字:发送 self-made IP/TCP 数据包时添加了意外的 IP header
Raw socket: unexpected IP header added when sending self-made IP/TCP packets
我想使用原始套接字发送 TCP 数据包,它是一个完整的 IP 数据包(因此数据包具有 IP header、TCP header 和 TCP 负载,但没有以太网 header. IP源地址和目的地址在一个WLAN中,192.168.0.105和192.168.0.103),代码如下
int on;
on = 0;
if ((sendfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
perror("raw socket");
exit(1);
}
if (setsockopt(sendfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {
perror("setsockopt");
exit(1);
}
nr_bytes = sendto(sendfd, packet, ip_len, 0, (struct sockaddr*)&client_addr, addr_len);
我用TCPdump抓取sent-out包,发现在IP包中多了一个IPheader,IP协议号为255(ip->ip_p 为 255)。所以它有两个 IP headers(具有相同的一对 src 和 dst IP),这是意外的。
有什么问题?谢谢!
使用 IPPROTO_RAW
隐式启用选项 IP_HDRINCL
。
在调用 setsockopt()
时,您再次禁用了 IP_HDRINCL
,因为您设置了 on = 0
.
尝试删除 setsockopt()
或设置 on = 1
.
我想使用原始套接字发送 TCP 数据包,它是一个完整的 IP 数据包(因此数据包具有 IP header、TCP header 和 TCP 负载,但没有以太网 header. IP源地址和目的地址在一个WLAN中,192.168.0.105和192.168.0.103),代码如下
int on;
on = 0;
if ((sendfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
perror("raw socket");
exit(1);
}
if (setsockopt(sendfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {
perror("setsockopt");
exit(1);
}
nr_bytes = sendto(sendfd, packet, ip_len, 0, (struct sockaddr*)&client_addr, addr_len);
我用TCPdump抓取sent-out包,发现在IP包中多了一个IPheader,IP协议号为255(ip->ip_p 为 255)。所以它有两个 IP headers(具有相同的一对 src 和 dst IP),这是意外的。
有什么问题?谢谢!
使用 IPPROTO_RAW
隐式启用选项 IP_HDRINCL
。
在调用 setsockopt()
时,您再次禁用了 IP_HDRINCL
,因为您设置了 on = 0
.
尝试删除 setsockopt()
或设置 on = 1
.