如何通过pcap_sendpacket发送大于1500字节的数据包?

时间:2012-02-13 14:40:47

标签: networking network-programming pcap ethernet

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

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

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

然后,问题#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数据包。

2 个答案:

答案 0 :(得分:7)

您的网络适配器可能正在进行TCP分段/解除分段卸载和IP分段/重组卸载,因此:

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

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

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

您只能通过使用ethtool命令关闭网络适配器上的任何形式的分段/解除分段/分段/重组来禁止它们;关闭TCP Segementation Offload,UDP Fragmentation Offload,Gen​​eral Segmentation Offload,Large Receive Offload和Generic Receive Offload等选项。

一旦你禁用了这些选项,就不应再拥有那些大数据包,因此你应该可以毫无问题地重放它们。那里 没有简单的方法可以重放到目前为止你已经捕获的重新组合/未分段或分段的数据包 - 你必须编写自己的代码来对它们进行分段,并且不能保证它们将被重新分段/重新分段,就像它们最初在线路上被分段/分段一样。

答案 1 :(得分:4)

¿你是否正在使用wireshark进行捕获?

这一点非常重要,因为默认情况下wireshark会重新组合碎片化的ip数据报(并将它们存储在pcap文件中,作为重新组装的MTU-higger单个软件包而不会出现碎片)。 要禁用:

编辑 - >首选项>协议 - > IPv4的>并取消选中“重新组合碎片化的IPv4数据报”。