Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
原始套接字中的TCP数据包-Centos 6.6_C_Linux_Sockets_Networking_Tcp - Fatal编程技术网

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

原始套接字中的TCP数据包-Centos 6.6,c,linux,sockets,networking,tcp,C,Linux,Sockets,Networking,Tcp,我尝试执行TCP通信,并在另一端使用原始套接字捕获数据包 我将窗口大小设置为50000字节。以最大速率发送TCP流量时。我在wireshark中观察到大约每12个数据包(1512字节数据包)发送一个ACk 在原始套接字中接收数据包时。我期望有12个数据包,就像我在wireshark中一样(我相信wireshark也使用原始套接字)。但我惊讶地看到有一个包包含发送数据流 据我所知,原始套接字应该以数据包的形式接收数据,这些数据包是通过有线传输的,而不是TCP流 我使用下面的原始套接字在端口中接收数

我尝试执行TCP通信,并在另一端使用原始套接字捕获数据包

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

在原始套接字中接收数据包时。我期望有12个数据包,就像我在wireshark中一样(我相信wireshark也使用原始套接字)。但我惊讶地看到有一个包包含发送数据流

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

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

  rawsd = socket(PF_PACKET, SOCK_RAW, ETH_P_ALL);

这是否与tcp_包装器和OS tcp配置有关。

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

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

这是我观察到的答案

Linux Eth端口具有设置“tcp分段卸载”的配置

启用tcp分段卸载时,无论MTU配置如何,数据包都作为完整数据段在eth端口中聚集在一起

   ethtool -K eth1 rx on tx on
在禁用tcp分段卸载时,数据包不在eth端口中处理,MTU大小的数据包在原始套接字中接收

   ethtool -K eth1 rx off tx off

谢谢

你说的整件垃圾是什么意思?Tcp以流而不是数据包的形式发送和接收数据是什么让你认为你会收到12个数据包?另外,我不认为wireshark使用原始Socketsorry垃圾意味着我在整个流中而不是在包中接收它。我可以理解TCP在流中发送和接收数据,但原始套接字将捕获特定端口上接收的数据包。Wirkshark使用libpcap,而inturn使用原始套接字。是的,但是你将得到整个数据包,然后你必须解析报头,得到数据包长度,更新报头指针,以使用libpcap i beleivet之类的库正确到达数据。那么,wireshark怎么可能单独显示实际传输的数据包呢在电线上。你的意思是说,原始套接字在较低的层中确实得到了这样的数据包。在电线上它们是位。从软件的角度来看,驱动程序的较低层并不关心这一点。。我认为wireshark使用libpcap,它使用原始套接字。如果是原始套接字,那么它们如何以数据包的形式而不是流的形式显示TCP。我认为这完全偏离了轨道。我从中添加了代码。我希望这有帮助,如果答案不正确,我很抱歉。好的,我浏览了一些网站。了解到libpcap不同于原始套接字。还发现原始套接字捕获数据包与上层协议无关。如果是这样的话,数据包应该作为数据包计数而不是流来接收。我认为数据包缓冲在内核中,如果您想将它们作为数据包而不是流来读取,则必须使用一些内核模块来获取数据包。您可以在libpcap git存储库中搜索关键字,如RAW_SOCKET,并读取包含关键字的文件以了解该机制。
   ethtool -K eth1 rx off tx off