计算数IP据报的校验和

IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法如下:

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

(1)把IP数据报的首部都置为0,包括校验和字段。

(2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和。

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

在接收数据时,计算数据报的校验和相对简单,按如下步骤:

(1)当接收IP包时,需要对报头进行确认,检查IP头是否有误,算法同上2、3步,然后判断取反的结果是否为0,是则正确,否则有错。

1、发送方

  i)将校验和字段置为0,然后将IP包头按16比特分成多个单元,如包头长度不是16比特的倍数,则用0比特填充到16比特的倍数;

  ii)对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位),将得到的和的反码填入校验和字段;

  iii)发送数据包。

2、接收方

  i)将IP包头按16比特分成多个单元,如包头长度不是16比特的倍数,则用0比特填充到16比特的倍数;

  ii)对各个单元采用反码加法运算,检查得到的和是否符合是全1(有的实现可能对得到的和会取反码,然后判断最终值是不是全0);

iii)如果是全1则进行下步处理,否则意味着包已变化从而丢弃之。需要强调的是反码和是采用高位溢出加到低位的,如3比特的反码和运算:100b+101b=010b(因为100b+101b=1001b,高位溢出1,其应该加到低位,即001b+1b(高位溢出位)=010b)。

现假如一数据报为45 00 05 D4 CA E0 40 00 75 06 70 D2 CA 62 39 64 C0 A8 00 02

根据IP数据报的格式可以看出它的首部校验字段为70 D2 它是怎么算出来的呢?

方法:我们把首部校验字段即70 D2 用0000代替

4500+05D4+CAE0+4000+7506+0000+CA62+3964+C0A8+0002=38F2A

然后把进出来的一位与后4位再进行十六进制加法,8F2A+0003=8F2D

最后用FFFF减去算出来的结果就可以了即FFFF-8F2D=70D2

函数代码如下。

USHORT CheckSum(USHORT *buffer, int size)

{

unsigned long cksum=0;

while (size > 1)

{

cksum += *buffer++;

size -= sizeof(USHORT);

}

if (size)

{

cksum += *(UCHAR*)buffer;

}

cksum = (cksum >> 16) + (cksum & 0xffff);

cksum += (cksum >>16);

return (USHORT)(~cksum);

}

时间: 2024-08-28 00:34:56

计算数IP据报的校验和的相关文章

IP数据包首部校验和的计算

IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法如下: 在发送数据时,为了计算数IP据报的校验和.应该按如下步骤: (1)把IP数据报的首部都置为0,包括校验和字段. (2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和. (3)把得到的结果存入校验和字段中. 在接收数据时,计算数据报的校验和相对简单,按如下步骤: (1)当接收IP包时,需要对报头进行确认,检查IP头是否有误,算法同上2.3步,然后判断取反的结果是否为0,是则正确,否则有错. 1.发送方 i

IP首部之首部校验和

首先介绍一下1的补码,2的补码:(摘自http://blog.csdn.net/cradmin/article/details/3092559) 过1的补码,2的补码,到网上搜了下找到这个: It is the 1’s complement of the 1’s complement sum of all the 16-bit words in the TCP header and data       这是关于TCP头部校验和字段(checksum field)的说明.补码:补码是计算机中二进

关于socket模块获取ip失败报错

问题:socket模块获取ip失败报错 In [64]: import socket In [71]: socket.gethostname() Out[71]: 'web01' In [72]: host_name = socket.gethostname() In [73]: socket.gethostbyname(host_name) --------------------------------------------------------------------------- g

ip协议解析 首部校验和

3. 初始计算校验和字段时该字段全部用0填充:     以上是对于发送者来说如何计算校验和的,而对于接收者来说,验证也很简单:1. 对于接收的IP报文头部以16位为单位逐个求和:2. 若结果为1,则校验正确,否则出错丢弃:     原理很简单,接收方的计算对象是A和A的反的异或,结果当然是1了!     具体的程序实现例子如下:SHORT checksum(USHORT* buffer, int size){    unsigned long cksum = 0;    while(size>1

关于NO 不掉 IP NAT 报这个错%Static entry in use, cannot remov ...解决办法

R1(config)#interface fastethernet 0/0 R1(config-if)#no ip nat outside R1(config)#interface fastethernet 0/1 R1(config-if)#no ip nat inside R1#clear ip nat translation * R1(config)#no ip nat inside source static 192.168.1.205 180.169.84.237

IP数据报首部校验和算法

当用google搜索IP数据报首部校验和算法的时候,总是看到的是代码,没有看到其过程,于是就有了此文,如有错误请指正.文章省略一点,呵呵 IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法如下: 在发送数据时,为了计算数IP据报的校验和.应该按如下步骤: (1)把IP数据报的首部都置为0,包括校验和字段. (2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和. (3)把得到的结果存入校验和字段中. 在接收数据时,计算数据报的校验和相对简单,按如下步骤: (1)

校验算法之二进制反码求和

IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法如下: 在发送数据时,为了计算数IP据报的校验和.应该按如下步骤:    (1)把IP数据报的首部都置为0,包括校验和字段.    (2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和.    (3)把得到的结果存入校验和字段中.    在接收数据时,计算数据报的校验和相对简单,按如下步骤:    (1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段.    (2)检查计算出的校验和

IP首部校验和的计算

IP首部校验和的计算方法: 算法: SHORT checksum(USHORT* buffer, int size){    unsigned long cksum = 0;    while(size>1)    {        cksum += *buffer++;        size -= sizeof(USHORT);    }    if(size)    {        cksum += *(UCHAR*)buffer;    }    cksum = (cksum>>

6、7、8章:IP协议及IP数据报转发和ICMP - 用TCP/IP进行网际互连

第6章 网际协议:无连接数据报交付(IPv4) 6.3 互联网体系结构和基本原理 互联网是围绕着一个分层结构中的三个概念化网络服务来设计的:这个结构相当健壮且有很强的适应性,使互联网取得了很大成功. 6.7 数据报格式及个部分讲解 版本字段(4位): IP协议的版本,通信双方使用的协议版本须一致,目前普遍使用IPv4,IPv6目前处于起步阶段. 首部长度(4位): 它给出用32位字来度量数据报首部长度.除了IP选项及相应的填充字段外,首部其他字段长度是固定的.若不含IP字段长度为20字节,则首部