今天痞子衡继续给大家介绍针对 packet 校验的最简单的校验法 - 即和校验法。
一、和校验法基本原理
1.1 校验依据
和校验法的校验依据就是判断一次传输的 n bytes 组成的 packet 的所有 byte 累加和结果(仅截取低 byte)在传输前后是否一致。
1.2 和校验位
为了实现和校验,通常会在传输的这组 n bytes 数据最后插入一个额外的和校验字节(byte),用它来记录这组数据累加和的低 byte 结果。
1.3 校验方法
前面讲到和校验位实际上是 n bytes 数据包的累加和,那么一包数据的长度 n 到底怎么确定呢?为了确定 n,我们通常会在一包数据开始的时候额外插入一个信息位标明当前数据包长度。
在实际应用中,数据包是一包一包连续发送的,如果传输过程中发生数据丢失,则会引起数据包的错位导致接下来一连串数据包的解析错误,如何及时发现数据包错位呢?我们通常还会在数据包最开始的时候再额外插入一个信息位标明一包数据的开始,这个信息位也叫作起始标志字节。
所以最终完整的数据包变成如下格式:
起始标志字节(1 byte) 长度字节(1-2 byte) 原始数据位(n bytes) 和校验字节(1 byte)
有了上述前导信息位,我们便可以准确找到一包数据中的原始数据位进行累加计算得出和,然后与数据包中的校验和字节进行比较验证当前包数据的正确性。
需要注意的是,对于校验和字节,有时候并不一定是数据位所有字节之和结果的原码,也有可能是反码或补码(关于三者区别,请参考痞子衡另一篇文章《整数在计算机中的表示》),需要结合不同校验和应用标准区别对待,否则会导致验证结果有误。