当验证ping echo时,似乎实用程序/库通常只检查数据包的校验和,并且实际上不确认发送的有效负载是否与返回的有效负载匹配。例如,Wireshark的ICMP解析器只检查错误的校验和,这就是Ruby的net-ruby检查的全部内容。
我正在调试低级网络驱动程序问题,我需要确认数据在收到时没有被破坏,所以我想使用{{3}这样的低级请求来测试我的驱动程序}。但是,我现有的Ping工具不够用,因为我担心虽然校验和可能与echo响应中包含的数据匹配,但echo响应中的数据与echo请求中的数据不匹配。因此,即使它们都具有有效的校验和(校验和代码中没有错误),数据接收部分也会出错,这样我的驱动程序就不会收到主机认为发送的内容。
我如何检查回声有效负载以确认它与我发出的相同?如果有一个我可以使用的独立“偏执ping”实用程序,那也没关系 - 我只需要能够改变ping长度和频率,因为我只看到网络淹没时的问题。
我更喜欢它以Ruby库/代码段的形式,但任何语言或独立应用程序都是可以接受的,只要我可以将其用于在Windows上运行。
谢谢!
答案 0 :(得分:1)
我认为你错过了校验和的重点。校验和的目的是验证数据是否完整。发送方根据数据计算校验和,并将其与数据一起发送。接收器根据数据重新计算校验和,并将其与发送的校验和进行比较。如果它们不匹配,则数据不完整或两者中的一个计算错误。大多数情况下,错误的校验和不会导致数据包丢失,因为那里存在大量已损坏的协议堆栈,当然还有数据包管理器并且没有修复校验和,但如果双方确实正确地执行了它,那么校验和检查告诉你数据完好无损。
您是在查看TCP校验和还是ICMP校验和? ICMP校验和不包括TCP标头,仅包括ICMP类型,代码,校验和和数据字段。 TCP校验和失败并不一定意味着ICMP内容不完整,它可能只是意味着TCP标头被搞乱(可能是破坏的NAT)。
答案 1 :(得分:0)
接收方从数据中重新计算校验和,并将其与发送的校验和进行比较。
但是你还说:
ICMP校验和不包括TCP标头,仅包括ICMP类型,代码,校验和和数据字段。
回声请求/响应之间的ICMP类型不同(一个是0,另一个是我认为8)。所以根据定义(实际上,如果你看一下Wireshark)ICMP校验和在发送请求和回应响应之间不匹配。
我的问题是,如果ping实用程序/库检查了任何内容(通常它们没有检查),他们只检查以确保校验和与数据匹配。似乎很少人们实际上使用echo'd响应检查发送的数据,以确保两个有效负载是相同的。请求和响应都可能具有有效的校验和,但不同的有效负载,以及我见过的大多数Ping例程都没有检查过这种情况(但它碰巧是我遇到的那种错误)此刻的设备)。
感谢您查看我的问题并做出回应 - 非常感谢。
@All:
在回答我自己的问题时,我能够使用健壮的.Net Ping类,因为它让我可以随时访问收到的响应缓冲区(与我发现的大多数其他Ping库不同)。