IP、ICMP、TCP和UDP校验和计算

news2024/12/19 11:23:23

一. 前言

        计算网络数据包的校验和是机器自动完成,不需要手动计算。但是正因为如此,我们往往不会去深究校验和到底是怎么计算的,留下这一块盲区。虽然书上有大致介绍计算的方法,但是,“纸上得来终觉浅,绝知此事要躬行”,本文将详细演示IP、ICMP、TCP、UDP的校验和的计算步骤。

二. IP数据包头部校验和       

        我们知道,IP数据包头部的校验和只是计算头部的数据,所以,计算只需要关注IP头部,抓包示例如下:

        如上图可知,IP头部的校验和是0xF89A,计算过程如下:

1. 取IP头部数据

45 04 00 34 f7 6a 40 00 33 06 f8 9a 6a 0b 2b 9e c0 a8 01 69

2. 将校验和部分先置为00 00

 45 04 00 34 f7 6a 40 00 33 06 00 00 6a 0b 2b 9e c0 a8 01 69

3. 将数据合并为16位一组并相加

4504+0034+f76a+4000+3306+0000+6a0b+2b9e+c0a8+0169=30762

4. 将结果的高16位与低16位相加

762 + 3 = 765

5. 将0xFFFF减上一步结果得到校验和

0xFFFF - 0x765 = 0xF89A

6. 与抓包的校验和比较是一致的 

三. ICMP数据包校验和

        ICMP的校验和是包括:ICMP头部和ICMP数据的,也就是ICMP的全部数据的校验和,抓包示例如下:

        如上图可知,ICMP的校验和是0x2B7D,计算过程如下:

1. 取ICMP全部数据

08 00 2b 7d 08 83 00 00 f3 f2 d0 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

2. 将校验和部分置为00 00

08 00 00 00 08 83 00 00 f3 f2 d0 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

3. 将数据合并为16位一组并相加,后面的00忽略

0800+0000+0883+0000+f3f2+d00c=1d481

4. 将结果的高16位与低16位相加

d481 + 1 = d482

5. 将0xFFFF减上一步结果得到校验和

0xFFFF - 0xD482 = 0x2B7D

6. 与抓包的校验和比较是一致的 

四. TCP数据包校验和

        TCP的数据包的校验和计算的数据来源包括三部分:TCP伪首部和TCP首部和TCP数据。TCP计算校验和引入了伪首部,包括后面介绍的UDP。如下图所示,TCP伪首部包括:源地址(32 bit),目标地址(32 bit),Zeros(8 bit),Protocol(8 bit),TCP Length(16 bit)

        TCP的伪首部的提取需要查看IP头部数据,例如,源地址,目标地址,TCP协议号(6),TCP数据长度,抓包示例如下:

        由上图可知,源地址是106.11.43.158(6a 0b 2b 9e), 目标地址192.168.1.105(c0 a8 01 69),TCP的协议号是6,TCP数据长度是IP数据总长度减去IP头部52-20=32(0x20)。接下来是TCP头部和数据部分抓包示例:

        由上图可知,TCP的校验和是0x755E,计算过程如下:

1. 取伪首部的数据

Source Address   Destination Address     Zeros   Protocol   TCP Length

6a 0b 2b 9e          c0 a8 01 69                   00          06              00 20

2. 将伪首部数据合并为16位一组并相加

6a0b+2b9e+c0a8+0169+0006+0020=157E0

3. 取TCP数据

01 bb de c0 d3 86 24 c6 0e 5f 8d 90 80 10 00 0e 75 5e 00 00 01 01 05 0a 0e 5f 8d 8f 0e 5f 8d 90

4. 将校验和部分置为00 00

01 bb de c0 d3 86 24 c6 0e 5f 8d 90 80 10 00 0e 00 00 00 00 01 01 05 0a 0e 5f 8d 8f 0e 5f 8d 90

5. 将TCP数据合并为16位一组并相加

01bb+dec0+d386+24c6+0e5f+8d90+8010+000e

+0000+0000+0101+050a+0e5f+8d8f+0e5f+8d90=432BC

6. 将伪首部和TCP数据的相加结果相加

157E0 + 432BC = 58A9C

7. 将上一步结果的高16位和低16位相加

8A9C + 5 = 8AA1

8. 将0xFFFF减8AA1得到校验和

0xFFFF - 0x8AA1 = 755E

9. 与抓包的校验和比较是一致的 

