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

时间:2015-02-03 07:17:55

标签: c linux sockets networking tcp

我尝试执行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 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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

由于