首页 文章

Raw套接字中的TCP数据包 - Centos 6.6

提问于
浏览
2

我尝试执行TCP流量并在另一端使用RAW套接字捕获数据包 .

我将窗口大小设置为50000字节 . 以最大速率发送TCP流量时 . 我在wireshark中观察到每12个数据包(1512个字节数据包)发送一个ACk .

在原始套接字中接收数据包 . 我预计会有12个数据包就像我在wireshark中一样(我相信wireshark也使用原始套接字) . 但我很惊讶地看到一个数据包带有发送数据流 .

据我所知,RAW套接字应该以数据包的形式接收,这些数据包是有线传输而不是TCP流 .

我使用下面的原始套接字来接收端口数据包

rawsd = socket(PF_PACKET, SOCK_RAW, ETH_P_ALL);

这无论如何都与tcp_wrapper和OS tcp配置有关 .

2 回答

  • 1

    我认为wireshark在你的网络接口上使用名为Promiscuous mode的东西,在这种模式下,它可以在较低层获取数据包 . 但如果使用原始套接字,则只读取接收缓冲区数据而不是数据包 .
    来自libpcap(wireshark后端)git存储库的以下代码显示它使用带有备用选项的原始套接字 .

    pcap_activate_snoop(pcap_t *p)
    {
    int fd;
    ...
    fd = socket(PF_RAW, SOCK_RAW, RAWPROTO_SNOOP);
    
  • 1

    这是我观察到的答案 .

    Linux Eth端口具有设置“tcp-segmentation-offload”的配置 .

    [root@Kernel317 home]# ethtool -k eth0
    Features for eth0:
    rx-checksumming: off
    tx-checksumming: on
        tx-checksum-ipv4: off [fixed]
        tx-checksum-ip-generic: on
        tx-checksum-ipv6: off [fixed]
        tx-checksum-fcoe-crc: off [fixed]
        tx-checksum-sctp: off [fixed]
    scatter-gather: on
        tx-scatter-gather: on
        tx-scatter-gather-fraglist: off [fixed]
    tcp-segmentation-offload: on
        tx-tcp-segmentation: on
        tx-tcp-ecn-segmentation: off [fixed]
        tx-tcp6-segmentation: off [fixed]
    

    在启用tcp-segmentation-offload时,无论MTU配置如何,数据包都会在eth端口中作为完整数据段聚集在一起 .

    ethtool -K eth1 rx on tx on
    

    在禁用tcp-segmentation-offload时,不在eth端口处理数据包,并且在RAW套接字中接收MTU大小的数据包 .

    ethtool -K eth1 rx off tx off
    

    谢谢

相关问题