【问题标题】:Raw socket: unexpected IP header added when sending self-made IP/TCP packets原始套接字:发送自制 IP/TCP 数据包时添加了意外的 IP 头
【发布时间】:2015-10-22 02:54:42
【问题描述】:

我想使用原始套接字发送 TCP 数据包,这是一个完整的 IP 数据包(所以数据包有 IP 头、TCP 头和 TCP 有效负载,但没有以太网头。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 捕获发送出去的数据包,注意到它在 IP 数据包中添加了一个额外的 IP 头,IP 协议号为 255(ip->ip_p 为 255)。所以它有两个 IP 头(具有相同的 src 和 dst IP 对),这是出乎意料的。

有什么问题?谢谢!

【问题讨论】:

    标签: sockets network-programming raw-sockets


    【解决方案1】:

    使用IPPROTO_RAW 隐式启用选项IP_HDRINCL
    在您对setsockopt() 的调用中,您再次禁用IP_HDRINCL,因为您设置了on = 0
    尝试删除setsockopt() 或设置on = 1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多