我尝试执行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配置有关。
答案 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
由于