2

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

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

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

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

谢谢!

4

2 回答 2

1

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

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

于 2008-11-26T20:37:08.073 回答
0

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

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

但是你也说:

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

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

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

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

@全部:

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

于 2008-11-26T21:48:51.470 回答