实际上,我有两个相关的问题。
我在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
同样适用于eth1
和br0
- eth0
和eth1
之间的网桥,我正在嗅探。
我仍然收到大量的UDP数据包。
答案 0 :(得分:7)
您的网络适配器可能正在进行TCP分段/解除分段卸载和IP分段/重组卸载,因此:
所以libpcap看到的是不以太网数据包,并且不仅限于以太网帧大小。
(即,Nikolai Fetissov可能是正确的;您收到的内容可能看起来像以太网帧,但那是因为网络适配器和驱动程序使它们看起来那样。事实上,它们是不是在以太网上传输或从以太网接收的以太网帧。)
您只能通过使用ethtool
命令关闭网络适配器上的任何形式的分段/解除分段/分段/重组来禁止它们;关闭TCP Segementation Offload,UDP Fragmentation Offload,General Segmentation Offload,Large Receive Offload和Generic Receive Offload等选项。
一旦你禁用了这些选项,就不应再拥有那些大数据包,因此你应该可以毫无问题地重放它们。那里 没有简单的方法可以重放到目前为止你已经捕获的重新组合/未分段或分段的数据包 - 你必须编写自己的代码来对它们进行分段,并且不能保证它们将被重新分段/重新分段,就像它们最初在线路上被分段/分段一样。
答案 1 :(得分:4)
¿你是否正在使用wireshark进行捕获?
这一点非常重要,因为默认情况下wireshark会重新组合碎片化的ip数据报(并将它们存储在pcap文件中,作为重新组装的MTU-higger单个软件包而不会出现碎片)。 要禁用:
编辑 - >首选项>协议 - > IPv4的>并取消选中“重新组合碎片化的IPv4数据报”。