【问题标题】:TCP Packets in Raw socket - Centos 6.6原始套接字中的 TCP 数据包 - Centos 6.6
【发布时间】:2015-04-02 07:41:02
【问题描述】:

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

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

在原始套接字中接收数据包时。我希望有 12 个数据包,就好像我进入了 Wireshark(我相信 Wireshark 也使用原始套接字)。但是我很惊讶地看到一个带有发送数据流的数据包。

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

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

  rawsd = socket(PF_PACKET, SOCK_RAW, ETH_P_ALL);

这是否与 tcp_wrapper 和操作系统 tcp 配置有关。

【问题讨论】:

  • 整个垃圾是什么意思? Tcp 以流而不是以数据包的形式发送和接收数据是什么让您认为您会收到 12 个数据包?另外我不认为wireshark使用原始套接字
  • 对不起垃圾意味着我在整个流而不是数据包中接收它。我可以理解 TCP 在流中发送和接收数据,但 RAW 套接字将捕获特定端口上接收的数据包。 Wirkshark 使用 libpcap,而 libpcap 又使用 RAW 套接字。
  • 是的,但是你会得到整个数据包,然后你必须解析头获取数据包长度正确更新头指针以使用 libpcap 之类的库访问数据我相信
  • 那么单独使用wireshark 怎么可能显示实际以有线方式传输的数据包。您的意思是 RAW 套接字确实在较低层获取数据包。
  • 在电线上它们是位。网络底层 软件角度的驱动不关心

标签: c linux sockets networking tcp


【解决方案1】:

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

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

【讨论】:

  • 是这样吗..我认为wireshark使用libpcap,而libpcap又使用RAW套接字。如果是原始套接字,那么它们如何以数据包而不是流的形式显示 TCP。
  • 我认为这完全不正常。
  • 我从libpcap git repository 添加了代码。我希望这会有所帮助,如果答案不正确,我深表歉意。
  • 好的,我浏览了一些网站。才知道 libpcap 与 RAW 套接字不同。还发现RAW套接字捕获数据包与上层协议无关。如果是这样,数据包应该作为数据包计数而不是作为流接收。
  • 我认为数据包在内核中缓冲,如果你想将它们作为数据包而不是流读取,你必须使用一些内核模块来获取数据包。您可以在 libpcap git 存储库中搜索 RAW_SOCKET 之类的关键字,并读取包含关键字以了解机制的文件。
【解决方案2】:

这是我观察到的答案。

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

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多