【问题标题】:How to send packets larger than 1500 bytes by pcap_sendpacket?如何通过 pcap_sendpacket 发送大于 1500 字节的数据包?
【发布时间】:2012-02-13 14:40:47
【问题描述】:

其实,我有两个相关的问题。

我正在 Debian 上捕获由 libpcap 过滤的网络流量。然后我需要在 Win2k3 服务器上重放这个流量。有时我会捕获远大于 1500 字节(以太网的默认 MTU 大小)的 TCP 和 UDP 数据包。例如,2000+ 字节。我没有对该 Linux 上的 MTU 大小进行具体更改。所以问题 #1:

这些数据包比默认 MTU 大得多的原因是什么? Jumbo frames?这篇维基百科文章指出“能够支持巨型帧的网络接口卡需要显式配置才能使用巨型帧”,但我不知道有任何此类配置。 ifconfig 还向我显示“MTU:1500”。它是否与“中断组合”技术(或this article 中的“中断合并”)有某种关联?我可以抑制这样的数据包吗?

那么,问题 #2:

如何在 Windows 上通过 pcap_sendpacket 发送此类数据包? 我收到错误消息“发送错误:PacketSendPacket 失败”,仅针对大于 1500 字节的数据包。似乎我不能使用巨型帧,因为我正在将数据发送到直接连接的自定义“net tap”,比如 pci 卡,而且我不确定我是否可以配置它的 NIC。还有什么?我应该根据协议规则对这些数据包进行分段吗?

编辑:

按照 Guy Harris 的建议,由 NIC 检查碎片:

~# ethtool -k eth0
Offload parameters for eth0:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp-segmentation-offload: off
udp-fragmentation-offload: off
generic-segmentation-offload: off
generic-receive-offload: off
large-receive-offload: off
ntuple-filters: off
receive-hashing: off

eth1br0 也是如此 - 我正在嗅探eth0eth1 之间的网桥。

我仍然收到大的 UDP 数据包。

【问题讨论】:

  • pcap 可能正在为您将分片的数据报从有线数据包中重新粘合到一个块中。检查您是否可以要求它为您提供以太网帧而不是传输数据包。
  • @NikolaiNFetissov:我正在接收以太网帧

标签: networking network-programming pcap ethernet


【解决方案1】:

您的网络适配器可能正在执行 TCP 分段/取消分段卸载和 IP 分段/重组卸载,所以:

  • 由您的计算机发送的大于单个以太网帧的 UDP 数据包将被传递给网络适配器而不进行分段,网络适配器进行分段,并且在分段之前也将这些数据包传递给 libpcap ;
  • 网络适配器接收到的大于单个以太网帧的 UDP 片段将由网络适配器重新组装,然后再交给主机,并在重新组装后交给 libpcap;
  • 您的机器发送的 TCP 流数据块太大而无法放入单个以太网帧,这些数据块将被交给网络适配器,网络适配器将这些数据块分成更小的 TCP 段,整个数据块是被交给 libpcap;
  • 您的网络适配器接收到的 TCP 数据段被重新组合成更大的 TCP 数据块,这些数据块被交给主机,然后交给 libpcap;

所以 libpcap 看到的是不是以太网数据包,并且受限于以太网帧大小。

(即 Nikolai Fetissov 可能是正确的;您收到的可能看起来像以太网帧,但这是因为网络适配器和驱动程序使它们看起来像这样。事实上,它们是不是在以太网上传输或从以太网接收的以太网帧。)

您只能通过使用ethtool 命令关闭网络适配器上正在执行的任何形式的分段/去分段/分段/重组来抑制它们;关闭 TCP 分段卸载、UDP 分段卸载、常规分段卸载、大型接收卸载和通用接收卸载等选项。

一旦您禁用了这些选项,您就不应该再拥有那些大数据包,因此您应该能够毫无问题地重放它们。 没有简单的方法来重放您迄今为止捕获的重新组装/未分段或分段的数据包 - 您必须编写自己的代码来分段它们,并且不能保证它们将被重新分段/重新分段,就像它们最初在电线上分段/分段一样。

【讨论】:

    【解决方案2】:

    ¿你是在使用wireshark抓包吗?

    这很重要,因为默认情况下,wireshark 会重新组装分段的 ip 数据报(并将它们存储在 pcap 文件中,作为重新组装的 MTU-higger 单个包而无需分段)。 禁用:

    Edit->preferences->Protocols->ipV4->并取消选中“Reassemble fragmented IPv4 datagrams”。

    【讨论】:

    • 我正在通过 libpcap(Wireshark 的核心)捕获。任何信息如何在 libpcap 中禁用它?
    • Libpcap 本身没有这个功能,除非你使用的包已经打了这个补丁 -> seclists.org/tcpdump/2007/q2/112 你可以查看你的libpcap版本或者下载官方版本,而不是使用提供的版本分发(有时他们会应用奇怪的补丁......)
    • +1。 tnx 获取信息,我从源代码构建了最后一个 libpcap,现在我只看到比 MTU 大一点的数据包,1518 字节。似乎是因为以太网拖车。但我仍然无法通过pcap_sendpacket 发送这些数据包。我应该通过删除那个预告片来修改它们吗?
    • 没关系。我需要更大的东西来解释:)。它不是以太网尾部,它仅在数据包小于 64 字节(例如 ARP)时出现,并且由于以太网帧最小大小为 64,它用尾部填充数据包的其余部分(但仅在数据包较小时) .但是,显然这不是你的情况,18 个额外的字节不是填充。 MTU 不是以太网最大帧,而是 DATAGRAM 最大大小 [packetlife.net/blog/2008/nov/5/mtu-manipulation/].
    • [COMES FROM LAST COMMENT] 因此,在框架包中,如果 MTU 为 1500(1460 有效负载 + 20 TCP hdr + 20 IP hdr),则必须加上以太网标头的 14 个字节或18 如果您的以太网帧中有 VLAN (802.1Q) = 1518 字节。这就是为什么你有这种包的原因。 pcap_sendpacket 的问题... :) 它可能是最大大小计算中的错误(不应考虑以太网头大小)。
    猜你喜欢
    • 2016-04-14
    • 2011-06-02
    • 2020-03-24
    • 1970-01-01
    • 2014-12-17
    • 2016-04-30
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多