网络原理(六): UDP 协议

目录

1. UDP 协议

1.1 协议特点

1.2 协议报文格式

1.2.1 UDP 长度 

1.2.2 校验和


1. UDP 协议

在进行网络编程时, 我们已经对 UDP 协议进行了简单了解. 并且应用层的很多操作, 需要调用传输层的提供的接口, 基于 socket api 来进行完成的.

1.1 协议特点

UDP 协议具有以下特点:

  1. 面向数据报
  2. 不可靠传输
  3. 全双工
  4. 无连接

在进行网络编程使用 UDP socket api 进行数据传输时, 我们就对其中的一些特点有了一些感受:

面向数据报体现于: 每发送(send)或接收(receive)一次消息, 都是一个完整的 udp 报文.

全双工体现在: 不论是客户端还是服务器, 都可以进行 send 和 receive 操作.

无连接体现在: UDP 报文直接发送, 对端就可以接收, 并没有像 TCP 那样 accept 的过程.

不可靠传输, 是指消息发出后, 就不管了(不管数据是否成功发送到对端). 这一点并没有在编程时具体体现, 接下来我们通过 udp 协议的报文格式来了解这一特点.

1.2 协议报文格式

UDP 数据报由两个部分组成:

  1. UDP 报头
  2. 载荷(完整的应用层数据包)

其中, 载荷就是完整的应用层数据报.

报头, 大小为 64 个 bit 位, 8 个字节, 由以下四个部分组成:

  1. 源端口号
  2. 目的端口号
  3. 报文长度
  4. 校验和

其中, 每个部分都占了 2 个字节.

至于源端口号和目的端口号的作用, 这里就不再赘述了, 主要聊一聊其中的 报文长度 和 检验和.

1.2.1 UDP 长度 

UDP 报文格式中的长度这一部分, 表示的是整个 UDP 数据报的长度, 即报头 + 载荷的长度. 

由于大小为 2 字节, 也就是 16 个 bit 位, 所以 UDP 数据包长度的范围为 0~2^16-1, 也就是 0~65535, 所以一个 UDP 数据报最大只能为 65535 个字节, 也就是 64kb.

由于报头部分的大小是固定的, 8 字节, 这相对于 64kb(65535 字节) 来说是可以忽略不计的.

所以, 当我们面试表述 UDP 报文大小的上限时, 既可以说 64kb 是整个 UDP 数据包的上限, 也可以说是 UDP 携带的载荷的上限.

 64 kb, 在设计 UDP 的那个年代, 确实是一个充裕的大小, 但是放到 2024 年的今天, 就是一个非常小的数字了, 随随便便一张照片就可能是几个 MB.

所以要发送数据的大小超出 UDP 数据包可以承载的大小的情况是经常发生的, 而当发送的大小一旦超过了 64kb, UDP 数据包就会被直接截断, 对方拿到的数据就会出错, 那么如何解决这个问题呢?? 有两个方案可以选择:

  1. 方案一: 在应用层代码上进行拆包操作, 把一个大的应用层数据报拆成很多小的数据包, 再使用多个 UDP 数据包进行传输.
  2. 方案二: 使用 TCP 协议, 使用 TCP 数据包进行传输(TCP 没有长度的限制).

方案一, 是一个工作量比较大的方法, 需要对代码进行大量的修改, 写大量的逻辑来实现分包组包的工作, 并且一不小心可能就写出了隐藏 bug, 效率太低.

所以, 在工作中, 我们会优先选择简单且不易出错的方案来解决问题, 即采用方案二, 使用 TCP 来解决 UDP 数据包大小限制的问题.

可能大家心中有一个疑问: 为啥不直接修改 UDP 的报文格式, 直接把 UDP 本身改的大一点呢??

其实, 要修改 UDP 很容易, 但是难就难在, UDP 已经内置在各种的操作系统中, 一旦发生变动, 就会造成很大的影响, 比如通信双方, 一方进行了修改, 另一方没有进行修改, 那么 UDP 数据包就会传输失败, 导致不能使用 UDP 进行通信. 并且, 修改也会牵扯到系统兼容性的问题, 所以, 通信双方谁先改, 谁可能就会出现问题.

所以 UDP 可以说是积重难返了, 目前也只能这样子~~

1.2.2 校验和

UDP 报文中的校验和, 作用是为了验证传输的数据是否发生修改.

注意, 这里的校验和与 HTTPS 中数字签名的校验和不同, HTTPS 数字签名的校验和是为了反正数据被黑客篡改(防人), 但是这里 UDP 的校验和, 与安全性无关, 而是防止传输过程中出现"比特翻转".

比特翻转, 就是在传输的过程中, 由于外界的影响, 导致数据中的某些 bit 位0变1, 1变0.
(数据都是以光电信号或者电磁波的形式进行传输的, 很容易收到外界的干扰)

