UDP的报文结构及其注意事项
1. 概述
UDP(User Datagram Protocol)是一种无连接的传输层协议,它提供了一种简单的数据传输服务,不保证数据的可靠传输。在网络通信中,UDP通常用于一些对实时性要求较高、数据量较小、传输延迟较低的应用,如音频、视频传输等。
2. UDP特点
1、无连接
UDP传输的过程类似于寄信,知道对端的IP和端口号就可以直接进行数据报传输,不用像TCP协议需要建立连接。
2、不可靠
UDP没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。
3、面向数据报
UDP通过数据报的形式进行传输,用户的请求或响应都会从数据报转换成字符串
应用层交给UDP多长的报文,UDP原样发送,既不会拆分也不会合并
例:用UDP传输100个字节的数据,如果发送端一次发送100个字节,那么接收端也必须一次接收100个字节,而不能循环接收10次每次接收10个字节。
4、全双工通信
UDP的Socket既能读也能写,客户端和服务器都可以发送请求/接受响应。
3. UDP的报文结构
UDP数据报=报头+载荷
1、报头
对于UDP来说,报头一共有8个字节,包含4个字段,每个字段2个字节。
报头=源端口+目的端口+报文长度+校验和
应用层数据报
UDP报头分为四个部分,每个部分占两个字节。
- 源端口
- 目的端口
- 报文长度
- 校验和
3.1源端口和目的端口
源端口和目的端口各占2字节(Byte)
,端口号范围:0~65535
比如:源端口是3306,目的端口是8866。
例:
3.2 报文长度
报文的长度也用2个字节表示,范围是0~65535
,单位是字节(Byte)
。
一般我们都说UDP最大报文长度是64KB (65536B)
,实际上是65535B
。
如果超过了64KB,可以通过以下两种方式来解决:
- 在应用层通过代码的方式针对应用层数据报进行手动分包,拆成多个包通过多个UDP数据报进行传输。
- 换成TCP协议
3.3 校验和
1、定义
将发送前和发送后的校验和进行比较,检查发送前后数据报是否一致。用来验证传输的数据是否是正确的。
2. 校验和存在的意义就是用来判定当前传输的数据是否出错:
如果校验和不对,此时数据一定不对
如果校验和对,数据也有一定概率是错的
为了让校验和能够识别率更高一些,计算时通常会以数据内容作为参数来计算,数据内容发生变化,校验和也会发生变化。
3.校验和主要校验的内容
数据内容: 校验和对数据报中的每个比特位进行求和计算,以确保数据内容在传输过程中没有被篡改或损坏。
传输过程中的错误: 校验和可以检测到数据在传输过程中是否发生了错误,例如比特翻转或数据丢失。
数据包的完整性: 通过与发送端发送的校验和进行比较,接收端可以验证数据包在传输过程中是否保持完整,即数据在发送端和接收端之间没有发生改变。
4. 校验和的实现方式
校验和使用的是一种简单的错误检测机制,它的实现方式如下:
1.计算校验和: 发送端在发送UDP数据包之前,会对UDP数据报文的内容进行校验和的计算。计算过程通常包括以下步骤:
将UDP数据报文划分为以16比特为单位的字(对于字节不足16比特的部分,可以补零)。
将这些16比特字相加,得到一个32比特的中间结果。
如果中间结果的高16比特不为0,则将其与低16比特相加,直到高16比特为0为止。
最终的校验和就是将最后的结果按位取反得到的值。
2.校验和字段: 发送端将计算得到的校验和值放置在UDP数据报的校验和字段中。
3.接收端验证: 接收端在接收到UDP数据包后,会进行校验和的验证。验证的步骤与计算过程类似:
接收端同样将UDP数据报文划分为16比特的字,并对其进行求和计算。
接收端将计算得到的校验和与UDP数据包中的校验和字段进行比较。
如果两者相等,则认为数据包未损坏;如果不相等,则认为数据包可能已经损坏。
4. 注意事项
1.无连接性:UDP是一种无连接的协议,不像TCP那样需要建立连接和维护状态。因此,发送端发送UDP数据报文后,无法知道是否被接收端正确接收,也无法进行重传操作。应用层需要自行处理丢包和数据重传的问题。
2.不可靠性:UDP不提供数据的可靠传输和重传机制,也不具备拥塞控制。因此,数据报文在传输过程中可能会丢失、重复或乱序。应用层需要自行处理这些问题,如通过数据包序号、确认应答等方式实现可靠性传输。
3.数据完整性:UDP提供校验和字段用于检验数据报文的完整性,但并不提供数据的纠错功能。因此,在传输过程中可能会出现数据损坏的情况。应用层可以通过校验和验证数据的完整性,但无法进行错误的纠正。
4.数据包大小限制:UDP数据报文的最大长度为65535字节,包括UDP头部和数据部分。超过这个长度的数据报文将被分片或丢弃。因此,在发送UDP数据时需要注意控制数据包的大小,避免过大导致分片或丢包。如果传输数据超过64K,就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装。
5.适用场景:UDP适用于对实时性要求较高、传输延迟较低的应用场景,如音视频传输、在线游戏等。但对于需要可靠传输和数据完整性保障的应用,应该选择TCP协议。
6.端口号选择:在使用UDP通信时,需要选择合适的端口号进行通信。系统保留端口号(0-1023)通常用于特定的协议和服务,应避免使用这些端口号,以免与系统服务冲突。
相关文章:

