首页 > 其他分享 >如何求解网络报文中的checksum?

如何求解网络报文中的checksum?

时间:2023-06-25 16:12:44浏览次数:36  
标签:16 首部 checksum 报文 求解 检验 字段 IP

最近在学习计算机网络,在运输层和网络层部分存在各种协议TCP、UDP、IP、ICMP等等,而在这些报文中都存在一个公共的字段——检验和(checksum)。接下来,我将从什么是检验和、检验和怎么算、检验和计算示例、python代码计算检验和这几个部分详细介绍。

什么是检验和?
检验和是存在于各种报文中的一个字段,它存在的目的是验证报文在网络传输过程中的完整性(有的数据可能在链路传输时发生0-1数据翻转,从而导致报文出错)。因此,在报文的发送端,会根据报文中的首部或数据来计算一个检验和(IP报文的检验和只对首部进行计算,ICMP报文对报文首部和数据都进行计算),然后一旦接收端接受到相应报文,接收端也会对报文的首部或数据进行一次检验和计算,如果接收端算出来的检验和和发送端发送的不一样,那么对不起,接收端认为报文在传输过程中出了错,于是就丢掉该报文。

算法归纳
待检验部分从头开始,每16比特进行一次加法计算(如果最后有8位剩余,最后加上这8位),这样最终计算出来的和进行一次反码运算,就是检验和。
注意:如果求和过程中遇到了任何溢出,都进行回卷(即加回到最低位)

example


IP报文各字段
看完上面还迷迷糊糊的?没关系,在这里,就以IP报文为例,介绍更多的细节。首先,还是先把IP报文的各个字段信息回顾一下,如下图。如果你看到这个,有些字段忘记了它的意思,就百度回忆一下吧,这里我就不多说了。


IP首部检验和示例
现在假设有一个IP报文的首部如下所示(都是16进制数):
4500 003c 1c46 4000 4006 b1e6 ac10 0a63 ac10 0a0c

ok,我们将这个报文的各个字段一一来匹配一下

45 —— 对应IP首部前8位,4是version字段,表示IPV4,5是首部长度字段,但注意,首部长度是以每4个字节为1个单位的,所以这里就是5*4=20个字节 (这也说明IP报文首部的option字段和padding字段没用上)
00 —— 对应服务类型(TOS,type of service)字段,00表明是正常操作
003C —— 对应total length字段,说明改IP报文首部加数据段一共是60字节(也就是说,数据段部分占了40字节)
1C46 —— 对应报文标识符字段
4000 —— 对应flags和fragment offset字段,其中flag字段占3位,分片偏移占13位
40 —— 对应TTL字段(Time to live),表明该报文可以经过40跳(hops)
06 —— 对应IP报文封装的上层协议代码,这里是6,表明是TCP报文
b1e6 —— 这就是发送端即将求出来的检验和
ac10 0a63 —— 对应IP报文的源IP地址
ac10 0a0c —— 对应IP报文的目的IP地址
发送端

说明:在计算检验和字段之前,我们先把检验和的16位全部置0。

我们现在把16进制数全部转为二进制,如下:

4500 -> 0100010100000000
003c -> 0000000000111100
1c46 -> 0001110001000110
4000 -> 0100000000000000
4006 -> 0100000000000110
0000 -> 0000000000000000   // 先全部置零,最后再把算出来的结果附加上
ac10 -> 1010110000010000
0a63 -> 0000101001100011
ac10 -> 1010110000010000
0a0c -> 0000101000001100

然后我们每16位进行一次加法运算:

 

4500 -> 0100010100000000
003c -> 0000000000111100
453C -> 0100010100111100  // 第一次计算结果

453C -> 0100010100111100  // 第一次计算结果 加 后16位
1c46 -> 0001110001000110
6182 -> 0110000110000010 // 第二次计算结果

6182 -> 0110000110000010 // 第二次计算结果 加 后16位
4000 -> 0100000000000000
A182 -> 1010000110000010 // 第三次计算结果

A182 -> 1010000110000010 // 第三次计算结果 加 后16位
4006 -> 0100000000000110
E188 -> 1110000110001000

E188 -> 1110000110001000 
AC10 -> 1010110000010000
18D98 -> 11000110110011000 // 这里产生了一次溢出,根据回卷规则,把溢出位加到最后

18D98 -> 11000110110011000
8D99 -> 1000110110011001 // 进行类似16位加法。。。就不再重述了

8D99 -> 1000110110011001 
0A63 -> 0000101001100011
97FC -> 1001011111111100 

97FC -> 1001011111111100 
AC10 -> 1010110000010000
1440C -> 10100010000001100 // 由产生了进位,继续回卷

