在巨著《TCP/IP详解1》中有这样一句话:“ICMP,IGMP,UDP and TCP all use the same checksum algorithm”。的确,检验和算法在TCP/IP协议族中大同小异。其过程大致都是:接收方通过判断检验和是否一致,进一步判断该数据包头部传输过程中是否丢失或者被污染了。本文将以IP协议首部(见下图)为例简单介绍检验和算法:
简单地说,检验和是一个16位字段,即上图中16位首部检验和。通过设置该字段取值,将该IP首部是否完整的信息携带其中。
如何设置检验和呢?或许有许多方法,目前,最为流行的一种方法是这样的。首先在发送端计算检验和,将其与IP数据包一起发出,接收端对该数据包头部进行相应的处理,得到检验和大小,从而判断数据包头部是否完整。
检验和算法可以分成两步来实现。首先在发送端,有以下三步:
- 把即将发送的IP头部中的检验和设置为0,然后以16位为一个间隔,将IP头部分成许多个16位的字段;
- 将第1步获得的所有字段进行二进制相加求和;
- 把最终结果取反,就得到检验和,再将该值填充到IP头部。