TCP头部校验和算法
TCP checksum方法类似于IP-header checksum(不清楚可以参照上篇文章)
但是TCP需要在校验时加入一个伪IP头部一起校验以防止数据的误传
这个伪IP头部的格式为:
octet octet octet octet
+--------+--------+--------+--------+
| Source Address |
+--------+--------+--------+--------+
| Destination Address |
+--------+--------+--------+--------+
| zero | PTCL | TCP Length |
+--------+--------+--------+--------+
PTCL:为PID
TCP Length=IP total length – IP Header length=73-20=53=0x0035
计算方法为:
1. 将TCP 头部校验和部位值置为全0
2. 将伪IP头部+TCP-header+TCP数据 以16bit为单位从前向后做加法运算
如果尾部数据不足16bit 则填充右边位数至16bit
3. 此后等同IP包头校验和处理
实例:(紫色为伪IP头部+TCP头部;绿色为上面TELNET数据)
8121A=0008+121A=1222
0x1222
= 1 0010 0010 0010
= 0001 0010 0010 0010
反 1110 1101 1101 1101
= 0xEDDD
所有校验值算法的目的都是做完整性检查,所以在算法都是尽量简单,减少数据处理检查时间。
所以,对于整个数据完整性的校验发生在2层与4层,3层IP头部校验只是检查IP头部空间是否被破坏的目的也是在确认数据传输中所需参数正确的情况下,尽快将数据转发掉,减少延迟。在后期的MPLS头部中甚至省掉了校验字段,也都是出于快速转发的目的考虑。
转载于:https://blog.51cto.com/nature0923/589406