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个字节。

报头=源端口+目的端口+报文长度+校验和

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)通常用于特定的协议和服务,应避免使用这些端口号,以免与系统服务冲突。

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

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

相关文章

【JVM基础07】——类加载器-什么是类加载器?类加载器有哪些?双亲委派了解吗?

目录 1- 引言:类加载器1-1 类加载器是什么?(What)1-2 为什么要用类加载器? 作用:类加载的过程?(Why) 2- ⭐核心:类加载器详解(How)2-1 类加载器分类2-2 什么是双亲委派模型?2-3 为什么采用双亲委…

Pytorch基础:Tensor的squeeze和unsqueeze方法

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 在Pytorch中,squeeze和unsqueeze是Tensor的一个重要方法,同时它们也是torch模块中的一个函数,它们的语法如下所示。 Tensor.…

【SpringBoot】1 Gitee

本项目 Gitee 地址:https://gitee.com/Lin_DH/system idea中可能装个gitee的插件,这样操作起来比较方便。 1)登录 Gitee 官网(https://gitee.com/),新建仓库。 2)复制新建的 Gitee 仓库地址&am…

Unity3D之TextMeshPro使用

文章目录 1. TextMeshPro简介2. TextMeshPro创建3. TextMeshPro脚本中调用4. TextMeshPro字体设置及中文支持过程中出现的一些问题 1. TextMeshPro简介 【官网文档】https://docs.unity.cn/cn/2020.3/Manual/com.unity.textmeshpro.html TextMeshPro 是 Unity 的最终文本解决…

软件测试---Linux

Linux命令使用:为了将来工作中与服务器设备进行交互而准备的技能(远程连接/命令的使用)数据库的使用:MySQL,除了查询动作需要重点掌握以外,其他操作了解即可什么是虚拟机 通过虚拟化技术,在电脑…

Leetcode49. 字母异位词分组(java实现)

今天我来给大家分享的是leetcode49的解题思路,题目描述如下 如果没有做过leetcode242题目的同学,可以先把它做了,会更好理解异位词的概念。 本道题的大题思路是: 首先遍历strs,然后统计每一个数组元素出现的次数&#…

电商数据精细化运营解决方案(18页PPT)

方案介绍: 电商数据精细化运营解决方案通过全面、深入的数据分析与应用,助力电商企业实现精细化管理和精准化营销,从而在激烈的市场竞争中脱颖而出。 部分方案内容:

Prometheus 监控Tomcat等java应用的状态

5月应用服务出现问题,当别的小伙伴问我,有没有Tomcat等应用状态的监控的时候,我有点儿尴尬。所以赶紧抽空部署一下。 在配置之前,就当已经会安装jdk和tomcat了。 一、下载jmx_exporter #linux下 cd /usr/local/prometheus wget …

Debug-018-elementUI-el-tree中通过CSS隐藏任意一项的选择框checkbox

前情提要: 我们项目中使用的是elementUI,业务中经常需要使用到el-tree组件去实现一些有层级关系的功能。现在有一个需求描述一下:首先是这个el-tree是个有checkbox的树,每一子节点都可以被选择,用于去实现一些系统的权…

PHP多场地预定小程序系统源码

一键畅游多地!多场地预定小程序的超实用指南 段落一:【开篇:告别繁琐,预订新体验】 🎉🚀 还在为多个活动或会议的场地预订而头疼不已吗?多场地预定小程序来拯救你啦!它像是一位贴心…

【QT】QT 窗口(菜单栏、工具栏、状态栏、浮动窗口、对话框)

Qt 窗口是通过 QMainWindow类来实现的。 QMainWindow 是一个为用户提供主窗口程序的类,继承自 QWidget 类,并且提供了⼀个预定义的布局。QMainWindow 包含一个菜单栏(Menu Bar)、多个工具栏(Tool Bars)、…

7.26总结

1.我发现我的界面非常不符合要求,魔改了一下界面 2.在此基础上实现了编辑资料的功能,之前的编辑资料不够用完善,现在将所有数据存入数据库, 然后将更改的图片路径存到了服务端的文件夹,文件名为id更方便获取图片&…

Cuda编程模型中常见的错误检测方法

Cuda编程模型中常见的错误检测方法 1 CUDA错误检测简介2 直接嵌入检测函数2.1 检测函数介绍2.2 使用示例 3 封装在.cuh头文件中嵌入3.1 创建 error.cuh 头文件3.2 在 CUDA 程序中包含 error.cuh 并调用 CHECK 宏3.3 使用示例 1 CUDA错误检测简介 CUDA编程模型中的错误检测是确…

C++ - char*、const char*、char[]、string

const char* const char* 用来定义字符串常量。 char[ ] char型的字符数组是一种定长的数组,存储指定长度的字符序列,数组中的每个元素都是一个char类型的变量,如: char arr[] {h, a, l, l, o, \0}; char c arr[0]; // 访问…

【二叉树 C++DFS】2458. 移除子树后的二叉树高度

本文涉及知识点 二叉树 CDFS LeetCode 2458. 移除子树后的二叉树高度 给你一棵 二叉树 的根节点 root ,树中有 n 个节点。每个节点都可以被分配一个从 1 到 n 且互不相同的值。另给你一个长度为 m 的数组 queries 。 你必须在树上执行 m 个 独立 的查询&#xff…

模式Hash和history

vuerouter有两种路由模式Hash和history。区别:Hash为默认模式,url中包含一个#符号的哈希部分。优势:兼容性好,不需要后端服务器的特殊配置。缺点:不够美观,搜索引擎优化较差。History模式使用的浏览器的His…

C# 写入SQLServer数据库报错SqlException: 不能将值 NULL 插入列 ‘ID‘

private int id; [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]//id自增 public int ID { get > id; set > id value; } 将ID属性下的标识规范由否改成是

STM32-寄存器时钟配置指南

目录 启动 SystemInit SetSysClock 总结 启动 从startup_stm32f0xx.s内的开头的Description可以看到 ;* Description : STM32F051 devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the in…

微信小程序支付流程

前端需要做的事情: 生成平台订单:前端调用接口,向后端传递购买的商品信息、收货人信息,(后端生成平台订单,返回订单编号)获取预付单信息:将订单编号发送给后端后,&#x…

Hadoop单机版环境搭建

一 . 案例信息 Hadoop 的安装部署的模式一共有三种: 本地模式,默认的模式,无需运行任何守护进程( daemon ),所有程序都在单个 JVM 上执行。由 于在本机模式下测试和调试 MapReduce 程序较为方便&#x…