当前位置: 技术问答>linux和unix
关于TCP/ip卷一ip协议一段话没看懂!!
来源: 互联网 发布时间:2017-05-17
本文导语: 为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每16bit进行二进制反码求和,结果存放在检验和字段中。当收到一份IP数据包后,同样对首部中每个16bit进行二进制反码求和。由于接收方在计算过程中...
为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每16bit进行二进制反码求和,结果存放在检验和字段中。当收到一份IP数据包后,同样对首部中每个16bit进行二进制反码求和。由于接收方在计算过程中包含了发送方存在首部的检验和,因此如果首部在传输过程中没有发生任何差错,那么接收方计算结果应全为1.
为啥计算结果全为1啊,位运算学的不好,求大神解释解释!!!!
为啥计算结果全为1啊,位运算学的不好,求大神解释解释!!!!
|
一、校验和算法
之前一直只知道IP校验和算法反码求和相关的,但具体细节不清楚,今天了解了下。
IP校验和主要是用来保证数据(IP包头)的完整性的.它用的算法非常简单,就是反码求和校验.需要注意的是反码求和又叫1的补码(one'scomplement),而2的补码就是我们通常说的补码求和了.校验算法具体如下.
1、发送方
i)将校验和字段置为0,然后将IP包头按16比特分成多个单元,如包头长度不是16比特的倍数,则用0比特填充到16比特的倍数;
ii)对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位),将得到的和的反码填入校验和字段;
iii)发送数据包.
2、接收方
i)将IP包头按16比特分成多个单元,如包头长度不是16比特的倍数,则用0比特填充到16比特的倍数;
ii)对各个单元采用反码加法运算,检查得到的和是否符合是全1(有的实现可能对得到的和会取反码,然后判断最终值是不是全0);
iii)如果是全1则进行下步处理,否则意味着包已变化从而丢弃之.
之前一直只知道IP校验和算法反码求和相关的,但具体细节不清楚,今天了解了下。
IP校验和主要是用来保证数据(IP包头)的完整性的.它用的算法非常简单,就是反码求和校验.需要注意的是反码求和又叫1的补码(one'scomplement),而2的补码就是我们通常说的补码求和了.校验算法具体如下.
1、发送方
i)将校验和字段置为0,然后将IP包头按16比特分成多个单元,如包头长度不是16比特的倍数,则用0比特填充到16比特的倍数;
ii)对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位),将得到的和的反码填入校验和字段;
iii)发送数据包.
2、接收方
i)将IP包头按16比特分成多个单元,如包头长度不是16比特的倍数,则用0比特填充到16比特的倍数;
ii)对各个单元采用反码加法运算,检查得到的和是否符合是全1(有的实现可能对得到的和会取反码,然后判断最终值是不是全0);
iii)如果是全1则进行下步处理,否则意味着包已变化从而丢弃之.