《TCP/IP详解 卷一:协议》第5章的IPv4数据报的Checksum(校验和)字段的计算(这里才能解开你的困惑)

首先,我当你看过书,但是比较懵。

1,实例说明Checksum(校验和)的计算步骤

直奔主题,分析一下这个Checksum(校验和)怎么算出来的。

先用Wireshark随便抓一个UDP或TCP包分析一下。

如上面,我们得到IP帧头部实际数据(十六进制):

45 00 00 34 fd 34 40 00 80 11 79 46 c0 a8 63 64 31 07 2f 2a

我们看到Wireshark分析出来的Header Checksum是0x7946,下面我们计算验证一下。

Step1:根据IPv4头部格式,我们知道第11和12个字节是要填写的Checksum,先把这两个字节都设置为0,得到

45 00 00 34 fd 34 40 00 80 11 00 00 c0 a8 63 64 31 07 2f 2a

Step2:每两个字节组成一个数字,然后累加

4500 + 0034 + fd34 + 4000 + 8011 + 0000 + c0a8 + 6364 + 3107 + 2f2a =3 86B6

提示:可以把整个算式连同等号粘贴到Windows计算器(程序员模式,HEX方式)能得到结果。

Step3:把后面两个字节组成的数字86B6 和 进位3相加,上面的 3 86B6,分开两个数相加就是

3 + 86B6 = 86B9,一般是写成 86B6 + 3 = 86B9

Step4:取反

~(86B9)=~(1000 0110 1011 1001)=0111 1001 0100 0110=7946 (十六进制!)

所以得到Checksum是0x7946 是对的。

上面是发送端计算出checksum的过程。

下面是接收端校验的过程:

接收到得到数据:45 00 00 34 fd 34 40 00 80 11 79 46 c0 a8 63 64 31 07 2f 2a

同样也是先把checksum两个字节先忽略(当0000),然后每两个字节组成一个数,累加:

4500 + 0034 + fd34 + 4000 + 8011 + 0000 + c0a8 + 6364 + 3107 + 2f2a =3 86B6

进位数加到低位,再变成 3 + 86B6 = 86B9

注:上面几个步骤跟发送端是一样的。

然后再加上checksum这个数:86B9+7946=FFFF

取反:~(FFFF)= 0000

结果是0000就证明没错。

2,解惑时刻

这本书举例说的补码、反码(如下图),跟我们开始接触计算机学到的补码、反码是两码事!

或者你可以这么理解,这里说的数字都是无符号整数,正整数的补码就是自己,所以这里说的补码根本不是什么补码,就是本身;

这里说的反码,只是简单的按位取反!按位取反!(不是以前学的,正整数的反码是自身,不是.)

关键是求和的时候,是每16位(2个字节)组成一个数字 再累加的!

1E4FF怎么得来的?就是E34F+2396+4427+99F3+0000=1E4FF

接下来为什么 E4FF + 1 不是 E4FF + 2 ?因为刚才算的结果是1E4FF,进位数是1,如果得到的结果是9E4FF,那这一步就是 E4FF + 9。(那为什么要这么加呢?这就要搬出阿贝尔群了)

接下来就是取反操作了。

大家可以看下IETF的文档,里面甚至有C语言示例代码。

RFC 1071 - Computing the Internet checksum

3,阿贝尔群(Abelian Group)

这里只是顺便提一下。阿贝尔群概念相对简单,就是满足一般群的4个公理,又满足交换律公理:

交换性(Commutativity):对于G 中任意两个元素a,b, 满足a⋅b = b⋅a

这就OK了,阿贝尔群又叫交换群。

对于群的概念,要注意理解的是,中间点"⋅"运算符虽然被叫为"乘法",实际上,它只是代表一种运算,可以是加法,也可以是乘法,或者减法、位运算

至于上面Checksum背后的数学性质与阿贝尔群的关系,书上有解释,在此不赘述。

书中有句话:对于16位的十六进制值 集合V = { 0001, ..., FFFF } 与其反码和运算 "+"共同形成一个阿贝尔群。

