才子佳人博客

我的故事我讲述

详解TCP/IP包头二进制反码求和校验算法
 
来源:xjh  编辑:xjh  2017-10-27

计算IP或者是UDP报头校验和时,为什么会用反码和,而不是直接求和呢?或者是补码和呢?下面总结这个校验和算法具体是怎么实现的。

首先,IP、ICMP、UDP和TCP报文头都有检验和字段,大小都是16bit,算法基本上也是一样的。

在发送数据时,为了计算数据包的校验和。应该按如下步骤:

1、把初始校验和字段设置为0;

2、把需要校验的数据连同初始校验字段一起看成16位字串,依次进行二进制反码求和;

3、把得到的结果存入校验和字段中。

在接收数据时,计算数据包的校验和同理,按如下步骤:

1、把需要校验的数据连同校验字段一起看成16位字串,依次进行二进制反码求和;

2、检查计算出的校验和的结果是否为全1;

3、如果等于全1,说明校验和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。

虽然说上面四种报文的校验和算法一样,但是在作用范围存在不同:

IP校验和只校验20字节的IP报头;而ICMP校验和覆盖整个报文(ICMP报头+ICMP数据);UDP和TCP校验和不仅覆盖整个报文,而且还有12个字节的IP伪首部,包括源IP地址(4字节)、目的IP地址(4字节)、协议(2字节)、TCP/UDP包长(2字节)。另外UDP、TCP数据报的长度可以为奇数字节,所以在计算校验和时需要在最后增加填充字节0(填充字节只是为了计算校验和,可以不被传送)。在UDP传输协议中,校验和是可选的,当校验和字段为0时,表明该UDP报文未使用校验和,接收方就不需要校验和检查了!

什么是二进制反码求和?

对一个无符号数,先求其反码,然后从低位到高位,按位相加,有进位则向高位进1(和一般的二进制法则一样),但若最高位有进位,则向最低位加1。

首先这里的反码好像和以前学的有符号反码不一样,这里不分正负数,直接每个位都取反。

注意:这里的加法法则不一样,最高位有进位,则向最低位加1。确实有些疑惑,为什么要这样呢?自习分析一下。

以4bit(计算方便一点,和16bit是一样的)做检验和来验证。

假设原始数据为 1100 , 1010 , 0000(校验位)

那么把他们按照4bit一组进行按位取反相加。 1100 取反0011 , 1010 取反是0101,0000取反是1111,校验位的计算就是 0011+0101+1111 结果是1000,填入到校验位上。

于是发送的数据就是:1100 , 1010 , 1000

接收端收到数据后同样进行按位取反相加。0011+0101+0111 =1111;全为1表示正确 。

结论:自己加上自己的取反,那么结果肯定应该是全1 ,即反码和+反码和取反 = 全1,如果传输正确的话。

来源:
http://blog.csdn.net/dingmin1860/article/details/48268927
http://blog.csdn.net/u012063703/article/details/45850343


分类:网络日志| 查看评论
相关文章
文章点击排行
本年度文章点击排行
发表评论:
  • 昵称: *
  • 邮箱: *
  • 网址:
  • 评论:(最多100字)
  • 验证码: