【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制(CRC算法、MD5算法)

目录

UDP协议

UDP协议的报文结构及注意事项

UDP报文结构中的校验和字段

1. 校验和主要校验的内容

2. UDP校验和的实现方式

3. CRC(循环冗余校验)算法

4. MD5(Message Digest Algorithm 5)


UDP协议

上一篇文章提过UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠传输、面向数据报、全双工的传输层协议,用于在网络上发送数据。

UDP的各个特点已经介绍过了,接下来,基于UDP协议的报文结构,了解该协议的各个特性。

UDP协议的报文结构及注意事项

UDP 报文结构指的就是 UDP 数据报的结构。

UDP数据报 =  报头(重点) + 载荷(实际要传输的数据部分),如下图:

由于UDP的一个数据报的最大长度就是64KB,而64KB在当今的互联网环境下,是一个非常小的数字。

注意事项  如果我们需要传输的 UDP数据报 超过64KB,有以下解决方案:

  1. 将数据分割成多个 UDP数据报 进行发送传输,并在接收端进行重新组装。这种方式称为数据分段(Data Segmentation)或数据分片(Data Fragmentation)。
  2. 考虑使用其他的传输层协议,如 TCP 协议。如果需要传输大量数据或者超过 UDP 最大报文长度的数据,TCP 是更好的选择,这里暂时不详细展开。

UDP报文结构中的校验和字段

校验和,顾名思义,用于验证数据在传输过程中是否传输正确(是否发生了错误或损坏)

或者说,用于数据完整性检查,以确保数据在传输过程中没有被篡改或损坏。

1. 校验和主要校验的内容

  1. 数据内容: 校验和对数据报中的每个比特位进行求和计算,以确保数据内容在传输过程中没有被篡改或损坏。

  2. 传输过程中的错误: 校验和可以检测到数据在传输过程中是否发生了错误,例如比特翻转或数据丢失。

  3. 数据包的完整性: 通过与发送端发送的校验和进行比较,接收端可以验证数据包在传输过程中是否保持完整,即数据在发送端和接收端之间没有发生改变。

如果发现数据损坏或者被篡改,就丢弃这个数据。

2. UDP校验和的实现方式

UDP校验和使用的是一种简单的错误检测机制,它的实现方式如下:

  1. 计算校验和: 发送端在发送UDP数据包之前,会对UDP数据报文的内容进行校验和的计算。计算过程通常包括以下步骤:

    • 将UDP数据报文划分为以16比特为单位的字(对于字节不足16比特的部分,可以补零)。
    • 将这些16比特字相加,得到一个32比特的中间结果。
    • 如果中间结果的高16比特不为0,则将其与低16比特相加,直到高16比特为0为止。
    • 最终的校验和就是将最后的结果按位取反得到的值。
  2. 校验和字段: 发送端将计算得到的校验和值放置在UDP数据报的校验和字段中。

  3. 接收端验证: 接收端在接收到UDP数据包后,会进行校验和的验证。验证的步骤与计算过程类似:

    • 接收端同样将UDP数据报文划分为16比特的字,并对其进行求和计算。
    • 接收端将计算得到的校验和与UDP数据包中的校验和字段进行比较。
    • 如果两者相等,则认为数据包未损坏;如果不相等,则认为数据包可能已经损坏。

这里使用一个生活场景帮助理解上述实现过程:

当你寄送一封信件给朋友时,你可能会希望确保信件在邮递过程中没有损坏或篡改。你可以在信封上添加一个简单的校验和来实现这一点。

  1. 想象你写了一封信给朋友,然后把它放进信封里。在你封上信封之前,你可以将信中每个字母的ASCII码值相加,然后取结果的模256(即求和结果除以256的余数),并将这个余数写在信封的背面。这个余数就是你的“校验和”。
  2. 当你的朋友收到这封信时,他可以打开信封并读取信的内容。然后,他也可以将信中每个字母的ASCII码值相加,然后取结果的模256。如果这个计算得到的余数与信封背面的校验和相同,那么他可以合理地假设信件在邮递过程中没有被篡改或损坏。
  3. 这个例子简化了UDP校验和的概念,帮助理解UDP校验和的基本原理:在发送数据之前计算一个简单的校验值,并在接收数据时验证这个校验值,以确保数据的完整性和准确性。