——这句话的说明了,定义" + "为 二进制反码和  运算,这个很关键。同样,这里的反码是按位取反的意思。

——书上说:对于V中的任何X,e + X = X + e = X,其中 e = FFFF。为什么呢?这里面有一步很关键的操作就是,进位数要加到低位去,举个栗子(都是十六进制数为例):FFFF + 0001 = 10000,进位为1,加到0000,结果就是0001,这才满足e + X = X  (e = FFFF),不然你打死都不明白。

——这里吐槽一下书上把group翻译为组是不对的,正确的是“群”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/159585.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python词云生成工具3:定制更多参数

文章目录 添加整型参数布尔型参数背景颜色词云生成逻辑源代码 Python打造一个词云软件显示分词结果 添加整型参数 我们所有的设置都放在了wcDct中,所以若想用更多的参数来定制词云,那么只需在wcDct中添加内容,例如下面这些整型参数 其次&a…

小米手机刷EU版ROM教程

第一件事 拿到手机第一件事是登录账号,然后开启开发者模式,设置中搜索:手机解锁状态 绑定解锁账号,等168小时候才能解锁 提前下载软件包 官方解锁工具 官方Fastboot工具 recovery包:twrp ROM包 其他: EU rom论坛页…

最新 IntelliJ IDEA 旗舰版和社区版下载安装教程(图解)

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

玻色量子“天工量子大脑”亮相中关村论坛,大放异彩

2023年5月25日至30日,2023中关村论坛(科博会)在北京盛大召开。中关村论坛(科博会)是面向全球科技创新交流合作的国家级平台行业盛会,由科技部、国家发展改革委、工业和信息化部、国务院国资委、中国科学院、…

3D模型格式转换工具HOOPS Exchange:如何将3D PDF转换为STEP格式?

3D CAD数据在制造、工程和设计等各个领域都扮演着重要的角色。为了促进不同软件应用程序之间的协作和互操作性,它通常以不同的格式进行交换。 HOOPS Exchange是一个强大的软件开发工具包,提供了处理和将3D CAD数据从一种格式转换为另一种格式的解决方案…

pinia简单使用

新命令-创建vue3项目 vue create 方式使用脚手架创建项目,vue cli处理, vue3后新的脚手架工具create-vue 使用npm init vuelatest 命令创建即可。 在pinia中,将使用的组合式函数识别为状态管理内容 自动将ref 识别为stste,computed 相当于 ge…

概念解析 | 神经网络中的位置编码(Positional Encoding)

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:Positional Encoding 神经网络中的位置编码(Positional Encoding) A Gentle Introduction to Positional Encoding in Transformer Models, Part 1 1.背景介绍 在自然语言处理任…

在Qt中解决opencv的putText函数无法绘制中文的一种解决方法

文章目录 1.问题2.查阅资料3.解决办法 1.问题 在opencv中,假如直接使用putText绘制中文,会在图像上出现问号,如下图所示: 2.查阅资料 查了一些资料,说想要解决这个问题,需要用到freetype库或者用opencv…

【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A:基于计算机视觉的坑洼道路检测和识别 python 代码解析

【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A:基于计算机视觉的坑洼道路检测和识别 python 代码解析 1 题目 坑洼道路检测和识别是一种计算机视觉任务,旨在通过数字图像(通常是地表坑洼图像)识别出存在坑洼的道路。这…

代码随想录算法训练营第四十三天丨 动态规划part06

518.零钱兑换II 思路 这是一道典型的背包问题,一看到钱币数量不限,就知道这是一个完全背包。 对完全背包还不了解的同学,可以看这篇:动态规划:关于完全背包,你该了解这些!(opens new window)…

C/C++与圆相关的计算 2021年3月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C与圆相关的计算 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C与圆相关的计算 2021年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给出圆的半径,求圆的直径、周长…

Linux常用命令——chattr命令

在线Linux命令查询工具 chattr 用来改变文件属性 补充说明 chattr命令用来改变文件属性。这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式: 语法 chattr(选项)选项 a:让文件或目录仅供附加用途&#xff…