7.7. 校检和

很多协议使用校检和来验证数据的完整性/正确性。

[提示]提示

应用校检和在这里也被成为redundancy check(冗余校检?)

校检和是做什么的?

校验和是用来验证传输数据或存储数据的数据部分的正确性。一个检验和是数据部分进行摘要计算的出的数字。

网络数据在传输过程中经常会产生错误,例如数据错误,字节重复等。数据接收方可能。

正因为传输过程中会伴随错误,网络协议会经常使用校验和检测这些错误。发送方会对数据进行检验和计算,并将数据和检验和一起发送。接收方使用同样的方法计算数据部分的校验和,如果收到的校验和计算出来的校验和不匹配,就表示数据有错误。

有些校验和方法可以通过计算得出发生需要被修复错误的数据位置,并修复(简单的)错误。

如果那些错误无法修复,接收方会丢弃错误的数据包。根据协议的不同,数据丢失会仅仅被丢弃,也有可能发送端会根据数据丢失情况重传需要的数据包。

使用校验和可以大量减少传输错误数量。但任何检验和算法都无法确保100%检测到所有错误,依然有少量的错误会无法被检测到。

校验和的算法有很多,例如最经常被使用的检验和算法CRC32(循环冗余校验)。特的的网络协议选择的校验算法取决于希望网络媒介达到的出错率上限、错误检测的重要性,处理载入计算的性能,其他方面需要的性能。

关于检验和的更多信息可以参考:http://en.wikipedia.org/wiki/Checksum

7.7.1. Wireshark校检和验证

Wireshark会对很多协议进行检验和验证,如:TCP、IP。。。

它会和"normal receiver"做一样的计算.然后在包详情面板显示检验和字段的内容,e.g.:[correct], [invalid, must be 0x12345678] 以及其他类似的内容。

如果校验和验证选项被打开或正在进行校验和检测,合并包特性不会被执行。这是为了避免错误的的连接数据扰乱内部数据。

7.7.2. Checksum offloading

检验和计算可能由网络网络驱动,协议驱动,甚至是硬件完成。

例如:以太网传输硬件计算以太网循环容易校验,接受硬件验证这个校验。如果接受验证发现错误,Wireshark将不会接收到这个包,以太网硬件会直接丢弃这个包。

高层校验通常是由协议执行,并将完成后的包转交给硬件。

比较新的网络硬件可以执行一些高级功能,如IP检验和计算,这被成为checksum offloading。网络驱动不会计算校验和,只是简单将校验和字段留空或填入无效信息,交给硬件计算。

[注意]注意

checksum offloading经常会导致混乱,因为网络包在检验和计算之前转交给Wireshark。Wireshark得到包的检验和字段是空的,必然会显示检验和错误,尽管这个包在从网络硬件发出的时候是带有校验和的。

Checksum offloading会引起混淆,让你屏幕上看到大量的[invalid]信息,引起你的反感。前面提到过,错误的检验和会导致包无法合并,更难进行包数据分析。

你可以采取两种方法避免Checksum offloading 问题

  • 在驱动程序上关闭checksum offloading选项,如果可用的话。[16]

  • 通过首选项关闭Wireshark上特定协议的校验和验证。



[16] 在Windows平台如果驱动支持,应该是计算机管理->设备管理器->网络适配器->对应网卡的属性-高级选项