需要注意的是,UDP校验和并不提供数据的可靠性传输,它只能检测到一部分错误,并不能保证数据的完整性或可靠性。

  • 就拿寄信的例子来解释,假设接收端接收到的信中的内容出现变化,如其中一个a->b,另一个b->a,但此时每个字母的ASCII码值相加再取模,得到的校验和仍然是相同的。
  • 同理,UDP校验和仅仅对UDP数据报中的数据进行简单的加法和取反操作来计算校验和值。因此,接收内容不同但计算出的校验和值是相同的情况仍然是会出现的。

综上,UDP校验和虽然可以帮助检测部分错误,但它并不足以确保数据的完整性和可靠性。因此,在需要可靠传输的场景下,通常会选择使用TCP等其他协议。

除此之外,要想提高UDP的数据的完整性检查,还可以让UDP结合一些其他错误检测和纠正的机制进行校验,如CRC(循环冗余校验)算法、MD5算法、SHA-3算法、SHA-256算法等。这里简单介绍一下CRC算法和MD5算法。

3. CRC(循环冗余校验)算法

在某些情况下,为了检测数据传输过程中是否出现错误或数据损坏,可以使用CRC算法来生成校验码,并将其附加到UDP数据报中一起传输。具体如下:

  1. 发送端在发送UDP数据报之前,可以对数据进行CRC校验,生成校验码并将其添加到UDP数据报的尾部。
  2. 接收端在接收到UDP数据报后,可以执行相同的CRC算法来计算接收到的数据的校验码,并将其与接收到的校验码进行比较。
  3. 如果两者一致,则说明数据在传输过程中没有出现错误;如果不一致,则说明数据可能已经损坏或被篡改。

可以看到,此处我们也就是将UDP原有的校验码生成方式改为了使用CRC(循环冗余校验)的方式来生成校验码。具体CRC的工作原理,建议寻找其他资料进行了解。

4. MD5(Message Digest Algorithm 5)

首先,先重点认识一下MD5的特点:

  1. 固定长度输出: MD5生成的哈希值是固定长度的,为128位(16字节),无论输入消息的长度如何。

  2. 雪崩效应: 即使输入消息的微小改变也会导致输出哈希值发生巨大变化,这种性质被称为雪崩效应,增加了数据的安全性和完整性。

  3. 不可逆性: MD5是单向哈希函数,意味着从哈希值反推原始消息是困难的,几乎不可能通过哈希值还原出原始消息。

在某些情况下,MD5可以与UDP一起使用以提高数据的完整性检查。例如,在某些应用中,可以在UDP数据报中包含MD5哈希值作为校验字段,以便在接收端验证数据的完整性。这样,接收方可以计算接收到的数据的MD5哈希值,并将其与发送端附加在UDP数据报中的MD5哈希值进行比较,以确保数据在传输过程中没有被篡改或损坏。

我们随便使用一个搜索引擎,搜索MD5,就会有对应的MD5在线工具。

输入需要加密的内容,就可以得到MD5加密后的结果,这里中间有选项:32位大小写、16位大小写,这里的32位指的是32个字符,因为十六进制的形式表示一个字节需要两个字符。如果以二进制形式表示,则只需要16个字符。

MD5理论上是不可逆的,而这里的在线解密,本质上都是通过“打表”的方式来完成,也就是我们调侃的面向结果编程。在线解密工具的服务器通过保存各种见过的字符串的MD5值到数据库中,当我们输入MD5值,就去数据库查,达成这种“解密”的效果。

