校验和计算:
1.对所有需要进行校验的数据(校验和部分全部置0),每16bit分成一组。
2.对所有的组,依次按位求和,求和时如有溢出,则进行回卷。
3.对所求的和进行反码运算。
4.将反码后所得数据填入校验和位置。
具体例子参考RFC:https://tools.ietf.org/html/rfc1071
以下列出了校验和的计算过程,最后一列为网络字节顺序(高低字节Swapped)
Byte-by-byte "Normal" SwappedOrder OrderByte 0/1: 00 01 0001 0100Byte 2/3: f2 03 f203 03f2Byte 4/5: f4 f5 f4f5 f5f4Byte 6/7: f6 f7 f6f7 f7f6--- --- ----- -----Sum1: 2dc 1f0 2ddf0 1f2dcdc f0 ddf0 f2dcCarrys: 1 2 2 1-- -- ---- ----Sum2: dd f2 ddf2 f2ddFinal Swap: dd f2 ddf2 ddf2
注:接收端收到之后,对需要进行校验的部分(含校验和部分),16bit 一组,依次按位求和,得到11111111111 则校验通过。
IP 校验和计算:
IP校验和:仅对IP首部进行校验,校验方法如上。
TCP/UDP校验和计算:
TCP校验和:对TCP首部,数据部分,伪首部进行求和。
UDP校验和:对UDP首部,数据部分,伪首部进行求和。
TCP/UDP计算方法和IP保持一致,其中伪首部格式如下:
0 7 15 23 31
+--------+--------+--------+--------+
| source address |
+--------+--------+--------+--------+
| destination address |
+--------+--------+--------+--------+
| zero |protocol| TCP/UDP length |
+--------+--------+--------+--------+
以下UDP 图供参考,图片来源网络:
相关链接:
有抓包,有C程序实现
http://blog.csdn.net/weiweiliulu/article/details/17923043
解释了校验和为什么需要伪头部
http://blog.csdn.net/baidu_27386223/article/details/47678979