《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翻译为组是不对的,正确的是“群”。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python数据分析:在职场中的竞争优势

前言 在职场中,技能的重要性是不言而喻的。越来越多的职位要求员工具备数据分析能力,而Python作为一种强大的数据分析工具,正在成为职场中的“利器”。然而,尽管Python数据分析提供了巨大的优势,许多人依然未能掌握这…

团队表 -多级团队设计

团队表 -多级团队设计 user_team团队表 ,如果存在子团队 1.我们可以通过每一个团队字段加一个parentid (相当于一对多的关系) 2.还可以设置一个字段CodingNum,比如这样: //系统为了管理查询团队自动生成的有序编号 可以使用3位数代表一个…

06.Oracle数据备份与恢复

Oracle数据备份与恢复 一、通过RMAN方式备份二、使用emp/imp和expdb/impdb工具进行备份和恢复三、使用Data guard进行备份与恢复 一、通过RMAN方式备份 通过 RMAN(Oracle 数据库备份和恢复管理器)方式备份 Oracle 数据库,可以使用以下步骤&a…

【漏洞复现】74cms任意文件读取

漏洞描述 74CMS 是一款国内用的比较多招聘网站管理系统(Job Board CMS),专注于招聘和人力资源领域的网站建设,存在任意文件读取漏洞 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律&#xff0c…

Temp directory ‘C:\WINDOWS\TEMP‘ does not exist

问题描述 解决方法 管理员权限问题,进入temp文件夹更改访问权限即可。 点击 temp文件夹 属性 -> 安全 -> 高级 -> 更改主体Users权限 给读取和写入权限 参考博客 开发springboot项目时无法启动Temp directory ‘C: \WINDOWS\TEMP‘ does not exist

K-edge 和逃逸问题

一 k-eage基本概念 1 k-edge概念 K-edge称为K边, 其物理意义是高原子序数物质原子内部K层自由电子, 易与特定能量下X射线光子发生光电吸收作用, 导致对该能量的X射线光子吸收特别大。 而K-edge特性表现为X射线与物质发生相互作用时, 其衰减系数随着能量的增加而逐渐减小, 但在…

Postgresql批量按照顺序更新某一个字段

如批量更新采购订单行sequence字段,按照订单行id的顺序赋值1,2,3,4...: UPDATE purchase_order_line_copy1 SET sequence subquery.new_sequence FROM (SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS new_sequence…

leetcode 117

leetcode 117 代码 #include <iostream>// Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NULL), next(NULL) {}Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}No…

python自动化测试模板

1:准备html模版 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>接口自动化…

天空卫士为集度智能汽车系上“安全带”

10月27日&#xff0c;集度汽车在北京正式发布了旗下首款量产车型——极越 01 SUV。极越 01 SUV 是一款集科技、智能、美学于一身的纯电动中大型SUV&#xff0c;号称全球首款“AI 汽车机器人”。作为集度的合作伙伴&#xff0c;天空卫士第一时间送上祝福&#xff0c;祝愿极越大卖…

基于LDA主题+协同过滤+矩阵分解算法的智能电影推荐系统——机器学习算法应用(含python、JavaScript工程源码)+MovieLens数据集(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据爬取及处理 相关其它博客工程源代码下载其它资料下载 前言 前段时间&#xff0c;博主分享过关于一篇使用协同过滤算法进行智能电影推荐系统的博文《基于TensorFlowCNN协同过滤算法的智能电影推荐系统——深…

centos7-lamp

目录 一、安装 1.关闭防火墙关闭selinux 2.安装apache 3.配置主页 二、部署mariadb&#xff08;mysql&#xff09; 1.用yum安装 2.启动数据库 3.看下端口是否listen 4登录mysql 5.修改下密码 三、安装php 1.安装依赖包 2.安装php解释器和php连接mysql驱动 3.配置…

Pure-Pursuit 跟踪双移线 Gazebo 仿真

Pure-Pursuit 跟踪双移线 Gazebo 仿真 主要参考学习下面的博客和开源项目 自动驾驶规划控制&#xff08;&#xff21;*、pure pursuit、LQR算法&#xff0c;使用c在ubuntu和ros环境下实现&#xff09; https://github.com/NeXTzhao/planning Pure-Pursuit 的理论基础见今年六月…

大模型在代码缺陷检测领域的应用实践

作者 | 小新、车厘子 导读 静态代码扫描(SA)能快速识别代码缺陷&#xff0c;如空指针访问、数组越界等&#xff0c;以较高ROI保障质量及提升交付效率。当前扫描能力主要依赖人工经验生成规则&#xff0c;泛化能力弱且迭代滞后&#xff0c;导致漏出。本文提出基于代码知识图谱解…

【python基础】python切片—如何理解[-1:],[:-1],[::-1]的用法

文章目录 前言一、基本语法二、切片1.a[i:j]2.a[i:j:k] 总结&#xff1a;[-1] [:-1] [::-1] [n::-1] 前言 在python中&#xff0c;序列是python最基本的数据结构&#xff0c;包括有string&#xff0c;list&#xff0c;tuple等数据类型&#xff0c;切片对序列型对象的一种索引方…

Spring Boot Actuator 漏洞利用

文章目录 前言敏感信息泄露env 泄露配置信息trace 泄露用户请求信息mappings 泄露路由信息heapdump泄露堆栈信息 前言 spring对应两个版本&#xff0c;分别是Spring Boot 2.x和Spring Boot 1.x&#xff0c;因此后面漏洞利用的payload也会有所不同 敏感信息泄露 env 泄露配置信…

【音视频 | Ogg】RFC3533 :Ogg封装格式版本 0(The Ogg Encapsulation Format Version 0)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Linux越学越头疼,我要怎么办?

最近&#xff0c;听到一些同学说&#xff0c;“Linux越学越头疼”。其实这句话&#xff0c;在我之前刚接触Linux的时候&#xff0c;也是深有感触。Linux越学越不明所以。最后干脆放弃学习&#xff0c;转而学习其他东西。 其实大家在初学Linux的时候&#xff0c; 有这个感受&am…

深度学习之基于Tensorflow卷积神经网络学生课堂坐姿姿势识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Tensorflow的卷积神经网络学生课堂坐姿姿势识别系统介绍 Tensorflow是一个流行的开源机器学习框架&#xff0c…

Vue项目运行时报错:‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

报错原因及解决 1.package.json 文件中未定义依赖项vue/cli-service&#xff0c;因此在 npm install 之后并没有安装vue/cli-service 依赖&#xff1b; 解决&#xff1a;项目目录下执行命令&#xff0c;npm i -D vue/cli-service。2.第1步排查后&#xff0c;还是报同样的错&a…