【问题标题】:How to check return packet contents in ICMP Ping / Echo?如何检查 ICMP Ping / Echo 中的返回数据包内容?
【发布时间】:2008-11-26 16:21:17
【问题描述】:

在验证 ping 回显时,实用程序/库似乎通常只检查数据包的校验和,而实际上并没有确认发出的有效负载与返回的有效负载匹配。例如,Wireshark 的 ICMP 解析器只检查错误的校验和,而这也是 Ruby 的 net-ruby 检查的全部内容。

我正在调试一个低级网络驱动程序问题,我需要确认收到的数据没有被破坏,所以我想使用低级请求(例如ICMP Echo)来测试我的驱动程序。但是,我现有的 Ping 工具是不够的,因为我担心校验和可能与回显响应中包含的数据匹配,而回显响应中的数据与回显请求中的数据不匹配。因此,即使它们都有有效的校验和(校验和代码中没有错误),数据接收部分也存在错误,因此我的驱动程序没有收到主机认为它发送的内容。

如何检查回显负载以确认它与我发送的相同?如果有一个独立的“paranoid ping”实用程序可供我使用,那也很好——我只需要能够改变 ping 的长度和频率,因为我只在网络泛滥时才看到问题。

我更喜欢 Ruby 库/sn-p 的形式,但任何语言或独立应用程序都是可以接受的,只要我能硬塞到它在 Windows 上运行。

谢谢!

【问题讨论】:

    标签: ruby ping icmp


    【解决方案1】:

    我认为您错过了校验和的要点。校验和的目的是验证数据是否完整。发送方根据数据计算校验和,并与数据一起发送。接收方从数据中重新计算校验和,并将其与发送的校验和进行比较。如果它们不匹配,则数据不完整,或者两者之一计算错误。大多数情况下,错误的校验和不会导致数据包丢失,因为那里有很多损坏的协议栈,当然还有数据包管理器,它们不会修复校验和,但如果双方都碰巧做到了,那么校验和检查告诉你数据是完整的。

    您查看的是 TCP 校验和还是 ICMP 校验和? ICMP 校验和不包括 TCP 标头,仅包括 ICMP 类型、代码、校验和和数据字段。 TCP 校验和失败并不一定意味着 ICMP 内容不完整,它可能只是意味着 TCP 标头被弄乱了(也许是被损坏的 NAT)。

    【讨论】:

      【解决方案2】:

      @Tom:感谢您的回答。你说:

      接收方从数据中重新计算校验和,并将其与发送的校验和进行比较。

      但是你也说过:

      ICMP 校验和不包括 TCP 标头,仅包括 ICMP 类型、代码、校验和和数据字段。

      回显请求/响应之间的ICMP类型不同(一个是0,另一个是我认为的8)。因此,根据定义(实际上,如果您使用 Wireshark 看看)ICMP 校验和在发送请求和回显响应之间不匹配。

      我的问题是,如果 ping 实用程序/库检查了任何内容(通常他们没有),他们只检查以确保校验和与数据匹配。似乎很少有人真正使用回显响应检查发送的数据,以确保两个有效负载相同。请求和响应都可能具有有效的校验和,但有效载荷不同,而且我见过的大多数 Ping 例程都没有检查过这种情况(但它恰好是我遇到的那种错误)设备)。

      感谢您查看我的问题并做出回应——非常感谢。

      @全部:

      在回答我自己的问题时,我能够使用强大的 .Net Ping 类,因为它让我可以随时访问接收到的响应缓冲区(与我发现的大多数其他 Ping 库不同)。

      【讨论】:

        猜你喜欢
        • 2018-09-05
        • 1970-01-01
        • 2016-06-15
        • 1970-01-01
        • 2021-06-18
        • 2018-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多