代码之家  ›  专栏  ›  技术社区  ›  HanClinto

如何检查ICMP Ping/Echo中的返回数据包内容?

  •  1
  • HanClinto  · 技术社区  · 16 年前

    net-ruby

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

    我更喜欢Ruby库/代码段的形式,但任何语言或独立应用程序都是可以接受的,只要我能强迫它在Windows上运行。

    2 回复  |  直到 3 年前
        1
  •  1
  •   Tom Lahti    16 年前

    我认为你没有抓住校验和的要点。校验和的目的是验证数据是否完整。发送方根据数据计算校验和,并将其与数据一起传输。接收器根据数据重新计算校验和,并将其与发送的校验和进行比较。如果它们不匹配,那么数据就不完整,或者两者中的一个计算错误。大多数情况下,错误的校验和不会导致数据包丢失,因为存在大量损坏的协议栈,当然,数据包管理器也不能修复校验和,但是如果双方都正确地进行了校验和,那么校验和检查会告诉您数据是完整的。

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

        2
  •  0
  •   HanClinto    16 年前

    @汤姆:谢谢你的回答。你说:

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

    但是你还说:

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

    我的问题是,如果ping实用程序/库检查了任何东西(通常没有),它们只检查以确保校验和与数据匹配。似乎很少有人真正用echo的响应检查发送的数据,以确保两个有效负载相同。请求和响应可能都有有效的校验和,但有效负载不同,我见过的大多数Ping例程都没有检查这种情况(但这恰好是我目前设备上存在的那种bug)。

    谢谢你看了我的问题并回答了我的问题,非常感谢。

    .Net Ping 类,因为它使我可以随时访问接收到的响应缓冲区(与我发现的大多数其他Ping库不同)。