我尝试执行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 回答
我认为wireshark在你的网络接口上使用名为Promiscuous mode的东西,在这种模式下,它可以在较低层获取数据包 . 但如果使用原始套接字,则只读取接收缓冲区数据而不是数据包 .
来自libpcap(wireshark后端)git存储库的以下代码显示它使用带有备用选项的原始套接字 .
这是我观察到的答案 .
Linux Eth端口具有设置“tcp-segmentation-offload”的配置 .
在启用tcp-segmentation-offload时,无论MTU配置如何,数据包都会在eth端口中作为完整数据段聚集在一起 .
在禁用tcp-segmentation-offload时,不在eth端口处理数据包,并且在RAW套接字中接收MTU大小的数据包 .
谢谢