我们发现IP、UDP和TCP协议报文头部都有校验和字段,大小都是16bit.
那么这个校验和是如何进行校验的呢?
这里我们简单介绍两种实际使用的校验和算法 crc 和 md5.
1.crc :循环冗余校验
有一串数据,把它当成二进制的数据,依次按照字节为单位,取出数据进行累加.
代码实现类似于:
加着加着可能就溢出了,溢出部分就不要了.
传输数据的时候,把数据和算出来的值(crc校验和)也传给接收方. 接收方同时收到了( 数据+crc校验和),这时接收方就需要验证一下啊,看看当前的数据是否是对的,就按照同样的算法再针对得到的数据部分计算一边crc校验和,把新的计算结果和收到的crc校验和进行对比,看结果是否一致.
这个操作本质上就是在发送前和接收后都算一遍crc.
如果发送的和接收的数据内容不变,得到的crc结果也就是一致的.
如果传输过程中出现了问题(比特翻转)导致数据内容发生改变,此时算出来的2份crc也就大概率不相同(有一丢丢的概率相同,这个概率很小).
2.md5 算法
md5算法应用的场景非常多,用来作为校验和只是其中的一个场景而已.
md5本质上是一个"非对称的哈希算法" .
md5算法的特性:
1.定长: 无论输入的字符串是多长,得到的md5的值都是固定长度.
2.分散: 只要输入的字符串只变化了一点点,得到的md5的值都会差别巨大.(这个性质是作为哈希算法的核心)
3.不可逆: 给定原串很容易得到md5的值,但是给定md5的值,理论上是无法恢复出原始的字符串的.
md5算法常见的使用场景:
1.作为hash算法.
2.作为校验和. (很多场景,传输大文件,都会使用md5作为校验和算法,因为md5的分散的特性,数据只要发生了一丢丢的改变,得到的md5的值都差很多.两个字符串md5的值一致的概率非常低,比crc 中相同的概率要低很多)
3.应用于一些密码学场景...