UDP checksum(UDP校验和)

UDP校验和(UDP checksum)是一种用于检测传输中的UDP数据包在传输过程中是否发生错误的机制。UDP(用户数据报协议)是一种简单的无连接的传输层协议,它用于在网络中发送数据包,但不提供数据包的传输可靠性或顺序保证。

在UDP数据包中,校验和字段用于检测数据包在传输过程中是否发生了改变,比如由于网络噪声、硬件故障或其他原因导致的数据损坏。校验和的计算方法如下:

  1. 将UDP头部和数据部分的所有16位字(2个字节)相加,如果数据长度不是偶数,会在末尾添加一个字节的填充(值为0)以确保是16位字。

  2. 如果相加的过程中出现溢出(即超过16位),则将溢出的部分加到结果的低16位上。

  3. 将最终的结果取反(按位取反)得到校验和。

在接收端,对整个UDP数据包(包括校验和字段)进行同样的计算,如果结果为全1(即0xFFFF),则认为数据包没有错误。如果计算结果不是全1,则表明数据包在传输过程中可能发生了错误,接收端通常会丢弃这个数据包。

值得注意的是,UDP校验和是可选的,在IPv4中可以将校验和字段设置为0来禁用校验和检查,但在IPv6中,UDP校验和是必须的。

让我们通过一个简单的例子来说明UDP校验和的计算方法。假设我们有一个简单的UDP数据包,它的头部和数据如下(以16位字表示):

头部:
- 源端口号:1010(十六进制)
- 目的端口号:2020(十六进制)
- 长度:0014(十六进制,表示20字节,包括头部和数据)
- 校验和:0000(十六进制,暂时假设为0,稍后计算)数据:
- 数据1:1234(十六进制)
- 数据2:5678(十六进制)
- 数据3:9ABC(十六进制)

校验和的计算过程如下:

  1. 将所有16位字相加:

    • 1010 + 2020 + 0014 + 0000 + 1234 + 5678 + 9ABC = 133AC(十六进制)
  2. 处理溢出:

    • 133AC(十六进制)= 1 + 33AC(十六进制)= 33AD(十六进制)
  3. 取反:

    • 校验和 = ~33AD(十六进制)= CC52(十六进制)

因此,计算得到的UDP校验和为CC52(十六进制)。在实际的UDP数据包中,这个校验和值会被放在头部的校验和字段中。

在接收端,接收方会对包括校验和在内的整个数据包进行相同的计算。如果结果为全1(即FFFF十六进制),则认为数据包没有错误。如果结果不是全1,则表明数据包在传输过程中可能发生了错误,接收端通常会丢弃这个数据包。

如果接收端收到的数据包没有错误,那么我们可以使用与之前相同的数据,但这次我们将使用计算出的校验和CC52(十六进制)替换校验和字段:

头部:
- 源端口号:1010(十六进制)
- 目的端口号:2020(十六进制)
- 长度:0014(十六进制,表示20字节,包括头部和数据)
- 校验和:CC52(十六进制)数据:
- 数据1:1234(十六进制)
- 数据2:5678(十六进制)
- 数据3:9ABC(十六进制)

接收端将对包括校验和在内的整个数据包进行相同的计算:

  1. 将所有16位字相加:

    • 1010 + 2020 + 0014 + CC52 + 1234 + 5678 + 9ABC = 1FFFE(十六进制)
  2. 处理溢出:

    • 1FFFE(十六进制)= 1 + FFFE(十六进制)= FFFF(十六进制)
      这一步叫做回卷加法,一直进行直到不产生溢出为止。

接收端计算的结果是全1(FFFF十六进制),这意味着数据包没有错误。因此,接收端可以接受这个数据包并继续处理数据。如果计算结果不是全1,则表明数据包在传输过程中可能发生了错误,接收端通常会丢弃这个数据包。

《计算机网络:自顶向下方法》的配套课件中,关于UDP校验和描述如上图所示。

这些PPT解释了UDP校验和的工作原理和它在错误检测方面的局限性。