验证的过程如下:

  1. 发送之前, 会把整个数据报中的数据代入, 计算得出一个校验和, 并将数据和校验和一同发给对端.
  2. 对端收到数据后, 根据收到的数据, 再次计算校验和, 将两个校验和进行对比, 如果校验和不一致, 说明有数据发生了比特翻转, 直接丢弃.

这里 UDP 采用的 CRC(循环冗余校验) 的方式来计算校验和:

  • CRC: 把 UDP 报文中的每个字节(除了校验和位置外), 都当做整数, 进行累加, 即使溢出也没关系, 继续加, 最终得到的数据就是 CRC 校验和.

所以, 如果在传输过程中, 有 bit 位发生了翻转, 那么两次计算得到的校验和也会不同.

我们可以认为, 如果两个数据是相同的数据, 那么计算得到的校验和一定是相同的.

但是, 当两次计算的校验和相同时, 两个数据不一定是相同的.

因为, 这其中可能存在变数, 例如: CRC 是累加的方式计算的校验和, 如果第一个字节发生的翻转, 使得值变小了, 而第二个字节发生的偏转又使值变大了, 而恰恰这两次偏转各自的差值又相互抵消, 那得到的校验和依然是相同的.

虽然, 可能出现上述情况, 但是这种情况发生的概率是非常小的(发生翻转的概率本来就小, 再加上两次偏转的影响又相互抵消, 概率就小之又小了), 所以在实际开发中, 我们可以忽略这种情况的存在.

综上, 我们可以通过 UDP 报文中的校验和这一部分, 来确定数据在传输时, 是否发生了修改~ 


END

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

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

相关文章

前端页面展示本电脑的摄像头,并使用js获取摄像头列表

可以通过 JavaScript 使用 navigator.mediaDevices.enumerateDevices() 获取电脑上的摄像头列表。以下是一个示例代码&#xff0c;可以展示摄像头列表并选择进行预览。 HTML JavaScript 实现摄像头列表展示和预览 <!DOCTYPE html> <html lang"zh-CN">…

【漫话机器学习系列】028.CP

Mallows’ Cp&#xff1a;标准化公式解析与应用 Mallows’ Cp 是一种常用的模型选择工具&#xff0c;用于在一系列候选模型中权衡拟合度和复杂性&#xff0c;帮助我们选择性能最优的模型。本文将基于其标准化公式展开详细解析&#xff0c;并探讨其应用场景、实现方法、优点与局…

Visual Studio 中增加的AI功能

前言&#xff1a; 人工智能的发展&#xff0c;在现在&#xff0c;编程技术的IDE里面也融合了AI的基本操做。本例&#xff0c;以微软的Visual Studio中的人工智能的功能介绍例子。 本例的环境&#xff1a; Visual Studio 17.12 1 AI 智能变量检测&#xff1a; 上图展示了一…

江科大学习笔记之——HAL库点亮一个LED灯

HAL三步走&#xff1a;1.建工程。2.设配置。3.写代码 一.建立工程 HAL库写法 点击FinIsh 2.配置时钟 2 、设置配置参数 把模块.C.h单独设置文件 生产代码 三写代码 控制GPIO就三步 1.RCC时钟使能 2.结构体配置GPIO寄存器 3.控制GPIO值 上面的步骤已经把前两步的配置完成了接下…

Spring MVC (下)小项目实战

1. 加法计算器 需求分析: 客户端输入俩个数,服务端进行相加然后返回结果. 约定前后端交互接口: 接口的概念: 接口⼜叫API&#xff08;ApplicationProgrammingInterface),我们⼀般讲到 接口或者API&#xff0c;指的都是同⼀个东西.是指应⽤程序对外提供的服务的描述,⽤于交换信…

【OpenGL ES】GLSL基础语法

1 前言 本文将介绍 GLSL 中数据类型、数组、结构体、宏、运算符、向量运算、矩阵运算、函数、流程控制、精度限定符、变量限定符&#xff08;in、out、inout&#xff09;、函数参数限定符等内容&#xff0c;另外提供了一个 include 工具&#xff0c;方便多文件管理 glsl 代码&a…

RPA系列-uipath 学习笔记4

使用Uipath 处理hover的问题 备注&#xff1a;使用uipath stversion&#xff1a;2024.10.6,所有学习来源自uipath Academy 首先&#xff0c;打开uipath给我们提供的一个网站 ACME,这个网站呢&#xff0c;需要提前注册一下的哈。 今天呢&#xff0c;就是记录一下&#xff0c;怎…

Linux:进程概念

1.冯诺依曼体系结构 结论&#xff1a; --- CPU不和外设直接打交道&#xff0c;和内存直接打交道。 --- 所有的外设&#xff0c;有数据需要收入&#xff0c;只能载入到内存中&#xff1b;内存写出&#xff0c;也一定是写道外设中。 --- 为什么程序要运行必须加载到内存&#xf…