UDP的报文结构及其注意事项
1. 概述 UDP(User Datagram Protocol)是一种无连接的传输层协议,它提供了一种简单的数据传输服务,不保证数据的可靠传输。在网络通信中,UDP通常用于一些对实时性要求较高、数据量较小、传输延迟较低的应用,…...

MySQL深度分页问题深度解析与解决方案
文章目录 引言深度分页问题的原因解决方案方案一:使用主键索引优化方案二:使用子查询优化方案三:使用INNER JOIN优化方案四:使用搜索引擎 最佳实践结论 引言 在处理包含数百万条记录的大型数据表时,使用MySQL的LIMIT进…...

C#类型基础Part1-值类型与引用类型
C#类型基础Part1-值类型与引用类型 参考资料前言值类型引用类型装箱和拆箱 参考资料 《.NET之美–.NET关键技术深入与解析》 前言 C#中的类型一共分为两类,一类是值类型(Value Type),一类是引用类型(Reference Type)…...

被上市公司预判的EPS增速分析
EPS增速对二级市场投资和估值有着很显著的影响,上市公司显然也知道这一点。对于想要做市值管理的上市公司来说,调节EPS增速比调节EPS更加有效。因此《穿透财报:读懂财报中的逻辑与陷阱》中的作者在第四章正式提出了二级市场财务分析中的额动态…...