第一张图展示了一个UDP校验和的简化例子。在传输过程中,发送方发送了两个数字:5和6,它们的和是11。然而,由于某种错误,接收方收到了数字4和6,其和仍然是11。接收方计算得到的校验和与发送方的不一致,因此它能够检测到错误。

第二张图讲述的是UDP校验和的目标,它是为了检测传输段中的错误(如位翻转)。发送方处理UDP段的内容(包括UDP头部和IP地址)作为16位整数数组,并对这些整数数组的内容进行加法运算得到校验和,然后将校验和的值放入UDP校验和字段中。接收方计算接收到的段的校验和,如果计算出的校验和与校验和字段中的值不相等,则检测到错误;如果相等,则认为没有检测到错误。但是,这种方法并不百分百可靠,稍后会有更多的解释。

第三张图提供了一个具体的计算例子,显示了两个16位整数相加的情况。当两个数字相加时,最高位的进位需要被回绕到结果中。在图中,两个数相加后产生了一个进位,这个进位被加回到了结果的最低位。然后,为了得到校验和,这个总和将会被取反。

第四张图揭示了UDP校验和机制的一个弱点。它展示了即使在两个数中有一位发生了变化(位翻转),这个变化可能不会影响最终的校验和。这是因为变化的两位相互抵消了。这个例子说明UDP校验和无法检测到所有的错误,尤其是当多个错误相互抵消时。这种情况显示了UDP校验和提供的错误检测保护是有限的。

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

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

相关文章

了解 .NET 运行时与 .NET 框架:基础概念与相互关系

