TCP校验和覆盖TCP首部和TCP数据,还要加上一个12字节的伪首部。计算时先把TCP报头中的校验和字段置为0
计算方法 把伪首部、TCP报头、TCP数据分为16位的字,如果总长度为奇数个字节,则在最后增添一个位都为0的字节。累加所有的16位字。最后结果如果有进位,把高16位移到低16位和低16位进行相加,直到高16位都为0,最后,对计算结果取反,作为TCP的校验和。
上图计算示例:
伪首部
源目的ip地址 : a9fe 5205 a9fe 5263
0字段和tcp协议 : 0006
tcp头和数据长度和: 002a (tcp 头 20B ,数据 22B)
a9fe + 5205 + a9fe + 5263 + 0006 + 002a = 1f894
tcp 头需要把checksum字段置为0计算
dc2c + 2711 + 53dc + 167f + 0077 + cef9 + 5018 + 1000 + 0000 + 0000 = 29d20
数据计算
5468 + 6973 + 2069 + 7320 + 6120 + 5443 + 5020 + 6d65 + 7373 + 6167 + 6500 = 3fe26
计算总和
1f894 + 29d20 + 3fe26 = 893da
总和大于 FFFF
893da -》 8 + 93da = 93e2
按位取反
93e2 1001 0011 1110 0010
6c1d 0110 1100 0001 1101
报文检验和 0x6c1d , 和抓到的报文校验和一致。