创建分段IPv4数据包的简便方法

时间:2010-01-26 05:33:10

标签: windows network-programming fragmentation

我目前正在研究网络堆栈,我正在尝试实现IPv4碎片。虽然我有一个理论上有效的实现,但我想通过在其上抛出实际的碎片包来实际测试它的工作原理。

是否有任何软件或可能是编写代码的简单方法?我宁愿不去修改我正在测试的主机上的MTU,只是为了让它正常工作。我的开发环境是Windows。

3 个答案:

答案 0 :(得分:2)

我认为最简单的方法是使用ping:

    ping -l 2000 192.168.0.1

对于linux,它应该是:

    ping -s 2000 192.168.0.1

答案 1 :(得分:0)

我最后编写了自己的小应用程序来发送一个n大小的数据包。我减少了我正在测试的网段的MTU,并且堆栈收到并重新组装了碎片包。

我发现这样做的大多数软件都需要目标计算机上的监听器,这对我正在进行的测试来说是不可信的。

答案 2 :(得分:0)

UDP数据报没有序列号,因此发送大量数据可能会导致数据报碎片化。例如,netcat可以在Linux上轻松使用以生成UDP片段:

$ dd if=/dev/zero count=10  |  nc  192.168.0.1  1234

使用tcpdump,我们可以观察到数据报ID,增加的片段偏移和“更多片段”标志的存在:

# tcpdump -i eth0 -vvv udp and not port 53
00:41:35.449822 IP (tos 0x0, ttl 63, id 33788, offset 0, flags [+], proto UDP (17), length 1444)
    192.168.0.2.38920 > 192.168.0.1.1234: UDP, bad length 5120 > 1416
00:41:35.449947 IP (tos 0x0, ttl 63, id 33788, offset 1424, flags [+], proto UDP (17), length 1444)
    192.168.0.2 > 192.168.0.1: udp
00:41:35.449976 IP (tos 0x0, ttl 63, id 33788, offset 2848, flags [+], proto UDP (17), length 1444)
    192.168.0.2 > 192.168.0.1: udp
00:41:35.450000 IP (tos 0x0, ttl 63, id 33788, offset 4272, flags [none], proto UDP (17), length 876)
    192.168.0.2 > 192.168.0.1: udp

一些注意事项:

  • 这在目标节点上不需要任何侦听器。
  • 如果源和目标是同一台机器,则产生不同的结果(似乎没有碎片),例如定位到localhost。可能是因为我的lo接口的MTU为65536。
  • netcat不会对TCP数据报进行分段,序列号用于在目标节点处重组数据块。

我没有机会尝试Windows等效版本,但很可能也会产生碎片。鉴于十年前还是有人问过这个问题,“ Windows”限制可能不再重要。