活动预告 | Microsoft Azure 在线技术公开课:使用 Azure OpenAI 服务构建生成式应用

课程介绍 通过 Microsoft Learn 免费参加 Microsoft Azure 在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft Cloud 技术的了解。参加我们举办的“使用 Azure OpenAI 服务构建生成式应用”活动&#xff0c;了解如何使用包括 GPT 在内的强大的…

Flutter:打包apk,详细图文介绍

困扰了一天&#xff0c;终于能正常打包apk安装了&#xff0c;记录下打包的流程。建议参考我这篇文章时&#xff0c;同时看下官网的构建说明。 官网构建并发布 Android 应用详情 1、AS创建Flutter项目 2、cmd执行命令 生成一个sunluyi.jks的文件&#xff0c;可以自行把sunluyi替…

【服务器学习专栏 1.2 -- 带外管理】

请阅读 嵌入式学习必备专栏 文章目录 Overview服务器带外管理BMC 介绍BMC 特点BMC 工作原理 Overview 从技术的角度&#xff0c;网络管理可分为带外管理&#xff08;out-of-band&#xff09;和带内管理&#xff08;in-band&#xff09;两种管理模式。 带内管理&#xff0c;是指…

南京市建邺区南苑街道一行莅临园区考察交流

2024年8月28日&#xff0c;南京市建邺区南苑街道办事处副主任董兵、南苑街道发展服务办公室一级主任科员王洪政、建邺区国资集团科创公司经理杲畅&#xff0c;在树莓集团华东区负责人田林和陈强经理的陪同下&#xff0c;莅临集团总部-国际数字影像产业园考察交流。 树莓科技&am…

docker中使用nginx

宿主机和docker中nginx做映射 宿主机中nginx 映射目录 /root/myDockerData/devnginx 在容器中相关位置分别是&#xff1a; 配置文件位置&#xff1a;/etc/nginx/ 日志位置&#xff1a;/var/log/nginx/ 项目位置&#xff1a;/usr/share/nginx/html 如下配置启动命令行&#x…

Casino Royale靶场wp

0x00 下载安装 https://download.vulnhub.com/casinoroyale/CasinoRoyale.ova 导入vmware启动 0x01 主机信息收集 0x02目录扫描 index.php 获取到一个域名 修改本地hosts 添加一行 路径&#xff1a;C:\Windows\System32\drivers\etc 192.168.2.20 casino-royale.local 点击…

智能家居体验大变革 博联 AI 方案让智能不再繁琐

1. 全球AI技术发展背景及智能家居市场趋势 人工智能&#xff08;AI&#xff09;技术的飞速发展正在推动全球各行业的数字化转型。国际电信联盟与德勤联合发布《人工智能向善影响》报告指出&#xff0c;全球94%的商界领袖认为&#xff0c;人工智能技术对于其企业在未来5年内的发…

鸿蒙开发(27)案例今日任务

案例为纯前端实现&#xff0c;总结案例。 主页面代码 import { TaskStatisties } from ../view/TaskStatisties import { TaskItem } from ../view/TaskItem import CreateTaskModel, {TaskModel} from ../viewmodel/TaskModel import { router } from kit.ArkUI// xxx.ets En…

WPF编程excel表格操作

WPF编程excel表格操作 摘要NPOI安装封装代码测试代码 摘要 Excel操作几种方式 使用开源库NPOI(常用&#xff0c;操作丰富)使用Microsoft.Office.Interop.Excel COM组件(兼容性问题)使用OpenXml(效率高)使用OleDb(过时) NPOI安装 封装代码 using System; using System.IO; u…

音视频采集推流时间戳记录方案

音视频同步更多文章 深入理解音视频pts&#xff0c;dts&#xff0c;time_base以及时间数学公式_视频pts计算-CSDN博客 ffplay音视频同步分析_ffplay 音视频同步-CSDN博客 音视频采集打时间戳设计 实时音视频数据的采集和处理场景。具体来说: 采集阶段: 在音视频数据采集过…

专业140+总分410+南京大学851信号与系统考研经验南大电子信息通信集成电路,真题,大纲。参考书。

本人本科中等211&#xff0c;离保送本校差一点&#xff0c;考研前纠结本校还是追求更高目标&#xff0c;和家人聊了自己的想法&#xff0c;感谢父母对我的支持&#xff0c;坚定报考南大的目标&#xff0c;最终专业851信号与系统140&#xff0c;总分410顺利被南京大学录取&#…

【C++】初识C++之C语言加入光荣的进化(上)

写在前面 本篇笔记作为C的开篇笔记&#xff0c;主要是讲解C关键字(C98)连带一点点(C11)的知识。掌握的C新语法新特性&#xff0c;当然C是兼容C的&#xff0c;我们学习C的那套在C中也是受用。 ps:点我跳转下集 文章目录 写在前面一、命名空间域1.1、命名空间域的定义与使用1.2…