五. UDP数据包校验和

        UDP数据校验和和TCP数据的校验和计算的方法是一致的,包括:UDP伪首部,UDP头部和UDP数据

        UDP的伪首部的提取需要查看IP头部数据,例如,源地址,目标地址,UDP协议号(17),UDP数据长度,抓包示例如下:

        由上图可知,源地址是192.168.1.40(c0 a8 01 28), 目标地址111.230.189.174(6f e6 bd ae),UDP的协议号是17 (0x11),UDP数据长度是IP数据总长度减去IP头部76-20=56(0x38)。接下来是UDP头部和数据部分抓包示例:

        由上图可知,UDP的校验和是0x3AF9,计算过程如下:

1. 取伪首部的数据

Source Address   Destination Address     Zeros   Protocol   TCP Length

c0 a8 01 28            6f e6 bd ae                   00          11            00 38

2. 将伪首部数据合并为16位一组并相加

c0a8+0128+6fe6+bdae+0011+0038=1EFAD

3. 取UDP头部和数据部分

89 34 00 7b 00 38 3a f9 23 00 08 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 76 0c e9 2c 37 38 89 de

4. 将校验和部分置为00 00

89 34 00 7b 00 38 00 00 23 00 08 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 76 0c e9 2c 37 38 89 de

5. 将UDP数据合并为16位一组并相加

8934+007b+0038+0000+2300+0820+0000+0000+0000+0000+0000+0000+0000

+0000+0000+0000+0000+0000+0000+0000+0000+0000+0000+0000+760c+e92c

+3738+89de = 2D555

6. 将伪首部和UDP数据的相加结果相加

1EFAD + 2D555 4C502

7. 将上一步结果的高16位和低16位相加

C502 + 4 = C506

8. 将0xFFFF减C506得到校验和

0xFFFF - 0xC5063AF9

9. 与抓包的校验和比较是一致的 

六. 总结

        本文主要介绍了IP、ICMP、TCP和UDP的计算方式,并附带介绍了TCP和UDP的伪头部的概念和组成。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树——验证二叉搜索树

验证二叉搜索树 链接 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 …

【Proteus仿真】【51单片机】粮仓温湿度控制系统设计

文章目录一、功能简介二、软件设计三、实验现象联系作者一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用声光报警模块、LCD1602显示模块、DHT11温湿度模块、继电器模块、加热加湿除湿风扇等。 主要功能: 系统运行后,LCD1602显示传…

LeetCode 144. 二叉树的前序遍历

144. 二叉树的前序遍历 难度:easy\color{Green}{easy}easy 题目描述 给你二叉树的根节点 rootrootroot ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3]示例 2: 输入&#…

Web前端学习:三 - 练习

三六&#xff1a;风筝效果 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">*{margin: 0;padding: 0;}.d1{width: 200px;height: 200px;background: yellow;position…

链表的排序:插入排序和归并排序

文章目录链表的排序&#xff1a;插入排序和归并排序147. 对链表进行插入排序148. 排序链表链表的排序&#xff1a;插入排序和归并排序 两道例题进行记录。 147. 对链表进行插入排序 题目链接&#xff1a;https://leetcode.cn/problems/insertion-sort-list/ 题目大意&#x…

计算机网络笔记 | 第一章:计算机网络概述(1.1-1.4小节知识点整理)

从专栏将讲述有关于计算机网络相关知识点&#xff0c;如果有想学习Java的小伙伴可以点击下方连接查看专栏&#xff0c;还有JavaEE部分 本专栏地址&#xff08;持续更新中&#xff09;&#xff1a;&#x1f525;计算机网络 MyBatis&#xff1a;✍️MyBatis Java入门篇&#xff1…

nginx安装部署实战手册

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、虚拟机安装nginx1.下载安装包2.安装编译工具和库文件3.编译安装4.启动nginx5.访问首页6.开机自启结尾一、虚拟机安装nginx 1.下载安装包 官网下载地址&#xf…

zabbix4.0-自定义脚本告警

