IP数据包的校验和算法

合集下载

IP数据包的校验和算法(载))

IP数据包的校验和算法(载))

IP数据包的校验和算法(载)2007-11-02 10:52IP数据包的头信息格式:+-------------------------------------------------+| 版本(4位) |+-------------------------------------------------+| 首部长度(4位) |+-------------------------------------------------+| 服务类型(TOS)8位|+-------------------------------------------------+| 数据包总长度(16位) |+-------------------------------------------------+| 标识ID号(16位) |+-------------------------------------------------+| 标志位(3位) |+-------------------------------------------------+| 片偏移(13位) |+-------------------------------------------------+| 生存时间(TTL)(8位) |+-------------------------------------------------+| 协议类型(8位) |+-------------------------------------------------+| 首部校验和(16位) |+-------------------------------------------------+| 源IP地址(32位) |+-------------------------------------------------+| 目的IP地址(32位) |+-------------------------------------------------+* IP选项(若有)(32位) *+-------------------------------------------------+* 数据*+-------------------------------------------------+这里要说的是首部校验和字段。

java ip校验和计算方法

java ip校验和计算方法

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。

ip校验和计算方法

ip校验和计算方法

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首部检验和算法

IP首部检验和算法

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校验规则

ip校验规则

ip校验规则
【最新版】
目录
1.IP 校验规则的定义和作用
2.IP 校验规则的分类
3.IP 校验规则的具体实现方式
4.IP 校验规则的应用场景
5.IP 校验规则的优缺点分析
正文
一、IP 校验规则的定义和作用
IP 校验规则,是指在网络通信中,对数据包的源 IP 地址和目标 IP 地址进行校验的一种规则。

其主要作用是确保数据包在网络中的传输安全,防止非法的访问和攻击。

二、IP 校验规则的分类
IP 校验规则主要分为两种:一种是基于 IP 地址的校验,另一种是
基于 IP 地址和端口号的校验。

三、IP 校验规则的具体实现方式
IP 校验规则的具体实现方式主要有两种:一种是通过防火墙进行 IP 地址的过滤和校验,另一种是通过 IP 地址和端口号的校验来实现。

四、IP 校验规则的应用场景
IP 校验规则广泛应用于网络安全和访问控制等领域。

例如,在企业
内部网络中,可以通过设置 IP 校验规则,限制外部访问,保护企业内部网络的安全。

五、IP 校验规则的优缺点分析
IP 校验规则的优点在于可以有效地保护网络的安全,防止非法的访问和攻击。

ip校验规则

ip校验规则

ip校验规则一、IP校验规则简介IP校验规则是指用于验证IP地址格式和范围的规则,以确保网络通信的顺畅进行。

IP地址是互联网上设备之间互相通信的唯一标识,因此IP校验规则在保证网络稳定运行中起着至关重要的作用。

二、IP地址分类与表示方法1.IPV4地址IPV4地址是互联网最常用的地址类型,它采用32位二进制表示,总共分为A、B、C、D、E五类。

其中,A类地址范围为1.0.0.0至126.255.255.255,B类地址范围为128.0.0.0至191.255.255.255,C类地址范围为192.0.0.0至223.255.255.255,D类地址为组播地址,范围为224.0.0.0至239.255.255.255,E类地址为保留地址,范围为240.0.0.0至255.255.255.255。

2.IPV6地址IPV6地址是下一代互联网地址,采用128位二进制表示。

相较于IPV4,IPV6具有更多的地址空间,提高了网络安全性和隐私保护能力。

IPV6地址分为单播、组播和任播三种类型,用于不同场景的通信。

三、IP校验算法1.子网掩码子网掩码是一种用于划分IP地址的网络部分和主机部分的算法。

通过子网掩码,可以将一个大型网络划分为多个较小的子网,提高IP地址的利用率。

子网掩码通常用一个32位的二进制数表示,其中网络部分为1,主机部分为0。

2.CIDR(无类别域间路由)CIDR是一种用于表示网络地址的编码方式,它将IP地址和子网掩码合并为一个统一的表示形式。

CIDR地址格式为“IP地址/子网掩码”,如“192.168.1.0/24”。

CIDR有效地简化了网络地址的表示和计算,便于网络管理和规划。

3.网络层协议校验网络层协议校验是指对IP数据报进行校验,确保数据在传输过程中不被篡改。

主要方法有校验和算法、加密算法等。

这些算法可以检测到数据报在传输过程中的错误,保证数据完整性。

四、IP校验实例与应用1.网络诊断与故障排查通过IP校验规则,可以快速定位网络故障,如IP地址冲突、子网划分不当等问题。

ip校验和计算方法

ip校验和计算方法

计算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 正确。

IP 首部校验和的计算 zz

IP 首部校验和的计算 zz

IP 首部校验和的计算zz1IP数据包的头信息格式:+-------------------------------------------------+| 版本 (4位) |+-------------------------------------------------+| 首部长度(4位) |+-------------------------------------------------+| 服务类型(TOS)8位 |+-------------------------------------------------+| 数据包总长度(16位) |+-------------------------------------------------+| 标识ID号(16位) |+-------------------------------------------------+| 标志位(3位) |+-------------------------------------------------+| 片偏移(13位) |+-------------------------------------------------+| 生存时间(TTL)(8位) |+-------------------------------------------------+| 协议类型 (8位) |+-------------------------------------------------+| 首部校验和(16位) |+-------------------------------------------------+| 源IP地址(32位) |+-------------------------------------------------+| 目的IP地址 (32位) |+-------------------------------------------------+* IP选项(若有) (32位) *+-------------------------------------------------+* 数据 *+-------------------------------------------------+这里要说的是首部校验和字段。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

IP数据包的校验和算法IP数据包的头信息格式:+-------------------------------------------------+| 版本 (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);}。

相关文档
最新文档