IP Header Checksum
IP Header Checksum顾名思义,只计算IP头部字段的校验和,参照《计算机网络——自顶向下方法:第四版》中的说法,IP Header Checksum的计算方法——通过IP Header生成Checksum——为:
- 计算前把Checksum字段置0;
- 将IP Header中每两个连续的字节当成一个16bit数,对所有的16bit数进行求和,在求和过程中,任何溢出16bit数范围的求和结果都需要进行回卷——将溢出的高16bit和求和结果的低16bit相加;
- 对最终的求和结果按位取反,即可得到IP Header Checksum
IP Header Checksum的验证方法为:
- 只需进行Checksum计算中的第二步,若最终结果为
0xFFFF
则说明IP Header无差错。
TCP/UDP Checksum
TCP/UDP Checksum的计算方法和IP Header Checksum的计算方法类似,不同点如下:
- TCP/UDP的有效载荷(payload)会参与Checksum的计算;
- TCP/UDP会额外将一个伪首部加入计算,伪首部包括:32bit的源/目的IP地址,8bit的补零,8bit的协议号,以及16bit的TCP/UDP报文长度(头+数据)
- 在计算过程中,TCP/UDP报文总字节数可能为奇数,最后剩余的单个字节直接和中间结果相加(相当于高8bit补0)
!!!注意:计算/验证Checksum时,都是对网络字节序表示的数据包直接进行计算