IP、TCP、UDP校验和计算

校验和计算:
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校验和计算_第1张图片

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 图供参考,图片来源网络:
IP、TCP、UDP校验和计算_第2张图片

相关链接:
有抓包,有C程序实现
http://blog.csdn.net/weiweiliulu/article/details/17923043
解释了校验和为什么需要伪头部
http://blog.csdn.net/baidu_27386223/article/details/47678979

你可能感兴趣的:(网络安全,tcp-ip)