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

TCP Packets in Raw socket - Centos 6.6

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

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

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

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

我在下面使用原始套接字在端口

中接收数据包
  rawsd = socket(PF_PACKET, SOCK_RAW, ETH_P_ALL);

这是否与 tcp_wrapper 和 OS tcp 配置有关。

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

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

这是我观察到的答案。

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

谢谢