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

And*_*hko 9 networking network-programming ethernet pcap

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

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

这些数据包远大于默认MTU的原因是什么? 巨型帧?这篇维基百科的文章指出"能够使用巨型帧的网络接口卡需要显式配置才能使用巨型帧",但我不知道任何这样的配置.还ifconfig告诉我"MTU:1500".可以将其与"中断结合"技术(或"中断合并"在以某种方式相关文章)?我能压抑这样的包裹吗?

那么,问题#2:

如何pcap_sendpacket在Windows上发送此类数据包?我收到错误消息"发送错误: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
Run Code Online (Sandbox Code Playgroud)

同样的- eth1br0- 我之间的网络桥梁eth0eth1我正在嗅探.

我仍然收到大量的UDP数据包.

小智 7

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

  • 您的计算机发送的大于适合单个以太网帧的UDP数据包将被传递到网络适配器而不会被分段,网络适配器会进行分段,并且这些数据包在分段之前也会被传递给libpcap;
  • 网络适​​配器接收的UDP片段大于适合单个以太网帧的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等选项.

一旦禁用了这些选项,就不应再拥有那些大数据包,因此您应该能够毫无问题地重放它们.这里没有简单的方法来重播到目前为止已拍摄的重组/未分片,或分段包-你必须编写自己的代码进行分段他们,而且也不能保证他们会被重新支离破碎/重新分段,就像它们最初在线上分段/分段一样.


Jon*_*tez 4

\xc2\xbf你是用wireshark抓包吗?

\n\n

这很重要,因为默认情况下,wireshark 会重新组装碎片化的 ip 数据报(并将它们作为重新组装的 MTU-higger 单个包存储在 pcap 文件中,而不会产生碎片)。\n要禁用:

\n\n

编辑 -> 首选项 -> 协议 -> ipV4 -> 并取消选中“重新组装分段 IPv4 数据报”。

\n