这种方式一般也只能破解出一些常见的字符串的MD5的值。https://www.somd5.com/ 这就是一个MD5在线解密的网站,我们观察一下面对常见字符串和较复杂字符串,它是否能成功解密。

解密 hello :

解密复杂字符串(今天天气不错):

可以看到,只要稍微复杂点的字符串,这里的在线解密工具就无法解密了。

要注意的是,尽管MD5曾经被广泛使用于数据完整性验证、密码存储等领域,但由于其存在安全性漏洞和易受到碰撞攻击的特性,现在已经不再被推荐或使用在安全性要求较高的场景中。 

MD5的安全性漏洞包括碰撞攻击(Collision Attack)和预影响攻击(Preimage Attack),这些攻击方式使得黑客能够生成具有相同MD5哈希值的不同输入,从而破坏了MD5的数据完整性验证功能。

因此,在现代应用中,更安全的哈希算法如SHA-256、SHA-3等已经取代了MD5的位置。这些算法具有更高的安全性和抗碰撞能力,被广泛用于密码存储、数字签名、消息认证等安全领域。所以,尽管MD5仍然存在,并且有些旧系统可能仍在使用它,但在新的安全应用中,推荐使用更强大和更安全的哈希算法。

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

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

相关文章

Linux cmake 初窥【1】

1.开发背景 linux 下编译程序需要用到对应的 Makefile,用于编译应用程序,但是 Makefile 的语法过于繁杂,甚至有些反人类,所以这里引用了cmake,cmake 其中一个主要功能就是用于生成 Makefile,cmake 的语法更…

吴恩达深度学习 (week5,6)

文章目录 一、训练开发测试集二、机器学习基础三、 正则化初步介绍四、Dropout 正则化五、其他正则化方法六、归一化输入介绍七、梯度消失与梯度爆炸八、神经网络的权重初始化九、梯度数值逼近和检验十、上述学习总结第一题 划分训练/开发/测试集第二题 开发和测试集分布第三题…

谷粒商城学习笔记

1.系统架构 2.环境准备 21.安装Linux 1.VirtualBox: https://download.virtualbox.org/virtualbox/6.0.10/VirtualBox-6.0.10-132072-Win.exe 2.安装 Vagrant 1).Vagrant 下载地址: https://releases.hashicorp.com/vagrant/2.2.5/vagrant_2.2.5_x86_64.msi https://www…

Obsidian 快速安装

看网上Obsidian 很好用,但自己下载总是中断,烦的要死,一度以为要开魔法…… 直到我找到了这个网站Thoughts (teambition.com) yeah~ 亲测有效,大概不到2min吧. 快速开始~,成功水了一片

海外服务器被恶意攻击怎么办

如果您的海外服务器遭受了恶意攻击,以下是一些应对措施和步骤,立即隔离服务器。如果您察觉到服务器受到恶意攻击,立即隔离服务器,将其与网络隔离,以防止攻机进一步扩散。通知服务器提供商,以便他们能够提供…

大小写不规范引起的LVS问题

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 往期文章链接: LVS常见问题解析 综合网表不规范,大小写混用常导致LVS问题,比如两个端口clk和CLK只有大小写区别,PR工具是可以识别为两个端口的,只不过Calibre LVS默认不区分大小写,会报错。 …

第二部分-Foundation基础-学习导航

专题地址:MacOS一站式程序开发系列专题 第一部分:基础入门-学习导航 ObjectiveC-第一部分-基础入门-学习导航 第二部分:Foundation基础学习导航 Foundation框架-13-数据对象:主要讲述NSRange, NSString, NSValue, NSNull, NSD…

从旺店通·企业奇门到用友BIP通过接口配置打通数据

从旺店通企业奇门到用友BIP通过接口配置打通数据 接入系统:旺店通企业奇门 旺店通是北京掌上先机网络科技有限公司旗下品牌,国内的零售云服务提供商,基于云计算SaaS服务模式,以体系化解决方案,助力零售企业数字化智能化…