1440C -> 10100010000001100
440D -> 0100010000001101 

440D -> 0100010000001101 
0A0C -> 0000101000001100
4E19 -> 0100111000011001 

Well,终于加完了,别急还没完!!!还要求一次反码,别忘了哈~~

4E19 -> 0100111000011001
B1E6 ->1011000111100110  // 检验和

好了,这样我们再把b1e6这个检验和放进到IP报文的checksum字段,检验的工作也就此完成。

接收端
接收端就比较简单了,把所有的二进制位每16位进行一次加法,最后求一次补码(同样也要溢出回卷),如果结果全部是1,那就稳了,没出错;只要有一位是0,那就说明出现了错误。

标签:16,首部,checksum,报文,求解,检验,字段,IP
From: https://www.cnblogs.com/nayilvyangguang/p/17503153.html

相关文章

  • 《科普:微分方程求解》 回复
    《科普:微分方程求解》      https://tieba.baidu.com/p/8474008241      @黎合胜在相对论吧受刺激见  《相对论吧功能与公示专用贴》     https://tieba.baidu.com/p/8473308482    4楼  。 这几天我们在相对论吧有不少......
  • 指数积分方法(Exponential Integration)求解ODE/DAE问题
    1.Matrixexponentialmethod(MEXP) 解如下形式的方程, 通过指数积分方法,获得从t到t+h时间的递进关系: 写为的形式如下:  其中,  2. Krylov方法近似其中的矩阵向量积(MEVP)可以通过Krylov方法近似计算: 其中Vm是的Krylov子空间的基。若C为奇异矩阵,则无法求......
  • A First course in FEM —— matlab代码实现求解传热问题(瞬态)
    这一篇Blog是在AFirstcourseinFEM——matlab代码实现求解传热问题(稳态) 基础上更进一步,求解瞬态传热问题。两者的区别如下图所示: 1.问题描述求解下图图所示叶片的温度场在[0-1200s]时间段内的变化,初始条件:T(0)=25℃。控制方程为: 2.模型和网格模型和网格设置详......
  • 考虑分布式光伏储能系统的优化配置方法 完全复现截图文献模型 采用双层模型求解 上层
    考虑分布式光伏储能系统的优化配置方法完全复现截图文献模型采用双层模型求解上层决策储能系统配置容量用遗传粒子群算法求解下层决策最优运行策略采用cplex求解器求解算例为ieee33节点配电系统代码运行时间为90分钟左右此代码可改写性强这段程序是一个基于粒子群优化算......
  • 2、【java数据安全】base64与报文摘要MD(md5、sha、mac)简单介绍及应用场景、示例
    (文章目录)本文简单的介绍了Base64、消息摘要和其使用示例,并且使用示例以三种不同实现方式及测试本文介绍三种实现方式,即JDK、apachecommons.codec和bouncycastle三种。一、maven依赖<dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <......
  • 第二天:函数求极限及求解函数值
    1因为matlab中有limit函数因此求极限非常方便;1.1limit的语法为:limit(f,x,0)(意为关于x的f函数趋近于0的极限);1.2还有一个比较重要的用法便是求其左右极限:limit(f,x,0,'left')(左极限)同理可得:右极限为limit(f,x,'right');1.3当求出极限不存在时(即:ANS=NaN)时求左右极限就很有必......
  • nginx配置多个配置文件,nginx配置多个conf的方式 播报文章
    可以通过在nginx.conf文件中使用include关键字来引入多个子配置文件,从而实现对Nginx的多配置管理。下面是简单的操作步骤:  1.进入Nginx的conf目录(通常是/etc/nginx或者/usr/local/nginx/conf),创建一个名为conf.d的目录,用于存放多个子配置文件:  mkdir......
  • 【求解】下面这些标签能概括为哪些大类呢
    【求解】下面这些标签能概括为哪些大类呢?有没有现成的分类法?或者您有山寨分类法吗?诺基亚专家背包客驴子咨询师自由撰稿人自由摄影师编织围脖心情宅女散文摄影基督徒厨师养生食疗美食营养师法布雷加斯twitter西班牙语茉莉花茶摄影新闻读书电影设计喜欢......
  • A First course in FEM —— matlab代码实现求解传热问题(稳态)
    这篇文章会将FEM全流程走一遍,包括网格、矩阵组装、求解、后处理。内容是大三时的大作业,今天拿出来回顾下。 1.问题简介 涡轮机叶片需要冷却以提高涡轮的性能和涡轮叶片的寿命。我们现在考虑一个如上图所示的叶片,叶片处在一个高温环境中,中间通有四个冷却孔。假设为稳态,那......
  • 【优化配煤】基于遗传算法实现配煤问题优化求解附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......