我目前正在研究网络堆栈,我正在尝试实现IPv4碎片。虽然我有一个理论上有效的实现,但我想通过在其上抛出实际的碎片包来实际测试它的工作原理。
是否有任何软件或可能是编写代码的简单方法?我宁愿不去修改我正在测试的主机上的MTU,只是为了让它正常工作。我的开发环境是Windows。
答案 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。我没有机会尝试Windows等效版本,但很可能也会产生碎片。鉴于十年前还是有人问过这个问题,“ Windows”限制可能不再重要。