在软件开发领域,尤其是开发跨平台应用和桌面应用时,.NET 系列技术提供了强大的支持。对于初学者或希望深入理解 .NET 技术栈的人来说,理解 .NET 运行时(.NET Runtime)和 .NET 框架(.NET Framework&#xff…

使用pycharm调试程序——完全显示张量的数值

我在使用PyCharm调试程序时,发现有些张量因为shape过大(数据量太多),导致该张量中的数值无法完全显示。下面就简单介绍怎样完全显示张量中的数值。 假设某个张量 inp_voxel 的 shape 为 torch.Size([5, 128, 128]),如…

MYSQL隔离性原理——MVCC

表的隐藏字段 表的列包含用户自定义的列和由系统自动创建的隐藏字段。我们介绍3个隐藏字段,不理解也没有关系,理解后面的undo log就懂了: DB_TRX_ID :6 byte,最近修改( 修改/插入 )事务ID,记录创建这条记…

strtok函数详解

strtok函数 strtok 函数是一个字符串分割函数,用于将字符串分割成一系列的标记。这个函数通过一组分隔符字符来确定标记的边界,每次调用都会返回字符串中的下一个标记,并且将原始字符串中的分隔符替换为空字符‘\0’,从而实际上是…

NewStar CTF 2024 misc WP

decompress 压缩包套娃,一直解到最后一层,将文件提取出来 提示给出了一个正则,按照正则爆破密码,一共五位,第四位是数字 ^([a-z]){3}\d[a-z]$ 一共就五位数,直接ARCHPR爆破,得到密码 xtr4m&…

Git介绍以及SSH配置

目录 1. Git介绍 1.1 Git的基本原理 1.2 Git的主要功能 1.3 Git的优点 1.4 Git的缺点 2. Git安装 3. SSH配置 1. Git介绍 Git是一款功能强大的分布式版本控制系统,最初由Linux操作系统的开发者Linus Torvalds在2005年开发,用于管理Linux内核的源代…

gtfToGenePred如何下载

gtfToGenePred 是 UCSC 提供的一款工具,用于将 GTF(Gene Transfer Format)文件转换为 GenePred 格式的基因注释文件。由于不同的生物信息学分析工具对基因注释文件的格式要求不同,gtfToGenePred 的主要作用就是让 GTF 文件能够兼容…

PH热榜 | 2024-11-09

DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论、搜索等功能,欢迎大家体验。 在线预览 1. Shootmail 标语:像Notion一样,可以创建漂亮邮件模板和邮件内容的工具。 介绍:想象一下…

大数据机器学习算法与计算机视觉应用03:数据流

Data Stream Streaming ModelExample Streaming QuestionsHeavy HittersAlgorithm 1: For Majority elementMisra Gries AlgorithmApplicationsApproximation of count Streaming Model 数据流模型 数据流就是所有的数据先后到达,而不是同时存储在内存之中。在现…

嵌入式学习第21天Linux基础

目录 第1章 Linux 系统介绍 1.1 Unix 操作系统(了解) 1.2 Linux 操作系统(了解) 1.3 Linux 操作系统的主要特性(重点) 1.4 Linux 与 Unix 的区别与联系 1.5 GUN 与 GPL(了解) …

【数学二】线性代数-线性方程组-齐次线性方程组、非齐次线性方程组

考试要求 1、会用克拉默法则. 2、理解齐次线性方程组有非零解的充分必要条件及非齐次线性方程组有解的充分必要条件. 3、理解齐次线性方程组的基础解系及通解的概念,掌握齐次线性方程组基础解系和通解的求法. 4、理解非齐次线性方程组的解的结构及通解的概念. 5、会用初等行变…

【小程序安全】小程序反编译

❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 0x01 前期准备 知识点准备-小程序结构 1.主体结构 小程序包含一个描述整体程序的 app 和多个描述各自页…

Vue 状态管理工具vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式和库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 解决了多个组件共享状态时,状态的可维护性和可预测性问题。 Vuex 的核心概念 State&…

C++ : STL容器(适配器)之stack、queue剖析

STL容器适配器之stack、queue剖析 一、stack、queue的接口(一)stack 接口说明(二)queue 接口说明 二、stack、queue的模拟实现(一)stack、queue是容器适配器stack、queue底层默认容器--deque1、deque概念及…

React官网生成Recat项目的区别

1. Next.js 特点: 页面级路由:使用文件系统路由,基于 /pages 文件夹的结构自动创建 URL 路径。渲染模式:支持三种渲染模式:静态生成 (SSG)、服务器端渲染 (SSR) 和客户端渲染 (CSR),并允许根据页面的具体需…

Kubernetes的基本构建块和最小可调度单元pod-0

文章目录 一,什么是pod1.1pod在k8s中使用方法(1)使用方法一(2)使用方法二 1.2pod中容器的进程1.3pod的网络隔离管理(1)pause容器的作用 1.4 Pod分类:(1)自主式…

【CUDA】认识CUDA

目录 一、CUDA编程 二、第一个CUDA程序 三、CUDA关键字 四、device管理 4.1 初始化 4.2 Runtime API查询GPU信息 4.3 决定最佳GPU CUDA C 编程指南CUDA C在线文档:CUDA C 编程指南 CUDA是并行计算的平台和类C编程模型,能很容易的实现并行算法。只…

AtomicInteger 和 AtomicIntegerFieldUpdater的区别

AtomicInteger 和 AtomicIntegerFieldUpdater 都是 Java 并发库中用于处理原子操作的类。 1. AtomicInteger 定义: AtomicInteger 是一个原子类,它封装了一个 int 值,并提供了对该值进行原子操作的方法。使用场景: 适用于需要对单个整数值进行原子操作…

知识中台如何在精简供应链管理中发挥作用?

您如何与供应商沟通并分享您的最佳实践?您如何确保供应商了解您的基准?如果您正在为这些问题烦恼,请不要担心,本文章将为您提供宝贵的见解。 构建具备弹性的供应链模型,其关键在于知识中台的数据质量。若缺乏数据支撑…

Python 在PDF中绘制形状(线条、矩形、椭圆形等)

在PDF中绘制图形可以增强文档的视觉效果。通过添加不同类型的形状,如实线、虚线、矩形、圆形等,可以使文档更加生动有趣,提高读者的阅读兴趣。这对于制作报告、演示文稿或是教材特别有用。本文将通过以下几个示例介绍如何使用Python 在PDF中绘…