关于IP数据包首部校验字段的理解
IP数据包格式及首部个字段:
  www.2cto.com  

对上表的各个数据项就不一一解释了,这里具体关注以下几个数据项:

1、4位首部长度:这里的长度指的是4Bytes单元的个数,例如上图在“选项”字段不存在的情况下,IP包的首部是20Bytes,那么首部长度字段应该为5。另外根据首部长度的位数,也可以得知IP数据包的首部最长为:(2^4 - 1) * 4  = 60 Bytes,当然这个不常用,为了减少开销IP数据包的首部一般为20 Bytes.

2、16位总长度:整个IP数据包的长度,字节为单位,很显然可以利用总的数据包的长度减去数据包的首部长度可以得到IP数据数据包中数据内容的长度,同理可以得知IP数据包的MAX_LENGTH为65535 Bytes,这个字段是IP首部必要的内容。

3、16位首部校验和:
steve的书上是这样说的:
 a、把校验和字段置零
 b、对首部中每个16位进行二进制反码求和(整个首部看成是由一串16BIT的字组成),结果存在校验和字段中。
 c、收到一份IP数据报后,同样对首部的每个16bit进行二进制反码求和(高位溢出添加到低位,与通常的补码运算直接丢弃溢出的高位不同)。
 d、接收方在计算过程中包含了发送方存在的首部校验和,因此,首部在发送过程中如果没有任何差错,那么接收方计算的检验结果应该全为1(0xFFFF),否则表明数据包接收错误,丢弃该IP包。
注意:这里的二进制反码求和理解应该为对各个16Bbit进行求和后取反,关键是这些16bit的单元加在一起,如果没有整除16(size还存在不足16位),则应该加上剩余的部分,这是的结果应该会超出16位,所以要对高出16位的的和再次与低16位相加得到cksum,这是第一步。而第一步相加是很可能会再次产生进位,因此需要再次把进位移到低16位相加的到最终的cksum的反码,这是将结果取反即可。

下面还是通过TEST SOURCE CODE来仔细了解该过程:

通用的校验函数:

Main函数中调用:

从理论上判断,如果对接收的IP包中的校验值再次重新校验一次,在数据包准确无误的情况下,得出的新的校验值应该是0XFFFF(当然,计算机用补码在计算,可能显示的结果是0),其他的结果表示接收到的数据包有错误。故cksum 2应该为0, cksum 3应该与cksum 1相同。

这里验证过:

IP数据包中的首部校验字段的算法不采用循环冗余算法,是因为IP包在网络中传输时,其TTL字段的值经常会变化,故采用简单的叠加方法,就可以避开中间路由器重新计算其校验值,只是简单的增加1操作即可,这样可以明显提高传输效率。

关于IP数据包首部校验字段的理解的更多相关文章

  1. TCP/IP 数据包报文格式(IP包、TCP报头、UDP报头)(转)

    reference:http://blog.51cto.com/lyhbwwk/2162568                    https://blog.csdn.net/wangzhen209 ...

  2. IP数据包的校验和算法

    1.算法思路: IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法如下: 在发送数据时,为了计算IP数据包的校验和.应该按如下步骤: (1)把IP数据包的校验和字段置为0: ( ...

  3. 计算机网络漫谈之IP数据包

    网络层从 网络层 .IP与子网掩码 前前后后我们也说了两次了,IP 这个东西絮絮叨叨的也一直在提.今天我们来解开IP协议的面纱,还记得我们之前在数据链路层说的物理帧的结构吗?就是这样: 其中Head叫 ...

  4. IP报文解析及基于IP 数据包的洪水攻击

    版本(4bit) 报头长度(4bit) 优先级和服务类型(8bit) 总长度(16bit) 标识(16bit) 标志(3bit) 分段偏移(13bit) 存活期(8bit) 协议(8bit) 报头校验 ...

  5. TCP/IP数据包结构具体解释

    [关键词] TCP IP 数据包 结构 具体解释 网络 协议 一般来说,网络编程我们仅仅须要调用一些封装好的函数或者组件就能完毕大部分的工作,可是一些特殊的情况下,就须要深入的理解 网络数据包的结构, ...

  6. IP,TCP,UDP Checksum校验

    IP数据报的校验: IP数据报只需要对数据头进行校验,步骤如下: 将接收到的数据的checksum字段设置为0 把需要校验的字段的所有位划分为16位(2字节)的字 把所有16位的字相加,如果遇到进位, ...

  7. [na]ip数据包格式

    IP Datagram Structure 字段名 解释 版本 IP协议的版本,目前的IP协议版本号为4,下一代IP协议版本号为6. 首部长度 IP报头的长度.固定部分的长度(20字节)和可变部分的长 ...

  8. IP数据包格式

    IP数据包格式 0 4 8 16 31 |4位版本 | 4位首部长度 | 8位服务类型 | 16位总长度(字节数)| |16位标识 | 3位标志 | 13位片偏移 | |8位生存时间| 8位协议 | ...

  9. IP报文格式及各字段意义

    IP数据包由报头和数据两部分组成.报头的前一部分是固定长度,共20字节.在报头的固定部分的后面是可选部分——IP选项和填充域. 首部各字段的含义如下 1.版本      占4位,指IP协议的版本. 2 ...

随机推荐

  1. javaScript面向对象继承方法经典实现

    转自原文javaScript面向对象继承方法经典实现 JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭.很多人都说JavaScript不能算是面向对象的变成语言.但是Ja ...

  2. Spring boot 前后台分离项目 怎么处理spring security 抛出的异常

    最近在开发一个项目 前后台分离的 使用 spring boot + spring security + jwt 实现用户登录权限控制等操作.但是 在用户登录的时候,怎么处理spring  securi ...

  3. POJ1789&ZOJ2158--Truck History【最小生成树变形】

    链接:http://poj.org/problem?id=1789 题意:卡车公司有悠久的历史,它的每一种卡车都有一个唯一的字符串来表示,长度为7,它的全部卡车(除了第一辆)都是由曾经的卡车派生出来的 ...

  4. SAP WEBSERVICE Soap中RPC-style和Document-style

    RPC是以方法调用的方式描写叙述WebSerivce的,也就是说,你要说清楚调用的那个方法,以及各个參数的名称和值.要描写叙述这些东东.SOAP消息就要有一个统一的规范,指出那一部分是方法名.哪个部分 ...

  5. Additive equations--zoj

    Additive equations Time Limit: 10 Seconds      Memory Limit: 32768 KB We all understand that an inte ...

  6. Node.js:Strea

    ylbtech-Node.js:Stream 1.返回顶部 1. Node.js Stream(流) Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请 ...

  7. MongoDB实现数组中重复数据删除

    这个功能真的是写死我了,对于MongoDB一点都不熟悉,本来想使用spring与MongoDB的融合mongoDBTemplate,发现压根不是web项目,懒得配置那些配置文件,就使用最原始的数据库操 ...

  8. RabbitMQ消息队列服务

    MQ 全称为 Message Queue, 消息队列( MQ ) 是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们. 一个软件它 ...

  9. Xcode7.3 使用NSURLSession发送HTTP请求报错

    控制台打印:Application Transport Security has blocked a cleartext HTTP (http://) resource load since it i ...

  10. VS中的路径宏

    说明$(RemoteMachine)设置为“调试”属性页上“远程计算机”属性的值.有关更多信息,请参见更改用于 C/C++ 调试配置的项目设置.$(References)以分号分隔的引用列表被添加到项 ...