CLAHE算法上新

加入我们的FPGA实现CLAHE算法课程,探索图像增强的前沿技术! [课程名称]: FPGA实现对比度受限自适应直方图均衡化(CLAHE)算法 [授课方式]: 录播课程 互动讨论 实践操作 在线答疑 课程简介: 在…

Vue2之组件通信(爆肝)

大家有什么想看的可以在评论区留言,我尽量满足,感谢大家! 组件通信是vue中一个非常重要的内容,我们需要掌握好组件通信,那么让我为大家介绍几种组件通信的方式吧! 一、props 这是父传子的方式&#xff0…

贪吃蛇代码实现

一.基本信息 实现目标:使用C语言在Windows环境的控制台中实现贪吃蛇游戏 游戏运行: 地图绘制基本玩法提示信息游戏的开始与结束 基本玩法: 通过上下左右键控制蛇的移动蛇可以加速减速吃掉食物可以得分并增加蛇的长度可以自动暂停 游戏结…

Macs Fan Control Pro for Mac:全面优化Mac风扇控制软件

Macs Fan Control Pro for Mac是一款专为苹果电脑用户设计的风扇控制软件,旨在通过精确的风扇速度调节,全面优化Mac的散热性能,确保系统始终运行在最佳状态。 Macs Fan Control Pro for Mac中文版下载 该软件具备实时监控功能,能够…

HarmonyOS ArkUI实战开发-NAPI异步编程

笔者在前 5 小节里讲述了在 OpenHarmony 上通过 NAPI 的方式实现了 JS 调用 C的能力,但是这些实现都是同步的,本节笔者简单介绍一下 NAPI 的异步实现。 约定编程规范 ArkUI 开发框架对外提供的 API 命名是需遵守一定规范的,以 ohos.display…

初学python记录:力扣39. 组合总和

题目: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限…

【STM32】嵌入式实验二 GPIO 实验:数码管

实验内容: 编写程序,在数码管上显示自己的学号。 数码管相关电路: PA7对应的应该是段码,上面的图写错了。 注意:选中数码管是低电平选中;并且用74HC595模块驱动输出的段码, 这个模块的学习可以…

echarts折线图默认不显示数据圆点,鼠标划上之后折线图才显示圆点

只需要设置showSymbol为false就可以了,表示只在 tooltip hover 的时候显示。 代码如下: option {tooltip: {trigger: axis},xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun]},yAxis: {type: value},series: [{data: [150, 230, 224…

【智能算法】寄生捕食算法(PPA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2020年,AAA Mohamed等人受到自然界乌鸦-布谷鸟-猫寄生系统启发,提出了寄生捕食算法(Parasitism – Predation Algorithm, PPA)。 2.算法原理 2.1算法…

HTML使用jQuery实现两个点击按钮,分别控制改文本字体颜色和字体大小

jQuery 简介 jQuery 是一个广泛使用的 JavaScript 库&#xff0c;旨在简化对 HTML 文档的操作、事件处理、动画效果和 AJAX 等操作。 案例源码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name&q…

【C++】学习笔记——类和对象_4

文章目录 二、类和对象13.运算符重载赋值运算符重载 14. 日期类的实现Date.h头文件Date.cpp源文件test.cpp源文件 未完待续 二、类和对象 13.运算符重载 赋值运算符重载 我们之前学了一个拷贝构造函数&#xff0c;本质上就是创建一个对象&#xff0c;该对象初始化为一个已经…

go-cqhttp 机器人使用教程

API | go-cqhttp 帮助中心 参考 | go-cqhttp 帮助中心 机器人下载 发送消息 http://127.0.0.1:5700/send_msg?message_typeprivate&user_id911412667&message你好呀 检查端口是否打开 netstat -ano | findstr :5701 发送的请求 软件的dopost的解析 Overridepro…