【问题标题】:Easy way to create fragmented IPv4 packets创建分段 IPv4 数据包的简单方法
【发布时间】:2011-01-09 09:48:30
【问题描述】:

我目前正在研究网络堆栈,并且正在尝试实现 IPv4 分段。虽然我有一个理论上可行的实现,但我想通过向它抛出实际的碎片数据包来实际测试它是否有效。

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

【问题讨论】:

标签: windows network-programming fragmentation


【解决方案1】:

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

    ping -l 2000 192.168.0.1

对于 linux,应该是:

    ping -s 2000 192.168.0.1

【讨论】:

    【解决方案2】:

    我最终编写了自己的小应用程序来发送一个 n 大小的数据包。我降低了我正在测试的网段的 MTU,堆栈接收并重组了碎片数据包。

    我发现执行此操作的大多数软件都需要在目标计算机上安装一个侦听器,这对于我正在进行的测试来说是不可信的。

    【讨论】:

      【解决方案3】:

      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。
      • TCP 数据报不被 netcat 分片,序列号用于在目的节点重组数据块。

      我没有机会尝试 Windows 等价物,但它很可能也会产生碎片。鉴于这个问题无论如何是在十年前提出的,“Windows”限制可能不再重要了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-18
        • 2015-07-17
        • 2016-04-05
        • 1970-01-01
        • 2021-12-14
        • 2018-01-10
        • 2019-01-18
        相关资源
        最近更新 更多