目录 1、在zabbix-server端下载mailx 2、配置mailx配置文件 3、查看zabbix-server设置的 AlertScriptsPath变量 4、在对应路径下面编写邮件脚本 5、创建一个媒介类型 6、为用户指定媒介类型 7、更改触发器表达式进行测试 1、在zabbix-server端下载mailx [rootzabbix-serve…

FastASR+FFmpeg(音视频开发+语音识别)

想要更好的做一件事情&#xff0c;不仅仅需要知道如何使用&#xff0c;还应该知道一些基础的概念。 一、音视频处理基本梳理 1.多媒体文件的理解 1.1 结构分析 多媒体文件本质上可以理解为一个容器 容器里有很多流 每种流是由不同编码器编码的 在众多包中包含着多个帧(帧在音视…

投票链接制作可以制作投票的软件不记名投票模板视频投票平台

手机互联网给所有人都带来不同程度的便利&#xff0c;而微信已经成为国民的系统级别的应用。现在很多人都会在微信群或朋友圈里转发投票&#xff0c;对于运营及推广来说找一个合适的投票小程序能够提高工作效率&#xff0c;提高活动的影响力。那么微信做投票的小程序哪个比较好…

Spyder初使用

Spyder初使用写在最前面偏好设置汉化背景颜色代码编辑快捷键分段代码运行配置环境调试写在最前面 Spyder类似于MATLAB界面。 交互式写代码&#xff0c;有工作空间&#xff0c;可以一览自己设置的变量都有啥 将高级编辑、分析、调试和全面开发工具的分析功能与数据探索、交互…

Spring Cloud Nacos源码讲解(九)- Nacos客户端本地缓存及故障转移

Nacos客户端本地缓存及故障转移 ​ 在Nacos本地缓存的时候有的时候必然会出现一些故障&#xff0c;这些故障就需要进行处理&#xff0c;涉及到的核心类为ServiceInfoHolder和FailoverReactor。 ​ 本地缓存有两方面&#xff0c;第一方面是从注册中心获得实例信息会缓存在内存当…

CODESYS Install

CODESYS InstallCODESYS 由 Development System 和 Runtime System 两部分组成&#xff0c;Development System 就是一个 IDE&#xff0c;是免费使用的&#xff0c;可以在 CODESYS 官网下载并安装。程序写好以后&#xff0c;就要把它转移到硬件设备中运行。这时生成的程序自己是…

Python3-运算符

什么是运算符&#xff1f; 本章节主要说明 Python 的运算符。 举个简单的例子: 4 5 9 例子中&#xff0c;4 和 5 被称为操作数&#xff0c; 称为运算符。 Python 语言支持以下类型的运算符: 算术运算符 比较&#xff08;关系&#xff09;运算符 赋值运算符 逻辑运算符 位运…

nginx配置https域名

如果已安装nginx若没有配置ssl模块需要添加ssl模块。注意&#xff1a;默认是不会安装ssl模块的查看nginx是否有安装ssl模块./nginx -V若执行结果显示下图中的-with-http_ssl_module则说明nginx已经安装了ssl模块若没有安装则重新打包编译./configure --with-http_ssl_module编译…

主题模型实践

目录 一.TF-IDF 二.LSI 三.相似度 四.主题和主题分布 五. LDA计算的相似度 六.LDA过程 七.主题 八.主题和主题分布 九.数据处理流程 十.常用正则表达式 十一.代码 一.TF-IDF 二.LSI 三.相似度 四.主题和主题分布 五. LDA计算的相似度 六.LDA过程 七.主题 八.主题和主…

Kotlin 37. Android,Assets 以及 Res/raw 文件夹下存放调用文件介绍及对比

一起来学Kotlin&#xff1a;概念&#xff1a;24. Assets 以及 Res/raw 文件夹下存放调用文件介绍及对比 有些时候&#xff0c;我们需要将一些文件&#xff08;e.g. JSON, Text, mp3, pdf, txt, etc&#xff09;存放在某些特定文件夹下&#xff0c;方便调用。这里有两种可能性&…

emqx桥接配置+常见问题解决+jmeter压测emqx

一&#xff0c;桥接资源配置及规则配置 Emqx桥接配置流程 1&#xff0c;配置资源并测试连接通过 规则引擎——>资源——>新建——>选择MQTT Bridge——>填写参数测试连接 参数描述详见3.1资源配置 2&#xff0c;配置规则 2.1根据实际业务选择合适sql 规则引擎…

洛谷P5015 [NOIP2018 普及组] 标题统计 C语言/C++

[NOIP2018 普及组] 标题统计 题目描述 凯凯刚写了一篇美妙的作文&#xff0c;请问这篇作文的标题中有多少个字符&#xff1f; 注意&#xff1a;标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字 符数时&#xff0c;空格和换行符不计算在内。 输入格式 …

kubernates(k8s)全解

目录说明Kubernetes介绍应用部署方式演变kubernetes简介kubernetes组件kubernetes概念kubernetes集群环境搭建安装方式kubeadm二进制包集群类型安装要求最终目标准备环境环境初始化服务部署kubeadm中的命令(一般用不着)资源管理YAML语言介绍资源管理方式命令式对象管理kubectl命…