ipv4校验和计算

ipv4校验和的计算

原理:

计算方法一:除去校验和的两位,将其他的位相加:45+00+00+3c+55+81+00+00+40+01+ac+1c

0f+0d+ac+1c+0f+0e=

计算方法二:

校验和(checksum)算法,简单的说就是16位累加的反码运算:

计算函数如下:

我们在计算时是主机字节序,计算的结果封装成IP包时是网络字节序,注意这两者之间的区别,我们在从IP包里读取要转化为主机字节序,往IP包里存入时要转化为网络字节序在存入。

UINT32 Checksum(UINT32 cksum, VOID*pBuffer, UINT32 size)

{

INT8 num = 0;

UINT8 *p = (UINT8 *)pBuffer;

if ((NULL == pBuffer) || (0 == size))

{

return cksum;

}

while (size > 1)

{

cksum += ((UINT16)p[num] << 8 & 0xff00) | (UINT16)p[num + 1]& 0x00FF;

/*2个字节累加,先取网络字节序低位左移8位(变成主机字节序高位),与(加)上 网络字节序中的高位(主机字节序地位),即网络字节序要先变成主机字节序在进行累加,*/

size  -= 2;

num   += 2;

}

if (size > 0)

//如果长度为奇数

{

cksum += ((UINT16)p[num] << 8) & 0xFFFF;

//如果总的字节数为奇数,则最后一个字节单独相加

num += 1;

}

while (cksum >> 16)

{

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

//累加完毕将结果中高16位再加到低16位上,重复这一过程直到高16位为全0

}

return cksum;

}

注意:UINT32 cksum的类型,这里是4个字节的,防止在累加的过程中,数据溢出,(例如 0xFF 累加时就会内存溢出)

详细的计算过程和原理如下

一:ip 头 的计算:

直接对头部数据进行累加(不包括原来的checksum值):

1、ipv4包头

ipHeadLen  =(pIpHeader->ver_ihl & 0x0F) << 2;

在ipv4 头中,版本类型和头长度加在一起是1 个字节(8位),各占4位,版本类型在前,长度在后,所以要取长度只能取低4 位,

pIpHeader->chksum = 0;

因为不包括原来的checksum值,所以在每次计算前先把checksum的值置0,然后计算

sum = Checksum(0, (VOID *)pIpHeader, ipHeadLen);

对整个ip包头的累加

pIpHeader->chksum = HTONS((UINT16)(~sum));

结果为计算值的反码,(别忘转化为网络字节序)

时间: 2024-10-11 05:00:48

ipv4校验和计算的相关文章

ip首部校验和计算

IP首部校验和的计算方法: 1.把校验和字段清零. 2.然后对每16位(2字节)进行二进制反码求和,反码求和的意思是先对每16位求和,再将得到的和转为反码. 接下来详细描述反码求和的步骤:看下面的代码 算法: SHORT checksum(USHORT* buffer, int size){    unsigned long cksum = 0;    while(size>1)    {        cksum += *buffer++;        size -= sizeof(USHO

TCP校验和计算原理与实现

1. 概述 TCP首部校验和计算三部分:TCP首部+TCP数据+TCP伪首部. TCP校验和覆盖TCP首部和TCP数据,而IP首部中的校验和只覆盖IP的首部,不覆盖IP数据报中的任何数据. 伪首部是为了增加TCP校验和的检错能力:如检查TCP报文是否收错了(目的IP地址).传输层协议是否选对了(传输层协议号)等.伪首部来自IP首部. RFC 793的TCP校验和定义 The checksum field is the 16 bit one's complement of the one's co

IP校验和计算

今天上课提到IP头部校验和怎么算的,还真不是很清楚,于是去网上查了些资料,整理记录一下.IP首部校验和的计算主要是两步:按位异或和取反,具体来说1. IP头部以16位为一个单位,逐个模2加(相当于异或):2. 得到的结果取反,作为校验和放入校验和字段:3. 初始计算校验和字段时该字段全部用0填充:     以上是对于发送者来说如何计算校验和的,而对于接收者来说,验证也很简单:1. 对于接收的IP报文头部以16位为单位逐个求和:2. 若结果为1,则校验正确,否则出错丢弃:     原理很简单,接收

作业:首部校验和计算

IP首部校验和的计算主要是两步:按位异或和取反,具体来说1. IP头部以16位为一个单位,逐个模2加(相当于异或):2. 得到的结果取反,作为校验和放入校验和字段:3. 初始计算校验和字段时该字段全部用0填充:     以上是对于发送者来说如何计算校验和的,而对于接收者来说,验证也很简单:1. 对于接收的IP报文头部以16位为单位逐个求和:2. 若结果为1,则校验正确,否则出错丢弃:     原理很简单,接收方的计算对象是A和A的反的异或,结果当然是1了!     具体的程序实现例子如下: SH

IPv4检验和计算

IP分组中的检验和仅覆盖首部,而不管数据,首部被划分为16位的段,把所有段相加,结果取反,塞进首部检验和里 在目的主机中,首部划分为16位,相加,结果肯定是16个1,然后取反,结果为0.如下 在目的主机,收到的报文中,因为首部检验和是10001011 10110001,所以它的计算如下

CheckSum(校验和)计算

发送端: 接收端: 原文地址:https://www.cnblogs.com/apex-wzw/p/11576738.html

python 计算校验和

校验和是经常使用的,这里简单的列了一个针对按字节计算累加和的代码片段.其实,这种累加和的计算,将字节翻译为无符号整数和带符号整数,结果是一样的. 使用python计算校验和时记住做截断就可以了. 这里仅仅是作为一个代码样本,权作标记,直接上代码 ''' Created on 2014年9月4日 @author: lenovo ''' import random ''' 实际计算校验和时,解释为无符号整数还是带符号整数,结果必然是一样的.因为基于补码方式存储,计算加法时都是按位加,然后该进位的就进

IP校验和原理

对于一个学习网络协议的新手来说,碰到校验和这个词的时候可能会存在疑惑,看书本上讲的左想右想不知道再讲什么:只要你弄明白IP校验和的原理,I C M P.I G M P.U D P和T C P的校验和也就很好理解了. 上图是一般IP数据报的格式,若仅仅去理解校验和就不必去看这些字段的细节.如果没有在'选项'里面添加内容,那么前面20字节为IP数据包的首部,IP校验和就是对这10个字(也就是20个字节)求的校验和,校验和说白了就是各个二进制数按位取反再求和(或者求和再按位取反),要注意的是这里的数没

2.7校验和与核实

校验和(checksum)程序用来从文件中生成检验和秘钥,然后利用这个校验和秘钥核实文件的完整性. 用于文件完整性测试的特定秘钥就称为校验和. 校验和对于编写备份脚本或系统维护脚本来说非常重要.1.最知名且使用最为广泛的校验和技术是md5sum和SHA-1.他们对文件内容使用相应的算法来生成校验和. 2.为了计算md5sum,使用下面命令: $md5sum filename 68b329da9893e34099c7d8ad5cb9c940 filename 如上所示,md5sum是一个32个字符