当前位置: 首页 > news >正文

UDP校验和计算及网络中的校验和机制

UDP (User Datagram Protocol) 是一种无连接的传输层协议,它不像 TCP 那样提供可靠的传输保证。虽然 UDP 不保证数据可靠性,但它仍然提供了一个可选的校验和机制来检测数据在传输过程中出现的错误。 理解UDP校验和的计算过程和其在网络中的作用至关重要。

1. UDP校验和计算

UDP校验和是一个16位的校验和,用于检测数据在传输过程中出现的比特错误。它的计算过程如下:

步骤1:形成校验和计算的伪首部: UDP校验和的计算并非仅仅基于UDP数据报本身,而是包含一个“伪首部”(pseudo-header)。这个伪首部包含了IP首部中的部分信息,用于在IP层进行端到端的校验和计算。伪首部包含以下字段:

源IP地址 (32位)
目的IP地址 (32位)
协议号 (8位,对于UDP是17)
UDP数据报长度 (16位)
步骤2:将伪首部和UDP数据报连接起来: 将步骤1中生成的伪首部和UDP数据报(包括UDP首部和数据)连接成一个连续的比特流。

步骤3:进行一元二进制补码求和: 将连接后的比特流分成16位字,并进行逐字相加。注意,这里使用的是一元二进制补码加法,这意味着如果加法结果超过16位,需要将进位加到低16位上。 这个过程一直进行到只剩下一个16位的字。

步骤4:取反: 将步骤3的结果进行按位取反(一元补码),得到最终的UDP校验和。

公式表示:

假设:
IP_src: 源IP地址 (32位)
IP_dst: 目的IP地址 (32位)
protocol: 协议号 (8位,UDP为17)
UDP_len: UDP数据报长度 (16位)
UDP_header: UDP报头 (8位)
UDP_data: UDP数据部分
则校验和计算过程可以表示为:
在这里插入图片描述
其中:

word_i 表示伪首部和UDP数据报连接后形成的16位字序列。
N 是16位字的个数.
Σ 表示一元二进制补码加法。
~ 表示按位取反。

示例 (简化):

假设伪首部和UDP数据报连接后形成的16位字序列为:1000, 2000, 3000.

1.相加:1000 + 2000 + 3000 = 6000 (十进制) = 1011101101100 (二进制) 注意这里没有考虑进位,只是为了简化说明。真正的计算需要考虑进位。
2.如果需要考虑进位,则 6000 (十进制) 会被分解成多个16位字并相加,直到得到一个16位数。
3。假设最终得到的结果是 0xABCD (十进制 43981)
4.取反:~0xABCD = 0x5432 (十进制 21538)

2. 计算机网络中校验和的作用:

校验和在计算机网络中起着至关重要的作用,它是一种简单的错误检测机制,能够有效地检测数据传输过程中的比特错误。 虽然不能保证检测出所有错误(例如,某些特定类型的错误可能不会改变校验和),但它可以显著降低数据传输错误的概率。

提高数据可靠性: 虽然UDP本身不保证可靠性,但校验和可以帮助接收端检测到数据在传输过程中出现的错误,从而提高数据传输的可靠性。如果接收端计算出的校验和与发送端计算出的校验和不一致,则表明数据在传输过程中发生了错误。

减少重传: 在UDP应用中,虽然没有重传机制,但如果应用层需要可靠性,则可以根据校验和结果自行设计重传机制。校验和能够帮助减少不必要的重传,提高效率。

简单的错误检测: 校验和的计算和验证相对简单,计算开销较小,适合在UDP这种轻量级的协议中使用。

3. 其他网络中的校验和:

校验和机制并非UDP独有,在其他网络协议中也广泛使用,例如:

IP校验和: IP首部也包含一个校验和字段,用于检测IP首部本身的错误。
TCP校验和: TCP也使用校验和来检测数据报的完整性。TCP校验和的计算过程与UDP类似,但伪首部和数据内容有所不同。
总结:

UDP校验和是一种简单的错误检测机制,它通过计算一个16位的校验和来检测数据传输过程中出现的错误。虽然不能保证检测所有错误,但它可以显著提高UDP数据传输的可靠性,并降低不必要的重传,在许多网络应用中发挥着重要作用。 理解校验和的计算过程和其在网络中的作用,对于理解网络协议和设计可靠的网络应用至关重要。

相关文章:

  • PFC和LLC的本质和为什么要用PFC和LLC电路原因
  • 【迁移学习入门之域适应的背景、理论与方法】进一步理解迁移学习啦?
  • Mybatis 9种动态 sql 标签使用
  • Python知识点:使用Azure IoT Edge与Python进行边缘计算
  • 一文掌握Harbor镜像同步公有云镜像仓库实践
  • 从自动化到智能化:AI如何推动业务流程自动化
  • 五.海量数据实时分析-FlinkCDC+DorisConnector实现数据的全量增量同步
  • 成功使用DDNS动态域名访问我的群晖NAS(TP-link路由器)
  • 【鸿蒙学习】深入了解UIAbility组件
  • 关系型数据库和非关系型数据库的区别
  • JavaScript 反射(Reflect)和代理(Proxy)简单介绍
  • OLED移植
  • expressjs 中的mysql.createConnection,execute 怎么使用
  • MacOS配置python环境
  • Linux安装RabbitMQ安装
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Date型的使用
  • download使用浅析
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • IDEA 插件开发入门教程
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JS基础之数据类型、对象、原型、原型链、继承
  • Just for fun——迅速写完快速排序
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Map集合、散列表、红黑树介绍
  • Sass Day-01
  • Spring Cloud中负载均衡器概览
  • 前端之React实战:创建跨平台的项目架构
  • 容器服务kubernetes弹性伸缩高级用法
  • 收藏好这篇,别再只说“数据劫持”了
  • 树莓派 - 使用须知
  • 思维导图—你不知道的JavaScript中卷
  • 写代码的正确姿势
  • 由插件封装引出的一丢丢思考
  • 最近的计划
  • ​​乐​​牛一​面​​​游​​卡​​一​二​​​​面​
  • ​2020 年大前端技术趋势解读
  • ​如何使用QGIS制作三维建筑
  • # 安徽锐锋科技IDMS系统简介
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #java学习笔记(面向对象)----(未完结)
  • #QT项目实战(天气预报)
  • #考研#计算机文化知识1(局域网及网络互联)
  • (day6) 319. 灯泡开关
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (附源码)计算机毕业设计高校学生选课系统
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)C#调用WebService 基础
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • *2 echo、printf、mkdir命令的应用
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...