ip校验与计算

IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法如下:
  在发送数据时,为了计算IP数据包的校验和。应该按如下步骤:
  (1)把IP数据包的校验和字段置为0;
  (2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和;
  (3)把得到的结果存入校验和字段中。
  在接收数据时,计算数据包的校验和相对简单,按如下步骤:
  (1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;
  (2)检查计算出的校验和的结果是否等于零(反码应为16个1);
  (3)如果等于零,说明被整除,校验是和正确。否则,校验和就是错误的,协议栈要抛弃这个数据包。
  所谓的二进制反码求和,即为先进行二进制求和,然后对和取反。
  IP数据报格式

假设IP头为:4500 0046 17d9 0000 4011 ec1d(校验字段) ac1c 0f3b  ac1c 0f3d

计算:

4500 + 0046 +17d9 + 0000 + 4011+ ec1d +ac1c + 0f3b + ac1c + 0f3d

取出的和相加再取反->即为应填充的校验和

当接受到IP数据包时,要检查IP头是否正确,则对IP头进行检验,方法同上:

计算:

44500 + 0046 +17d9 + 0000 + 4011+ ec1d +ac1c + 0f3b + ac1c + 0f3d再与它们的和相加得出的一个数再次相加为FFFF,得到的结果是全一,正确。

现假如一数据报为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

代码实现

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>>16) + (cksum&0xffff);

cksum += (cksum>>16);

return (USHORT)(~cksum);

}

时间: 2024-10-10 08:44:46

ip校验与计算的相关文章

身份证号生成,校验码计算

二代身份证号有18位,组成是: 6位地区码+8位出生年月日+3位顺序码+1位校验码 其中,校验码计算如下图,本范例按照红色计算方向走 第一步骤就是映射权重:第二步骤是求积:第三步骤相加求余:最后一个步骤就是查找码表得出最后1位字符 红色方向数字更小,计算更快. import randomimport time   # 地区区域码,此范例只列出3位areas = ('610622', '410901', '321281', '350581')# 身份证前17位权重w17 = (7, 9, 10,

点分十进制IP校验、转换,掩码校验

/***************************************************************************** * 点分十进制IP校验.转换,掩码校验 * 声明: * 本文主要记录如何对IP.掩码进行转换.校验等相关内容. * * 2016-5-5 深圳 南山平山村 曾剑锋 ****************************************************************************/ 一.参考文档: 1.

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

IP地址快速计算

我们知道一个 C 类 IP 地址段中有 256 个 IP.一个 B 类地址段中有 65536 个 IP.计算方法为 256*256 那么一个 A 类 IP 地址则有 256*256*256 个 IP.子网掩 码分别为 255.255.255.0,255.255.0.0,255.0.0.0. 不管是 255.X.0.0 还是 255.255.X.0 或者是 255.255.255.X 我们一般只计算 X 的部分 X 部分的总位数一共是 8 位按以下方法进行划分,掩码部分可以不计. 因为掩码部分的计

由IP和掩码计算广播地址

public static IPAddress GetBroadcast(IPAddress ipAddress, IPAddress subnetMask) { var ip = ipAddress.GetAddressBytes(); var sub = subnetMask.GetAddressBytes(); // 广播地址=子网按位求反 再 或IP地址 for (var i = 0; i < ip.Length; i++) { ip[i] = (byte) ((~sub[i]) | i

【网络技术】根据ip地址子网掩码计算网络地址、直接广播地址、主机号

我不用专业的角度 去分析,我用傻瓜方法去做题. 这是模拟题,拿这个题做例子. 网址类型:当然是B类就不多说了 把ip地址和子网掩码转换成二进制,然后进行与运算. 145.189.24.3        10010001 10111101 00011000 00000011 255.255.224.0      11111111 11111111 11100000 00000000 网络地址:把ip地址和子网掩码进行与运算.两个1碰上是1  一个1碰上是0  两个0碰上 是0 变成了:      

使用Python计算IP、TCP、UDP校验和

1.1 ip校验和的计算 Ip校验是针对ip头部的,即仅校验ip头部,而对于ip数据部分的校验,则交由相应的四次协议来保证, ip 头部中校验和字段为16bit. 计算原理如下: 1.把校验和字段设置为0 2.计算ip头部中所有16bit的字之和 3.将2中得到的和按位取反,得到校验和. 1.2 tcp校验和的计算原理 对于ip层协议来说,其校验和只要计算ip头即可,那相对的,对于四层协议来说,其校验和则需要计算四层头部与四层数据. tcp校验需要将ip伪首部.tcp报头.tcp数据分为16位的

CRC校验码原理、实例、手动计算

CRC16实现代码 思路:取一个字符(8bit),逐位检查该字符,如果为1,crc^crc_mul;同时,如果原本crc最高位是1,那么crc^crc_mul后左移1位,否则只是左移一位.计算完一个字符后,装入下一个字符. #include<stdio.h> #define crc_mul 0x1021 //生成多项式 unsigned int cal_crc(unsigned char *ptr, unsigned char len) { unsigned char i; unsigned

python 文件MD5 SHA1校验计算

#coding: GBK #md5SHA1文件校验值计算 #使用方法: python 文件.py  验证文件 import hashlib import sys import os defmd5_sum(filename):     #校验值方法 fd=open(filename,"rb") #打开文件 fd.seek(0)             #将文件打操作标记移到offset的位置 line=fd.readline()     #读取文件第一行进入line #md5校验值计算