关于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. unity游戏开发之NGUI的UISprite染色

    游戏的UI开发中常常会遇到染色问题.比如button失效变灰的效果,同一个道具通过策划表配的颜色值染上红绿蓝紫等颜色,效果例如以下 最笨最挫的方法当然是让美术多出几个资源图.这种一个缺点是浪费资源,在 ...

  2. Android訪问网络,使用HttpURLConnection还是HttpClient?

    原文地址:http://android-developers.blogspot.com/2011/09/androids-http-clients.html 大多数的Android应用程序都会使用HT ...

  3. Objective-c基础知识学习笔记

    Objective-c基础知识学习笔记(一) 一直有记录笔记的习惯.但非常久没分享一些东西了,正好上半年開始学习IOS了,如今有空写点.因开发须要,公司特意为我们配置了几台新MAC.还让我们自学了2周 ...

  4. Linux - 进程管理,ps与top

    一个运行的程序,可能有多个进程. PID进程ID. UID启动进程的ID. 进程所属组GID. 进程的状态R运行.S睡眠.Z僵尸. 父进程管理子进程,父进程终止的时候子进程也会终止. 常用的组合为: ...

  5. JS垃圾回收——和其他语言一样,JavaScript 的 GC 策略也无法避免一个问题:GC 时,停止响应其他操作,这是为了安全考虑

    JavaScript 内存管理 & 垃圾回收机制 标记清除 js 中最常用的垃圾回收方式就是标记清除.当变量进入环境时,例如,在函数中声明一个变量,就将这个而变量标记为“进入环境”.从逻辑上讲 ...

  6. MYSQL工具之binlog2sql闪回操作

    文档结构: 在生产环境中如果遇到误删,改错数据的情况,利用mysql闪回工具binlog2sql,可以实现数据的快速回滚,从binlog中提取SQL,并能生成回滚SQL语句.Binlog以event作 ...

  7. 一个 passive 引发的bug

    不是什么很难的东西,权且做个记录. 首先说下背景,目前的项目中,需要同时绑定 wheel 和 scroll 事件. 绑定 wheel,目的是开发 ctrl + wheel 缩放页面功能,此功能与浏览器 ...

  8. AtCoder Regular Contest 069

    1. C - Scc Puzzle 计算scc的个数,先判断s个数需要多少个cc,多的cc,每四个可以组成一个scc.注意数据范围,使用long long. #include<bits/stdc ...

  9. CSS浮动相关解决办法

    浮动元素引起的问题: 1. 父元素的一级子元素全都为浮动元素的情况下,父元素的高度无法被撑开,影响与父元素同级的元素 2. 与浮动元素同级的非浮动元素(内容)会跟随其后 3. 若非第一个元素浮动,则该 ...

  10. 了解jQuery的$符号

    $是什么? 可以使用typeof关键字来观察$的本质. console.log(type of $); //输出结果为function 因此可以得出结论,$其实就是一个函数.$(); 只是根据所给参数 ...