校验和算法
‘壹’ CS校验和 如何计算 请高手详细解释,急需,谢谢!
看时间挺久了,闲着也是闲着,随便写写:
起始字符 68H
长度L
长度L
起始字符 68H
【控制域C
地址域A
链路用户数据】
校验和CS
所谓校验和CS就是在第二个起始字符和校验和之间的所有数据按16进制相加,取所得值的后两位即为校验和
‘贰’ 校验和求计算计算过程最好给我讲下
校验和算法
unsignedshortcheck_sum(unsignedshort*addr,intlen)
{
registerintnleft=len;
registerintsum=0;
registershort*w=addr;
shortanswer=0;
while(nleft>1)
{
sum+=*w++;
nleft-=2;
}
if(nleft==1)
{
*(unsignedchar*)(&answer)=*(unsignedchar*)w;
sum+=answer;
}
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
answer=~sum;
return(answer);
}
首先,IP、ICMP、UDP和TCP报文头都有检验和字段,大小都是16bit,算法基本上也是一样的。
在发送数据时,为了计算数据包的检验和。应该按如下步骤:
1、把校验和字段设置为0;
2、把需要校验的数据看成以16位为单位的数子组成,依次进行二进制反码求和;
3、把得到的结果存入校验和字段中
在接收数据时,计算数据包的检验和相对简单,按如下步骤:
1、把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;
2、检查计算出的校验和的结果是否为0;
3、如果等于0,说明被整除,校验和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。
虽然说上面四种报文的校验和算法一样,但是在作用范围存在不同:IP校验和只校验20字节的IP报头;而ICMP校验和覆盖整个报文(ICMP报头+ICMP数据);UDP和TCP校验和不仅覆盖整个报文,而且还有12个字节的IP伪首部,包括源IP地址(4字节)、目的IP地址(4字节)、协议(2字节)、TCP/UDP包长(2字节)。另外UDP、TCP数据报的长度可以为奇数字节,所以在计算校验和时需要在最后增加填充字节0(填充字节只是为了计算校验和,可以不被传送)。
在UDO传输协议中,校验和是可选的,当校验和字段为0时,表明该UDP报文未使用校验和,接收方就不需要校验和检查了!那如果UDP校验和的计算结果是0时怎么办?书上有一句话:“如果校验和的计算结果为0,则存入的值为全1(65535),这在二进制反码计算中是等效的”
那么校验和到底怎么计算了?
1、什么是二进制反码求和
对一个无符号的数,先求其反码,然后从低位到高位,按位相加,有益处则向高位进1(和一般的二进制法则一样),若最高位有进位,则向最低位进1.
首先这里的反反码好像和以前学的有符号反码不一样,这里不分正负数,直接每个为都取反。
上面加粗的那句话和我们平时的加法法则不一样,最高位有进位,则向最低位进1。确实有些疑惑,为什么要这样呢?自习分析一下,上面的这种操作,使得在发送加法进位溢出时,溢出值并不是10000,而是1111.也即是当相加结果满1111时溢出,这样也可以说明为什么0000和1111都表示0了。
下面是两种二进制反码求和的运算:
原码加法运算:3(0011)+5(0101)=8(1000)
8(1000)+9(1001)=1(0001)
反码加法运算:3(1100)+5(1010)=8(0111)
8(0111)+9(0110)=2(1101)
从上面的例子中,当加法未发生溢出时,原码与反码加法运算结果一样;当有溢出时,结果就不一样了,原码是满10000溢出,而反码是满1111溢出,所以相差正好是1.
详细代码
‘叁’ 校验和怎么计算
检验和(checksum),在数据处理和数据通信领域中,用于校验目的地一组数据项的和。它通常是以十六进制为数制表示的形式。如果校验和的数值超过十六进制的FF,也就是255. 就要求其补码作为校验和。通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性。
这些数据项可以是数字或在计算检验的过程中看作数字的其它字符串。校验和(checksum)是指传输位数的累加,当传输结束时,接收者可以根据这个数值判断是否接到了所有的数据。如果数值匹配,那么说明传送已经完成。TCP和UDP传输层都提供了一个校验和与验证总数是否匹配的服务功能。[1]
它通常是以十六进制为数制表示的形式
发送方生成检验和
1.将发送的进行检验和运算的数据分成若干个16位的位串,每个位串看成一个二进制数,这里并不管字符串代表什么,是整数、浮点数还是位图都无所谓。
2.将IP、UDP或TCP的PDU首部中的检验和字段置为0,该字段也参与检验和运算。
3.对这些16位的二进制数进行1的补码和(one'scomplementsum)运算,累加的结果再取反码即生成了检验码。将检验码放入检验和字段中。
其中1的补码和运算,即带循环进位(end round carry)的加法,最高位有进位应循环进到最低位。反码即二进制各位取反,如0111的反码为1000。
接收方校验检验和
1.接收方将接收的数据(包括检验和字段)按发送方的同样的方法进行1的补码和运算,累加的结果再取反码。
2.校验,如果上步的结果为0,表示传输正确;否则,说明传输有差错。
‘肆’ java 如何计算校验和,比如如下这段代码如何修改
您好,1、 编写一个计算机程序用来计算一个文件的16位效验和。最快速的方法是用一个32位的整数来存放这个和。记住要处理进位(例如,超过16位的那些位),把它们加到效验和中。
要求:1)以命令行形式运行:check_sum infile
其中check_sum为程序名,infile为输入数据文件名。
2)输出:数据文件的效验和
附:效验和(checksum)
原理:把要发送的数据看成二进制整数序列,并计算他们的和。若数据字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。
例子:16位效验和计算,下图表明一个小的字符串的16位效验和的计算。
为了计算效验和,发送计算机把每对字符当成16位整数处理并计算效验和。如果效验和大于16位,那么把进位一起加到最后的效验和中。
‘伍’ Windows的PE文件的校验和如何计算
PE的可选映像头(IMAGE_OPTION_HEADER)里面,有一个Checksum字段,是该文件的校验和,一般EXE文件可以使0,但一些重要的和系统DLL及驱动文件必须有一个校验和.
‘陆’ IP数据报首部校验和算法
普通的IP首部长20个字节,除非含有选项字段。
第一帧:4位版本
4位首部长度
8位服务类型(TOS)
16位总长度(字节数)
第二帧:16位标识
3位标志
13位片偏移
第三帧:8位生存时间(TTL)
8位协议
16位首部校验和
第四帧:32位源IP地址
第五帧:32位目的IP地址
第六帧:选项(如果有)
第七帧:数据
1.4位版本:IP所用版本,有IPv4, IPv6
2.4位首部长度:指的是占32bit字的数目,包含任何选项。由于它是一个4bit字段,因此首部最长为60个字节。
3.服务类型(TOS)包括一个3bit的优先权子字段(忽略),4bit的TOS子字段和1bit未用位但须置0。4bit的TOS分别代表:最小延时、最大吞吐量、最高可靠性和最小费用。4bit中只能置其中一位,如4位均为0,则意味着是一般服务。
4.总长度字段指整个IP数据报的长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长为16bit,所以IP数据报最长可达65535(超级通道的MTU为65535。它的意思其实不是一个真正的MTU,它使用了最长的IP数据报)。当数据报被分片时,该字段的值也随着变化。
尽管可以传一个长达65535字节的IP数据报,但是大多数的链路层都会对它进行分片,而且主机也要求不能接收超过576字节的数据报。由于TCP把用户数据分成若干片,因此一般来说这个限制不会影响TCP。UDP的应用(如RIP,TFTP,BOOTP,DNS,及SNMP),它们都限制用户数据报长度为512字节,小于576字节从而避免IP数据报分片。
但是现在大多数的实现(支持网络文件系统(NFS)的实现)允许超过8192字节(8K)的IP数据报。
总长度字段是IP首部中必要的内容,因为一些数据链路(如以太网)需要填充一些数据以达到最小长度。尽管以太网最小帧长为46字节,但是IP数据可能会更短。如果没有总长度字段,那么IP层就不知道46字节中有多少是IP数据报的内容。
5.标识字段唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会增1。
6.TTL(time-to-live)生存时间字段设置了数据报可以经过的最多路由器数。它指定了数据报的生存时间。TTL的初始值由源主机设定(通常为32或64)一旦经过一个处理它的路由器,它的值就减1。当该字段值为0时,数据报就被丢弃,并发过ICMP报文通知源主机。
7.首部校验和字段是根据IP首部计算检验和码。它不对后面的数据进行计算。ICMP、IGMP、UDP和TCP在它们各自的首部中均包含有同时覆盖首部和数据检验和码。为了计算一份数据报IP校验和,首先把校验字段置为0。然后对首部中每个16bit进行二进制反码求和,结果存放检验的字段中。当收到一份数据报后,同样对首部中的每个16bit进行二进制反码求和。由于接收方在计算过程中包含了发送方存在首部中的校验和,因此如果在传输过程中没发生任何差错,那么接收方计算的校验和结果应全为1。如果不全为1(即校验和错误),那么IP就丢弃收到的数据报。但不生成差错报文,由上层去发现丢失的数据报并进行重传。
ICMP,IGMP,TCP和UDP都采用相同校验和算法,尽管TCP和UDP除了本身的首部和数据外,在IP首部中还包含不同的字段。
由于路由器经常只修改TTL字段(减1),因此当路由器转发一份报文时可以增加它的校验和,而不需要对IP整个首部进行重新计算。
8.每一份IP数据报都包含源IP地址和目的IP地址。
9、选项:是数据报中一个可变长的信息。目前这些选项定义如下:
。安全和处理限制(用于军事领域)
。记录路径(让每个路由器都记录下它的IP地址)
。时间戳 (让每个路由器都记录下它的IP地址和时间)
。宽松的源站选路 (为数据报指定一系列必须经过的IP地址)
。严格的源站选路(与宽松源站选路类似,但是要求只能经过这些指定的地址,不能经
过其它地址)。
这些选项很少被使用,并非所有的主机和路由都支持这些选项。
选项字段一直都是以32bit作为界限,在必要时必须插入值为0的填充字节。这样就保证IP首部始终是32bit的整数倍速(这是首部长度字段所要求的
‘柒’ 如何校验和是通过一定的算法扫描一个数据计算出的一个数值。用C语言
#include<stdio.h>
intQuicksum(char*str)//用指针做校验函数的参数,来接收被校验的字符串A;
{
intsum=0,loc=1,i,n;//sum代表校验和,loc代表每个字符在字符串A里的位置;
char*p;
p=str;//将被校验字符串A的地址赋值给字符指针p,用p表示位置;
n=strlen(p);//用strlen函数求出A的有效长度;
for(i=0;i<n;i++)//注意循环的次数。体会i<n的意思,保证能计算到每个字符
{
if((*p)==''){p++;loc++;continue;}//如果遇到空格,就将位置指针向后移动一个,跳过空格
//注意loc也要增加一,为了正确记录每个字符的位置
sum+=((*p-'A')+1)*loc;//如果此处不是空格,就根据校验计算该位置所代表的和,进行累加
loc++;//将位置指针移动到下一个字符,同时loc也跟着变化
p++;
}
returnsum;//返回校验和
}
voidmain()
{
intjiaoyanhe;
char*string;
printf("Pleaseinput(A-Z):");
gets(string);//使用gets函数输入字符串;
jiaoyanhe=Quicksum(string);//调用Quicksum函数进行校验和的计算。
printf("jiaoyanhe:");
printf("%d ",jiaoyanhe);
}
上机运行的时候,把注释全删了吧,要不然可能运行出错,多体会一下吧,这只是其中的一种方法而已,多上机运行代码,理解下里面的逻辑,好运。
‘捌’ 计算校验和函数,解析每句的意思
/**
input :
USHORT *pBuf:数据指针
int iSize :数据长度
*/
USHORT checksum(USHORT *pBuf,int iSize)
{
unsigned long cksum=0; //累加和初始值
while(iSize>1) //多少个USHORT型数据
{
cksum+=*pBuf++; //算计累加和
iSize-=sizeof(USHORT); //个数-1
}
if(iSize) //如果有非对齐的下余数据
{
cksum+=*(UCHAR *)pBuf; //+余下的数值
}
cksum=(cksum>>16)+(cksum&0xffff); //高16位+低16位
cksum+=(cksum>>16); // >=10000再+1
return (USHORT)(~cksum); // 返回它的反(USHORT型)
//这里是把cksum做个转换,防止别人反向操作?
}
‘玖’ 在计算机网络中什么是crc校验和,怎么计算
计算机网络原理的计算题(crc校验和数据传输问题)第1题:设要发送的二进制数据为10110011,若采用crc校验方法,生成多项式为x^4+x^3+1,度求出实际发送的二进制数字序列。(要求写出计算
计算机网络原理的计算题(crc校验和数据传输问题)
第1题:设要发送的二进制数据为10110011,若采用crc校验方法,生成多项式为x^4+x^3+1,度求出实际发送的二进制数字序列。(要求写出计算过程)
这是自考08年四月份的试题,我总是跟答案算的不一样。
答案是:待发送的序列m=10110011,除数p=11001,m*2^5与除数p进行模2除法运算,得余数r=1000,所以要发送的二进制序列为:101100111000
我不明白为什么m要乘以2的5次方,我是用101100110000除以11001得到的余数是100。
第2题:一条长度为100km的点对点链路,对于一个100字节的分组,带宽为多大时传播延迟等于发送延迟?(信道传输速度为2*10^8m/s)
答案是:
传播延迟为:100km/(2*10^8m/s)=50ms
发送延迟等于传播延迟时:100/c=50ms
则信道传输速率:c=200kbps
‘拾’ 什么是校验和
其实这是一种加密技术用于对文件内容进行审计的方法,使用 精通读文件把文件读到内存中,再对文件内容作一个 MD5 校验得到一串密码,就是校验和。
补充:
1、IP首部校验和字段是根据IP首部计算的校验和码,它不对首部后面的数据进行计算。ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据校验和码。
2、IP首部校验和计算:
为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16bit进行二进制反码求和(整个首部看成是由一串16bit的字组成),结果存在检验和字段中。当收到一份IP数据报后,同样对首部中每个16bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。
3、TCP和UDP校验和计算(两者相同)
校验和还包含—个96位的伪首标,理论上它位于TCP首标的前面。这个伪首标包含了源地址、目的地址、协议和TCP长度等字段,这使得TCP能够防止出现路由选择错误的数据段。这些信息由网际协议(IP)承载,通过TCP/网络接口,在IP上运行的TCP调用参数或者结果中传递。
伪首部并非UDP数据报中实际的有效成分。伪首部是一个虚拟的数据结构,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算校验和。
这样的校验和,既校验了UDP用户数据的源端口号和目的端口号以及UDP用户数据报的数据部分,又检验了IP数据报的源IP地址和目的地址。(伪报头保证UDP和TCP数据单元到达正确的目的地址。因此,伪报头中包含IP地址并且作为计算校验和需要考虑的一部分。最终目的端根据伪报头和数据单元计算校验和以验证通信数据在传输过程中没有改变而且到达了正确的目的地址。)