校验和计算:
1.对所有需要进行校验的数据(校验和部分全部置0),每16bit分成一组。
2.对所有的组,依次按位求和,求和时如有溢出,则进行回卷。
3.对所求的和进行反码运算。
4.将反码后所得数据填入校验和位置。
具体例子参考RFC:https://tools.ietf.org/html/rfc1071
以下列出了校验和的计算过程,最后一列为网络字节顺序(高低字节Swapped)
Byte-by-byte "Normal" Swapped
Order Order
Byte 0/1: 00 01 0001 0100
Byte 2/3: f2 03 f203 03f2
Byte 4/5: f4 f5 f4f5 f5f4
Byte 6/7: f6 f7 f6f7 f7f6
--- --- ----- -----
Sum1: 2dc 1f0 2ddf0 1f2dc
dc f0 ddf0 f2dc
Carrys: 1 2 2 1
-- -- ---- ----
Sum2: dd f2 ddf2 f2dd
Final Swap: dd f2 ddf2 ddf2
注:接收端收到之后,对需要进行校验的部分(含校验和部分),16bit 一组,依次按位求和,得到11111111111 则校验通过。
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 | +--------+--------+--------+--------+
相关链接:
有抓包,有C程序实现
http://blog.csdn.net/weiweiliulu/article/details/17923043
解释了校验和为什么需要伪头部
http://blog.csdn.net/baidu_27386223/article/details/47678979