IP 首部校验和的计算 zz
- 格式:doc
- 大小:35.00 KB
- 文档页数:7
java ip校验和计算方法
IP校验和计算主要是用于验证IP头部的完整性。
这是一种简单的校验方式,只检查IP头部是否在传输过程中被修改。
IP头部校验和的计算方法如下:
1. 将IP头部的所有16位分为多个部分。
2. 将这些部分反转(即0变1,1变0)。
3. 将反转后的每个部分相加。
4. 如果结果为0,则头部是正确的;如果结果为0xFFFF,则头部在传输过
程中被修改过。
以下是Java中实现IP校验和计算的代码:
```java
public class IPChecksum {
public static int calculateChecksum(byte[] bytes) {
int sum = 0;
for (int i = 0; i < ; i += 2) {
sum += (bytes[i] << 8) (bytes[i + 1] & 0xFF);
}
while (sum >> 16 > 0) {
sum = (sum & 0xFFFF) + (sum >> 16);
}
return ~sum & 0xFFFF;
}
}
```
以上代码将一个字节数组(假设是IP头部)作为输入,并返回一个16位的整数,表示计算出的校验和。
如果输入的头部在传输过程中被修改过,那么返回的值将为0xFFFF。
unsigned short checksum(unsigned short *buf, int nword) {unsigned long sum;for(sum = 0; nword > 0; nword--)sum += *buf++;sum = (sum>>16) + (sum&0xffff);sum += (sum>>16);return -sum;}让我们假设一个IP头数据,来解cksum的惑IP头数据:01000101 /*ver_hlen*/00000000 /*tos*/00000000 00000010 /*len*/00000000 00000000 /*id*/00000000 00000000 /*offset*/00000100 /*ttl*/00010001 /*type*/00000000 00000000 /*cksum(0)*/ 01111111 00000000 00000000 00000001 /*sip*/ 01111111 00000000 00000000 00000001 /*dip*/(1)16比特分组;(2)校验和清‘0’(3)求所有16比特之和01000101 00000000 /*ver_hlen*/ 00000000 00000010 /*len*/---------------------01000101 0000001000000000 00000000 /*id*/---------------------01000101 0000001000000000 00000000 /*offset*/---------------------01000101 0000001000000100 00010001 /*ttl*//*type*/---------------------01001001 0001001100000000 00000000 /*cksum(0)*/---------------------01001001 0001001101111111 00000000 /*sip*/---------------------11001000 0001001100000000 00000001 /*sip*/---------------------11001000 0001010001111111 00000000 /*dip*/---------------------101000111 0001010000000000 00000001 /*dip*/---------------------101000111 00010101sum(4)把求得的和模(216-1)00000000 00000001 (sum>>16) 01000111 00010101(sum&0xffff) ---------------------01000111 00010110(5)在(4)的基础上求二进制反码10111000 11101001cksum说白了就是循环加,然后在取反!对方机器调用checksum()计算校验和,如果校验和为0表明IP包传输正确----------------------------------------------------------- 01000101 /*ver_hlen*/00000000 /*tos*/00000000 00000010 /*len*/00000000 00000000 /*id*/00000000 00000000 /*offset*/00000100 /*ttl*/00010001 /*type*/10111000 11101001/*cksum(0)*/01111111 00000000 00000000 00000001 /*sip*/01111111 00000000 00000000 00000001 /*dip*/01000101 0000000000000000 00000010---------------------01000101 0000001000000000 00000000---------------------01000101 0000001000000000 00000000--------------------- 01000101 00000010 00000100 00010001--------------------- 01001001 00010011 10111000 11101001--------------------- 100000001 11111100 01111111 00000000--------------------- 110000000 11111100 00000000 00000001--------------------- 110000000 11111101 01111111 00000000--------------------- 111111111 11111101 00000000 00000001--------------------- 111111111 11111110 sum00000000 00000001 (sum>>16)11111111 11111110 (sum&0xffff)----------------------11111111 11111111~sum00000000 00000000现在我们所用的机器设备大多数是使用二进制补码算法进行计算的。
ip首部校验和计算例题摘要:1.IP 首部校验和的作用2.IP 首部校验和的计算方法3.IP 首部校验和的例题正文:一、IP 首部校验和的作用IP 首部校验和(IP Header Checksum)是用于验证IP 数据报首部是否发生错误的一种校验机制。
在网络传输过程中,数据报可能会受到干扰或损坏,IP 首部校验和可以帮助接收方检测到这些错误,从而避免错误的数据报被传输到目的地。
二、IP 首部校验和的计算方法IP 首部校验和的计算方法是基于IP 首部中的16 位字段进行循环冗余校验(Cyclic Redundancy Check,CRC)。
具体步骤如下:1.将IP 首部的各个16 位字段(版本、首部长度、服务类型、总长度、标识、标志、片偏移、生存时间、协议、首部校验和、源IP 地址、目的IP 地址、选项)转换成二进制数。
2.将转换后的二进制数按照8 位一组划分为多个组,不足8 位的,在末尾用0 补足。
3.对每个组进行异或(XOR)操作,并将结果进行移位寄存。
4.将移位寄存器的值进行异或操作,并将结果再次进行移位寄存。
5.重复步骤3 和4,直到所有组都完成异或操作。
6.将移位寄存器的值赋值给IP 首部校验和字段。
三、IP 首部校验和的例题假设IP 首部的各个字段如下:- 版本:IPv4- 首部长度:20 字节- 服务类型:0- 总长度:64 字节- 标识:12345- 标志:DF- 片偏移:0- 生存时间:32- 协议:ICMP- 首部校验和:0- 源IP 地址:192.168.1.1- 目的IP 地址:192.168.1.2- 选项:0按照上述计算方法,可以得到IP 首部校验和的值为0x7F1A。
IP首部校验算法IP Header Checksum AlgorithmLIU Pai(School of Software Engineering,Beijing University of Posts and Telecommunications, Beijing 100876, China)Abstract: In order to increase the efficiency of data transmission, IP simplifies the protocol by not providing a reliable communication facility. There are no acknowledgments eitherend-to-end or hop-by-hop.There is no error control for data, only a header checksum provides a verification that the information used in processing internet datagram has been transmitted correctly. There are no retransmissions. There is no flow control. The RFC documents give the algorithms used to compute the checksum and the wireshark software provides the function of catching the IP packets. This data can be used to verify the algorithms . The research also shows there is a bug in the algorithm and can be overcomed and optimised.1 IP 首部如图1所示,IP数据报首部的固定部分中的各字段:1) 版本占4位,指IP协议的版本。
IP首部校验算法
刘派
【期刊名称】《电脑知识与技术》
【年(卷),期】2010(006)019
【摘要】IP协议为提高数据传输效率,简化了协议,舍弃了许多为提供可靠性所需要的工作(如建立连接、维护连接、拆除连接、确认应答、时间片处理等).其唯一的正确性检验即依靠头部校验和,以保证头部数据的完整性.为了研究IP首部校验算法,查看了相关的RFC文档并利用wireshark工具进行了抓包,并对抓包取得的数据进行了计算验证.研究发现了一些算法存在一定的问题并对它的改进算法进行了研究.【总页数】3页(P5194-5196)
【作者】刘派
【作者单位】北京邮电大学,软件学院,北京,100876
【正文语种】中文
【中图分类】TP393
【相关文献】
1.基于改进SKIP算法的HL7消息校验方法 [J], 徐浩诚;刘利军;黄青松
2.基于扩展首部hop-by-hop的IPv6包标记算法研究 [J], 李明珍;蒋华;王鑫
3.IP首部校验和算法研究 [J], 乔世成;张智丰;廉洁
4.IPNet:帧间预测校验的多域卷积神经网络目标跟踪算法 [J], 巩欣飞;杨大伟;毛琳
5.IPNet:帧间预测校验的多域卷积神经网络目标跟踪算法 [J], 巩欣飞;杨大伟;毛琳;
因版权原因,仅展示原文概要,查看原文内容请购买。
计算机网络实验报告实验名称:ip首部校验报告人:学号:成绩:【实验要求】:根据wireshark在网上抓包,计算IP首部(16进制),输出数据是否在传输中出错。
【实验原理】:将IP数据报文的首部部分的L个16比特构成的16进制数转换成2进制相加,将求得的和模(1621 ),将高于第15比特的各位取出,往后移16位,并把它们加回到和中。
将所得和取补码并判断是否为0,若为0则数据没有出错;若不为0,则数据传输出错。
【程序交流】:将L个16比特构成的16进制数文件读入,直接将这些数进行16进制加法,将超出4位的16进制数取出。
向后移4位,加到和中。
若最后的和为ffff,则数据没有出错;否则数据传输出错。
源代码在附录中。
【测试结果】:输入“input.txt”45 00 00 30 80 4c 40 00 80 06 b5 2e d3 43 11 7b cb 51 15 3d输出:将b5 2e 改为c5 2e 则输出:附录:#include<iostream>#include<fstream>#include<string>using namespace std;char a[21][4];string s;int change(char ch){int b;if(ch>='0'&&ch<='9')b=ch-'0';elseb=ch-'a'+10;return b;}int main(){int i=0,j=0,k=0,len,num,sum[6]= {0},temp=0;char ch;ifstream fin;fin.open("input.txt");getline(fin,s);while(s[i]!='\0')i++;len=i;i=0;while(i<=len){if(k!=4){if(s[i]==' ')i++;else{a[j][k]=s[i];k++;i++;}}if(4==k){i++;j++;k=0;}}k=0;for(i=3; i>=0; i--){for(j=0; j<10; j++){ch=a[j][i];num=change(ch);sum[k]+=num;}k++;}for(i=0; i<5; i++){sum[i]+=temp;if(sum[i]>15){temp=sum[i]/16;sum[i]=sum[i]%16;}elsetemp=0;}sum[0]+=sum[4];k=0;for(i=0;i<4;i++){if(sum[i]!=15){k=1;break;} }if(k==1)cout<<"wrong"<<endl;else cout<<"correct"<<endl;return 0;}。
ip校验和计算方法
ip校验和计算方法
一、IP校验和的概念
在了解IP校验和之前,我们先来了解一下IP协议包的基本结构,IP协议包的最顶层就是IP数据报头,一个IP数据报头有20个字节,其中有一个字节是校验和,它是用来验证IP数据报头中的其他19个字节是否出错的。
二、IP校验和的计算方法
IP校验和的计算方法用到的是二进制算术,该算法可以有效的检测IP数据报头中的错误,它采用的是和校验的方式,校验和的计算步骤如下:
第一步:将IP数据报头中的19个字节的每个字节看作16进制,先把它们从左到右相加,然后取得其二进制结果。
第二步:将上述加和结果的每一位取反,然后取得其二进制结果,取反后的结果就是校验和。
第三步:将最终的二进制校验和转换成16进制,即可得到IP数据报头中的校验和字节。
注:在计算过程中,如果出现某一字节的加和结果超出8位二进制的最大值,则将其超出的部分与下一字节相加,直至最后得到一个不超过8位的二进制数据。
三、IP校验和的优点
1、IP校验和可以有效的检测IP数据报头中的错误,当发现数
据报头中存在错误时,便会将其丢弃,从而起到一定的安全作用。
2、它不需要太多的计算复杂度,计算过程简单,速度快。
四、IP校验和的缺点
1、只能检测数据的一种类型的错误,即出现在IP数据报头中的错误,而不能检测其他类型的错误。
2、不能发现重复的数据包,因为当检测到重复的数据包时,校验和的值也是相同的,所以无法检测到。
3、只能检测低级的传输错误,对于高级的传输错误,无法进行检测。
IP⾸部检验和算法原创博⽂,转载请注明。
在学习TCP/IP 详解的过程中遇到了不⽌⼀次的关于检验和的概念,在吸取了他⼈理解的前提下,我决定⽤Wireshark 进⾏抓包分析。
⾸先我们得知道IP数据包格式⾸先把检验和字段置为 0 。
然后,对⾸部中每个 16 bit 进⾏⼆进制反码求和(整个⾸部看成是由⼀串 16 bit的字组成),结果存在检验和字段中。
当收到⼀份I P数据报后,同样对⾸部中每个 16 bit进⾏⼆进制反码的求和。
由于接收⽅在计算过程中包含了发送⽅存在⾸部中的检验和,因此,如果⾸部在传输过程中没有发⽣任何差错,那么接收⽅计算的结果应该为全 1。
如果结果不是全1 (即检验和错误),那么I P就丢弃收到的数据报。
但是不⽣成差错报⽂,由上层去发现丢失的数据报并进⾏重传。
再来看看Wireshark抓取结果观察此图,我们可以看到这是⼀个源地址为123.151.152.231 ⽬的地址为10.22.66.206即为本机地址的IP数字报传送。
注意图中标深蓝颜⾊的数字,每当我们点击分类信息时,下⽅的数字就会跟随着发⽣变化,因此我们就可以得到IP数据报的内容。
、解释如下:(本内容部分取⾃)版本号4,占了4位,表⽰ipv4.接下来是包头长度,⼜占了4位,指明ipv4协议包头长度的字节数包含多少个32位。
由于IPv4的包头可能包含可变数量的可选项,所以这个字段可以⽤来确定IPv4数据报中数据部分的偏移位置。
IPv4包头的最⼩长度是20个字节,因此IHL这个字段的最⼩值⽤⼗六进制表⽰就是5(5x4(4个字节32位) = 20字节)。
就是说,它表⽰的是包头的总字节数是4字节的倍数。
图中即为header length为20表⽰是20个字节,所以经过计算此处⽤⼗六进制表⽰为5,⼆进制表⽰为1001。
再往下是服务类型为0x00。
服务类型此处⼀共占了8位,涵义如下:过程字段: 3位,设置了数据包的重要性,取值越⼤数据越重要,取值范围为:0(正常)~ 7(⽹络控制)延迟字段: 1位,取值:0(正常)、1(期特低的延迟)流量字段: 1位,取值:0(正常)、1(期特⾼的流量)可靠性字段: 1位,取值:0(正常)、1(期特⾼的可靠性)成本字段: 1位,取值:0(正常)、1(期特最⼩成本)未使⽤: 1位接着是总长度total length:⼗六进制是0x0028标识字段:占16位。
计算ip首部校验和
1.发送IP数据报计算checksum
(1)将校验和字段置为0;
(2)对首部中(一般为20B)每个16位字进行二进制反码求和;
(3)将(2)中得到的和再取反码,即得checksum,写入校验和字段中。
抓个IP数据包,取IP数据报报头部分(20B),数据如下:
45 00 00 30 80 4c 40 00 80 06 b5 2e d3 43 11 7b cb 51 15 3d
下面我来计算一下校验和:
(1)将校验和字段置为0:
将b5 2e置为00 00,即变成:
45 00 00 30 80 4c 40 00 80 06 00 00 d3 43 11 7b cb 51 15 3d
(2)反码求和
4500+0030+804c+4000+8006+0000+d343+117b+cb51+153d=34ace 将将进位(3)加到低16位(4ace)上:0003+4ace=4ad1
(3)取反码
将4ad1取反得:checksum=b52e
2.接收IP数据报检验IP校验和
(1)对首部中每个16 bit进行二进制反码求和;
(2)将(1)中得到的和再取反码,看是否为0.
接收到的IP数据报首部:
45 00 00 30 80 4c 40 00 80 06 b5 2e d3 43 11 7b cb 51 15 3d
下面来验证下:
(1)反码求和
4500+0030+804c+4000+8006+b52e+d343+117b+cb51+153d=3fffc 0003+fffc=ffff
(2)取反码:~ffff=0 正确。
首部校验和的计算方法
1. 协议规定
首部校验和是一种用于确保数据传输完整性和正确性的技术。
它是在网络传输层计算和添加的,以帮助检测数据在传输过程中可能发生的任何错误。
2. 首部格式
首部格式通常包括源地址、目的地址、协议号、数据包长度等信息。
这些信息用于标识数据包的来源、目的地以及所使用的协议。
3. 计算方法
首部校验和的计算通常采用逐字节相加的方法,将首部的所有字节相加,并保留一个字节的进位。
在校验和的计算过程中,每个字节被视为一个8位的二进制数,按位相加。
4. 填充零
在计算首部校验和之前,需要将首部的某些字段填充为零。
这些
字段通常包括校验和字段本身以及可能的高位字段。
填充零是为了确保数据的所有字节都参与了校验和的计算。
5. 校验和计算
首部校验和的计算过程如下:
1. 将首部的所有字节相加,并保留一个字节的进位。
2. 如果进位为1,则将进位加到校验和字段的最高位上。
3. 如果进位为0,则将校验和字段的最高位设置为0。
4. 将计算出的校验和添加到首部的末尾。
6. 校验和插入
在发送数据时,将计算出的校验和插入到首部的末尾。
在接收数据时,接收方会计算接收到的数据的校验和,并与接收到的校验和进行比较。
如果两个值相同,则说明数据在传输过程中没有发生错误;如果两个值不同,则说明数据在传输过程中发生了错误。
IP 首部校验和的计算zz1IP数据包的头信息格式:+-------------------------------------------------+| 版本 (4位) |+-------------------------------------------------+| 首部长度(4位) |+-------------------------------------------------+| 服务类型(TOS)8位 |+-------------------------------------------------+| 数据包总长度(16位) |+-------------------------------------------------+| 标识ID号(16位) |+-------------------------------------------------+| 标志位(3位) |+-------------------------------------------------+| 片偏移(13位) |+-------------------------------------------------+| 生存时间(TTL)(8位) |+-------------------------------------------------+| 协议类型 (8位) |+-------------------------------------------------+| 首部校验和(16位) |+-------------------------------------------------+| 源IP地址(32位) |+-------------------------------------------------+| 目的IP地址 (32位) |+-------------------------------------------------+* IP选项(若有) (32位) *+-------------------------------------------------+* 数据 *+-------------------------------------------------+这里要说的是首部校验和字段。
在发送数据时,为了计算数IP据报的校验和。
应该按如下步骤:(1)把IP数据报的首部都置为0,包括校验和字段。
(2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和。
(3)把得到的结果存入校验和字段中。
在接收数据时,计算数据报的校验和相对简单,按如下步骤:(1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段。
(2)检查计算出的校验和的结果是否等于零。
(3)如果等于零,说明被整除,校验是和正确。
否则,校验和就是错误的,协议栈要抛弃这个数据包。
首先,查看了Linux 2.6内核中的校验算法,使用汇编语言编写的,显然效率要高些。
代码如下:unsigned short ip_fast_csum(unsigned char * iph,unsigned int ihl){unsigned int sum;__asm__ __volatile__("movl (%1), %0 ;\n""subl $4, %2 ;\n""jbe 2f ;\n""addl 4(%1), %0 ;\n""adcl 8(%1), %0 ;\n""adcl 12(%1), %0 ;\n""1: adcl 16(%1), %0 ;\n""lea 4(%1), %1 ;\n""decl %2 ;\n""jne 1b ;\n""adcl $0, %0 ;\n""movl %0, %2 ;\n""shrl $16, %0 ;\n""addw %w2, %w0 ;\n""adcl $0, %0 ;\n""notl %0 ;\n""2: ;\n"/* Since the input registers which are loaded with iph and ihlare modified, we must also specify them as outputs, or gccwill assume they contain their original values. */: "=r" (sum), "=r" (iph), "=r" (ihl): "1" (iph), "2" (ihl): "memory");return(sum);}在这个函数中,第一个参数显然就是IP数据报的首地址,所有算法几乎一样。
需要注意的是第二个参数,它是直接使用IP数据报头信息中的首部长度字段,不需要进行转换,因此,速度又快了(高手就是考虑的周到)。
使用方法会在下面的例子代码中给出。
第二种算法就非常普通了,是用C语言编写的。
我看了许多实现网络协议栈的代码,这个算法是最常用的了,即使变化,也无非是先取反后取和之类的。
考虑其原因,估计还是C语言的移植性更好吧。
下面是该函数的实现:unsigned short checksum(unsigned short *buf,int nword){unsigned long sum;for(sum=0;nword>0;nword--)sum += *buf++;sum = (sum>>16) + (sum&0xffff);sum += (sum>>16);return ~sum;}这里我要把我的惨痛的经历也要说一下,为了研究IP校验和的算法,我根据算法也进行了代码编写,可是结果总是有8位不一样,郁闷了好久,最后还是David L .Stevens给我了答案(不要误会,是在他的书中找到的答案,呵呵)。
那就是现在我们所用的机器设备大多数是使用二进制补码算法进行计算的。
因此,仅仅简单的累加得出的校验和并不是正确的结果。
下面就是IP数据报首部校验和算法的代码示例:#include <stdio.h>#include <stdlib.h>#include <linux/if_ether.h>#include <linux/ip.h>#include <sys/socket.h>#define ETH_P_LENGTH 65535#define ETHERNET_MAX_LEN 1500#define ETHERNET_MIN_LEN 46unsigned short ip_fast_csum(unsigned char * iph, unsigned int ihl);unsigned short checksum(unsigned short *buf,int nword);//--------------------------------------------------------------------// Main function//// Do all if it can do////--------------------------------------------------------------------int main(int argc,char *argv[]){int listenfd;int nbyte;char buf[ETH_P_LENGTH];struct ethhdr *eth = NULL;struct iphdr *ip = NULL;short chk;//// Print banner//printf("\n\tSendArp v1.0 - scan IP and MAC\n");printf("\tNsfocus - \n");printf("\tby David Zhou\n");printf("\tDate : 2006/01/19\n\n");if ((listenfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) {printf("Call socket() function error\n");return 1;}for (;;){if ((nbyte = recv(listenfd, buf, ETH_P_LENGTH, 0)) > 0){struct ethhdr *eth = (struct ethhdr *)buf;if(ntohs(eth->h_proto) == ETH_P_IP){ // EtherNet frame// print ip sumip = (struct iphdr *)&buf[14];printf("IP CheckSum = 0x%04X\n",ntohs(ip->check));//verify ip checksumchk = checksum((unsigned short*)ip,10);printf("Verify CheckSum = 0x%04X\n\n",ntohs(chk));//// reset check to calc self//ip->check = 0;// 2.6 kernelchk = ip_fast_csum((unsigned char *)ip,ip->ihl);printf("Calc CheckSum = 0x%04X - %d\n",ntohs(chk),ip->ihl);// coustom calcchk = checksum((unsigned short*)ip,10);printf("Calc CheckSum = 0x%04X\n\n",ntohs(chk));}}}return 0;}unsigned short checksum(unsigned short *buf,int nword){unsigned long sum;for(sum=0;nword>0;nword--)sum += *buf++;sum = (sum>>16) + (sum&0xffff);sum += (sum>>16);return ~sum;}/** This is a version of ip_compute_csum() optimized for IP headers, * which always checksum on 4 octet boundaries.** By Jorge Cwik <jorge@>, adapted for linux by* Arnt Gulbrandsen.*/unsigned short ip_fast_csum(unsigned char * iph,unsigned int ihl){unsigned int sum;__asm__ __volatile__("movl (%1), %0 ;\n""subl $4, %2 ;\n""jbe 2f ;\n""addl 4(%1), %0 ;\n""adcl 8(%1), %0 ;\n""adcl 12(%1), %0 ;\n""1: adcl 16(%1), %0 ;\n""lea 4(%1), %1 ;\n""decl %2 ;\n""jne 1b ;\n""adcl $0, %0 ;\n""movl %0, %2 ;\n""shrl $16, %0 ;\n""addw %w2, %w0 ;\n""adcl $0, %0 ;\n""notl %0 ;\n""2: ;\n"/* Since the input registers which are loaded with iph and ihlare modified, we must also specify them as outputs, or gccwill assume they contain their original values. */: "=r" (sum), "=r" (iph), "=r" (ihl): "1" (iph), "2" (ihl): "memory");return(sum);}.==============IP 首部里的校验和只校验首部;ICMP、IGMP、TCP 和 UDP 首部中的校验和校验首部和数据。