快速入门了解Ajax
博客主页:音符犹如代码系列专栏:JavaWeb关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Ajax的初识 意义:AJAX(Asynchronous JavaScript and…...

FPGA开发——呼吸灯的设计
一、原理 呼吸灯的原理主要基于PWM(脉冲宽度调制)技术,通过控制LED灯的占空比来实现亮度的逐渐变化。这种技术通过调整PWM信号的占空比,即高电平在一个周期内所占的比例,来控制LED灯的亮度。当占空比从0%逐渐变化到1…...

【数据结构】二叉树链式结构——感受递归的暴力美学
前言: 在上篇文章【数据结构】二叉树——顺序结构——堆及其实现中,实现了二叉树的顺序结构,使用堆来实现了二叉树这样一个数据结构;现在就来实现而二叉树的链式结构。 一、链式结构 链式结构,使用链表来表示一颗二叉树…...

开始尝试从0写一个项目--后端(三)
器材管理 和员工管理基本一致,就不赘述,展示代码为主 新增器材 表设计: 字段名 数据类型 说明 备注 id bigint 主键 自增 name varchar(32) 器材名字 img varchar(255) 图片 number BIGINT 器材数量 comment VARC…...

2024年7月解决Docker拉取镜像失败的实用方案,亲测有效
在Ubuntu 16.04、Debian 8、CentOS 7系统中,若遇到Docker拉取镜像失败的问题,以下是一些亲测有效的解决方案: 配置加速地址 首先,创建Docker配置目录:sudo mkdir -p /etc/docker然后,编辑daemon.json文件…...

基于内容的音乐推荐网站/基于ssm的音乐推荐系统/基于协同过滤推荐的音乐网站/基于vue的音乐平台
获取源码联系方式请查看文末🍅 摘 要 随着信息化时代的到来,系统管理都趋向于智能化、系统化,音乐推荐网站也不例外,但目前国内的有些公司仍然都使用人工管理,公司规模越来越大,同时信息量也越来越庞大&…...

STM32智能工业监控系统教程
目录 引言环境准备智能工业监控系统基础代码实现:实现智能工业监控系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:工业监控与优化问题解决方案与优化收尾与总结 1. 引言 智能工业监控系统通…...

WEB渗透Web突破篇-SQL注入(MYSQL)
注释符 # -- 注意这里有个空格 /* hello */ /*! hello */ /*!32302 10*/ MYSQL version 3.23.02联合查询 得到列数 order by或group by 不断增加数字,直到得到报错响应 1 ORDER BY 1-- #True 1 ORDER BY 2-- #True 1 ORDER BY 3-- #True 1 ORDER BY 4-- #Fal…...

PDF解锁网站
https://smallpdf.com/cn/unlock-pdfhttps://smallpdf.com/cn/unlock-pdfhttps://www.freemypdf.comhttps://www.freemypdf.com...

【Redis】主从复制分析-基础
1 主从节点运行数据的存储 在主从复制中, 对于主节点, 从节点就是自身的一个客户端, 所以和普通的客户端一样, 会被组织为一个 client 的结构体。 typedef struct client {// 省略 } client;同时无论是从节点, 还是主节点, 在运行中的数据都存放在一个 redisServer 的结构体中…...

Transformer自然语言处理实战pdf阅读
一.第一章 欢迎来到transformer的世界 1.解码器-编码器框架 在Transformer出现之前,NLP的最新技术是LSTM等循环架构。这些架 构通过在神经网络连接使用反馈循环,允许信息从一步传播到另一 步,使其成为对文本等序列数据进行建模的理想选择。如…...

Python 高阶语法
前言: 我们通过上篇文章学习了Python的基础语法,接下来我们来学习Python的高阶语法 1.初识对象 在Python中我们可以做到和生活中那样,设计表格、生产表格、填写表格的组织形式的 面向对象包含 3 大主要特性: 封装 继承 …...

开始尝试从0写一个项目--前端(三)
器材管理板块 添加器材管理导航 src\views\home\Home.vue src\router\index.js src\views\equipment\Equipment.vue <template><div>hello!</div></template> 测试 搜索导航分页查询 src\views\equipment\Equipment.vue <template><div&…...

Visual stdio code 运行C项目环境搭建
参考 [1]VS Code 配置 C/C 编程运行环境(保姆级教程)_visual studio code c配置-CSDN博客 [2]最新VS code配置C/C环境(tasks.json, launch.json,c_cpp_properties.json)及运行多个文件、配置Cmake_vscode launch.json如何配置-CSDN博客 先装visual stdi…...

免杀笔记 -->API的整理Shellcode加密(过DeFender)
最近更新频率明显下降我懒,那么今天就来记录一下我们的一些常用的API的整理以及ShellCode的加密。 1.WinAPI整理 问我为什么要整理? 就是用起来的时候要左翻右翻 :: 烦死了 1.VirtualAlloc VirtualAlloc(NULL,sizeof(buf),MEM_…...

Stable Diffusion 使用详解(3)---- ControlNet
背景 炼丹师在AI绘画的过程中,由于Stable Diffusion的原理是水滴式的扩散作图原理,其实在前面也有提到,他的发挥是‘不稳定’的,因为你没有办法做到精确控制,只能说是大致符合你的预期。你不能总依赖抽卡固定随机数种…...

pythonGame-实现简单的贪食蛇游戏
通过python简单复现贪食蛇游戏。 使用到的库函数: import pygame import time import random 游戏源码: import pygame import time import randompygame.init()white (255, 255, 255) yellow (255, 255, 102) black (0, 0, 0) red (213, 50, 80…...

2024年软件系统与信息处理国际会议(ICSSIP 2024)即将召开!
2024年软件系统与信息处理国际会议(ICSSIP 2024)将于2024年10月25-27日在中国昆明举行。引领技术前沿,共谋创新未来。ICSSIP 2024将汇聚来自世界各地的专家学者,他们将在会上分享最新的研究成果、技术突破及实践经验。会议议题涵盖…...

使用vscode连接开发机进行python debug
什么是debug? 当你刚开始学习Python编程时,可能会遇到代码不按预期运行的情况。这时,你就需要用到“debug”了。简单来说,“debug”就是能再程序中设置中断点并支持一行一行地运行代码,观测程序中变量的变化ÿ…...

(家用)汽车充电桩项目总结分析
1. 项目选题背景 (1)社招:公司想做这个方向,先让学习测试一下,而且不做Web或者APP,以某一个模块或者某一个部分为主 (2)非社招:之前在学校做的一个学习的项目 2. 充电…...

JMeter接口测试:测试中奖概率!
介绍 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、J…...

生成式人工智能之路,从马尔可夫链到生成对抗网络
人工智能(Artificial intelligence,AI)技术在过去几年中取得了显著进展,其中生成式AI(Generative AI)因其强大的内容生成能力而备受关注。生成式AI可以创建新的文本、图像、音频、视频、代码以及其他形式的…...

qt做的分页控件
介绍 qt做的分页控件 如何使用 创建 Pagination必须基于一个QWidget创建,否则会引发错误。 Pagination* pa new Pagination(QWidget*);设置总页数 Pagination需要设置一个总的页数,来初始化页码。 pa->SetTotalItem(count);设置可选的每页数量…...

MySQL with recursive 用法浅析
目录 写在前面 语句功能 with recursive 语法讲解 细节补充 “union all”语句 添加递归终止条件 写在前面 介绍“with recursive”用法的文章不少,但我都觉得讲的不够通俗,所以干脆自己写一篇。话不多说,进入正题。 语句功能 with r…...

ROS2常用命令集合
文章目录 指令帮助创建功能包功能包查找编译执行节点查看话题服务命令接口命令动作命令参数命令录制控制命令 指令帮助 ros2 --help # 帮助查看命令创建功能包 ros2 pkg create 包名 --build-type 构建类型 --dependencies 依赖列表 --node-name 可执行程序名称功能包查找 …...

VUE 子组件可以直接改变父组件的数据吗
子组件不可以直接改变父组件的数据。在Vue中,数据流是单向的,即父组件通过props向子组件传递数据,而子组件不能直接修改父组件的数据。这是为了维护数据流动的单向性和数据的可维护性。 如果子组件需要修改父组件的数据…...