站在程序猿的角度理解:UDP 协议

news/2024/4/24 5:08:14/文章来源:https://blog.csdn.net/weixin_67603503/article/details/130108983

哈喽,大家好~我是你们的老朋友: 保护小周ღ,本期为大家带来的是 网络基础原理中的 UDP 协议,从什么协议?,认识 UDP 协议,UDP 的报文格式,UDP 传输大文件时的策略,以及 UDP 协议的工作流程这几个方面讲解,咱们程序猿不会网络知识是不行的,确定不来看看嘛~~
更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘

 一、什么是协议

为了使数据在网络上传输(从源头到达目的),网络通信的参与方必须遵循相同的规则,如:怎么样建立连接、怎么样传输、怎么样互相解析信息等。只有遵守这个约定,计算机之间才能相互通信交流。这样的规则就被称之为协议(protocol),它最终体现为在网络上传输的数据包的格式。

协议约定了层级和层级之间的调用关系,上层协议调用下层协议,下层协议给上层协议提供支持,不能跨层调用。

详细内容查看:程序猿眼中的协议:TCP / IP 五层网络模型_保护小周ღ的博客-CSDN博客

真实的网络协议使用的是 TCP / IP 五层网络模型,也是当下最广泛使用的网络的模型。

本次讲述的 UDP 协议是传输层上比较常用的协议。

另外一个更厉害的协议 TCP 敬请期待下一篇博客~


二、认识UDP 协议

UDP(User Datagram Protocol)是一种无连接的传输层协议,它不保证数据传输的可靠性,但是具有传输速度快、开销小等特点。UDP协议主要用于需要快速传输数据且对数据的可靠性要求不高的场景,如在线游戏,分布式系统信息的传输(短距离的传输 UDP 的传输的效率是很高的)。

2.1 UDP协议的特点:

  1. 无连接:UDP协议在传输数据之前不需要建立连接,也不需要维护连接状态,可以看作是一股脑地传输,因此传输速度快。

  2. 不可靠:UDP协议不保证数据传输的可靠性,因为它不提供重传机制、异常处理等功能,如果数据在传输过程中出现丢失或错误,UDP协议也不会进行任何处理。

  3. 面向数据报:数据报是通过网络传输的数据的基本单元,包含一个报头(header)和数据本身,其中报头描述了数据的目的地以及和 “荷载” 数据之间的关系。UDP协议的头部只有8个字节,相比TCP协议的头部要小得多,开销也相对小。该知识点下文详细介绍。

  4. 全双工通信:通信允许数据在两个方向上同时传输,比如打电话,通话双方可以同时讲话。

  5. 支持广播和多播:UDP协议支持广播和多播,可以将数据同时发送给多个主机。

敲黑板面试题:TCP 与 UDP有什么区别?

TCP 是面向有连接,采用字节流传输,数据传输可靠的全双工通信协议。

UDP 是面向无连接,采用数据报传输,数据传输不可靠的全双工通信协议。


2.2 UDP 协议的报文格式

学习协议其中一个重要的环节就是认识协议报文格式,一个协议具体是怎么组织数据的。

 UDP报文主体分为两个部分: UDP报头(占8个字节的数据) + UDP数据 / UDP载荷

  • 荷载:比较容易理解,里面存储的是应用层的数据报。

  • UDP报头:源端口,目的端口,报文长度,校验和,组成,每个部分占两个字节,可以描述的数据范围是 [0, 65535] 。

解析报文:

  1. 源端口:表示数据从哪里来,端口号可认为是一个进程的标识(那个软件发送的信息),传输层毕竟给应用层提供服务。

  2. 目的端口:表示数据到哪里去,数据报到达指定主机后,将数据报给那个软件解析(进程,通信双方约定了统一的协议格式就可以互相解析数据)。

  3. 传输层的数据报进入网络层后会添加网络层报头,网络层报头中会描述 源 IP 和 目的IP ,这层协议可以用来在庞大的网络环境中找到目标主机。

  4. 报文长度:描述了一条 UDP 数据报所占字节大小,因为长度只占 2个字节,所以他能描述的数据范围是 [0, 65535], 所以一条 UDP 数据报最大长度是 65536 个字节 = 64KB;

  5. 校验和网络传输并非完全稳定,信息的传输方式有多种多样,难免会出现意外,例如说:恶劣天气,强磁场干扰,传输介质,信号衰减等原因,所以校验和存在的目的就是用来判断一下,当前传输的数据是否出错,如果校验和不对,传输的数据一定不对,即使校验和是对的,数据也有一定的概率是错误的,校验和的校验方式通常会以数据内容(正文荷载中的数据)作为参数进行算法计算,当接收方拿到 UDP 数据报后, 把荷载中的数据拿出来代入校验和算法,再把结果与校验和比较是否相同,即可判断数据传输是否准确。(前提是输入的内容一样,按照统一算法得到的校验和结果也是一样的)。只能由接收端判断数据是否可靠,UDP 协议不提供重发机制,错了就错了,只管传输。

  6. UDP 数据报正文\荷载:里面包含的是应用层数据报的信息,UDP 报文长度(最大值) - UDP 报头即可得荷载大小,报文长度最大是可以描述 64字节,UDP整个报头占 8 个字节,所以荷载最大存储空间(一条UDP 数据报最大能携带的应用层信息)是 64 - 8 = 56字节。

端口号详解:

所谓的端口,可以看作应用程序的门牌号一样,客户端可以通过ip地址找到对应的目的端,但是目的端是有很多应用程序端口的,每个应用程序对应一个端口号;

比如说我电脑qq 给 你发了一条消息,这个条消息通过网络发送到你的电脑,进入你的电脑后,这条消息怎么能知道要给那个应用程序呢(进程)?微信也是腾讯的,也没见着能接收qq 发的消息啊,关键的就是应用程序在启动时会绑定了一个端口号(端口号在一定范围内可以随机使用),一台主机中的端口号不可重复,所以消息在进入主机后就会根据端口号将信息发送到指定应用程序,应用程序就根据应用层的数据报协议(这个可以是通信双方约定的协议,qq自己的协议)解析信息。

端口号只占两个字节,可以描述的数据范围是 [0, 65535] ,也就是我们可以使用的端口号只有这么多,对于小于 1024 的端口号被称之为“知名端口号”,是提供给一些名气比较大的服务器使用,例如:http 服务器的端口号位 80, ssh 的端口号为:22, ftp 服务器的端口号是 21。所以我们要在程序设计中尽量避免使用这部分端口。


2.3 使用UDP 协议传输大文件时的策略

上文介绍 一条 UDP 数据报最大可以传输 64 个字节,去掉报头之后有效的报文荷载只有56字节,也就是说一条 UDP 数据最多传输 56个字节的内容,对于高速发展的科技,太小了,一首歌就有几兆呢(M)。

在面对大型文件传输的时候,UDP 将一个大的数据报拆分成多个部分,使用多个 udp 数据报来传输,作为接收方(应用层)来讲,就需要与发送方(应用层)约定好数据报的解析协议。

例如:我qq给女朋友发送了一大段小作文(应用层的数据报),刷刷的好几百KB, 使用 UDP 协议传输,一条UDP 数据报肯定是不够的,就可以分割成好几条数据报传输,作为接收方(女朋友)的qq, 就需要将发送过来的 UDP 数据报解析\分用成应用层数据报,这个时候根据某种相互约定好的协议才能解析。

作为接收方来讲以上数据如何由多条UDP 数据报,组合成一条应用层的数据报呢 ?

所谓封装 UDP 数据报,分割应用层数据报什么的实质上就是字符串的拼接,也就是说数据报的本质就是字符串,协议就是描述了如何 封装\分用\解析 这些字符串

UDP协议并没有对分割后的数据报作出重新组合的规定,这是由应用层协议负责实现(因为是应用层选择使用 UDP 协议),那么就需要根据UDP协议长度这一特性来设计应用层数据报,一般来说,应用层协议会在发送端进行相关处理,将原始数据分割成多个UDP数据报发送出去,在接收端进行接收之后再进行重新组合,实现方法可以有多种,比如可以在UDP首部附加序列号等信息,接收端通过这些信息来拼接数据报,包括使用一些特殊的分隔符区分一条应用层数据报等等,这方面都是可以通过应用层的手段来控制的。

使用一些特殊的分隔符区举个例子:

这只是一种应用层协议约定的策略,是可以自定义的,前提是通信双方都采用该协议。


当需要我们使用UDP 协议传输大文件时,还有一种方式是建议直接使用 TCP 协议传输,哈哈,即使没有 UDP 传输的快,但是数据传输的真实性高,还没有 UDP 这么麻烦,TCP 是面向字节流传输的嘛,同时也需要通信双方约定好应用层协议,方便解析信息。


 2.4 UDP协议的工作流程

  1. 应用程序将应用层数据报传输给UDP协议。

  2. UDP协议将数据封装成UDP数据报(直接在应用层数据报的基础上加上UDP 报文),包括源端口号、目的端口号、数据长度等信息。

  3. UDP协议将UDP数据报传输给IP协议。

  4. IP协议将UDP数据报封装成IP数据报,包括源IP地址、目的IP地址等信息。

  5. IP数据报通过网络传输到目的主机。

  6. 目的主机的IP协议将IP数据报解封装成UDP数据报。

  7. UDP协议将UDP数据报传输给应用程序

总结:UDP协议是一种简单、快速的传输协议,适用于实时应用程序和需要快速传输数据的应用场景。但是由于它不保证数据传输的可靠性,因此在传输重要数据时需要使用其他协议,如TCP协议。


到这里,网络编程中的 UDP 协议博主已经分享完了,希望对大家有所帮助,如有不妥之处欢迎批评指正。 

本期收录于博主的专栏——JavaEE,适用于编程初学者,感兴趣的朋友们可以订阅,查看其它“JavaEE基础知识”。

下期

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* 

遇见你,所有的星星都落在我的头上……

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

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

相关文章

VS code 插件之中英文间自动添加空格

前言 不知道大家在开发过程中是不是会遇到写代码注释或者文本内容时中英文之间没有空格的情况,很多时候在写代码尤其是写注释的时候容易忘记加空格,但回过头来看又难以忍受,于是我就想着自己写一个 vscode 插件来解决这个问题,希…

展会邀请 | 虹科诚邀您4月26-28日前来参观成都国际工业博览会

HONGKE NEWS 2023 成都国际工业博览会精准聚焦中国智能制造,将通过展示自动化和工业机器人技术、新一代信息技术、金属加工、节能与工业配套、新材料等全行业最新技术和解决方案,完美呈现智能工业产业链中的创新技术及产品的有效融合。 2023年4月26日-…

高效编程----VSCode+ChatGPT插件

VSCode中使用ChatGPT插件 首先在VSCode中打开扩展面板,搜索ChatGPT,安装蓝色圈出插件,如图所示: 安装完成后,需要重启VSCode 注册账号,如图所示: 然后在ChatGPT对话框中输入信息即可使用&#…

Python 实验四 常用数据结构(1)

1.从键盘输入一个正整数列表,以一1结束,分别计算列表中奇数和偶数的和。 n int(input("请输入一个正整数:")) list [] while n ! -1:list.append(n)n int(input("请输入一个正整数:")) else:print("…

【Linux网络】部署YUM仓库及NFS服务

部署YUM仓库及NSF服务 一、YUM仓库1.1、YUM仓库概述1.2准备安装来源1.3在软件仓库加载非官方RPM包组1.4yum与apt 二、配置yam源与制作索引表2.1配置FTP源2.2配置国内在线yum源2.3在线源与本地源同时使用2.4建立软件包索引关系表的三种方法 三、nfs共享存储服务3.1安装软件&…

Django框架之创建项目、应用并配置数据库

django3.0框架创建项目、应用并配置数据库 创建项目 进入命令行 新建一个全英文的目录 进入目录 输入命令 django-admin startproject project 项目目录层级 查看当前目录层级 tree /f 目录文件说明 创建数据库 做一个学生管理系统做演示,使用navicat创建数据…

ML之DR:sklearn.manifold(流形学习和降维的算法模块)的简介、部分源码解读、案例应用之详细攻略

ML之DR:sklearn.manifold(流形学习和降维的算法模块)的简介、部分源码解读、案例应用之详细攻略 目录 sklearn.manifold的简介 sklearn.manifold(流形学习和降维的算法模块)的概述 外文翻译 sklearn.manifold的部分源码解读 sklearn.manifold的简介 sklearn.ma…

Bugku——应急加固1

来打一下bugku的应急加固靶场,靶场链接:https://ctf.bugku.com/ctfplus/detail/id/2.html 启动环境 1、JS劫持域名 直接访问ip地址,发现是xxx学院二手交易市场,随后被劫持跳转到了一个博客页面。 博客地址就是第一个flag&…

Android音视频开发-OpenGL ES正交投影实现方法

本文实例为大家分享了OpenGL ES正交投影展示的具体代码,供大家参考,具体内容如下 绘制正方形 在最开始绘制的六边形里面好像看起来挺容易的,也没有出现什么问题,接下来不妨忘记前面绘制六边形的代码,让我们按照自己的…

Ubuntu下打开QtCreator,环境变量(PATH、LD_LIBRARY_PATH等)与预期不一致的问题

现象展示 在Ubuntu中,安装好Qt之后,可以在系统桌面的左下角找到启动图标 但是,这种方式启动的QtCreator所读取到的环境变量和我们从命令行读取到的不一致: 可以看到,明显少了这个:/opt/ros/humble/bin 因…

很合适新手入门使用的Python游戏开发包pygame实例教程-02[如何控制飞行]

前面一篇博文,我们让飞机动起来了,但不是那么完美,我们继续来完善我们的游戏代码,本篇博文主要介绍获取按键的方式已经飞行的控制。 文章目录 一、获取按键的三种方式1、通过event.get配合pygame.key枚举2、通过event.get配合ord…

微积分入门

文章目录 前言初期积分微分微积分问题 后期极限 ε \varepsilon ε- δ \delta δ极限勒贝格积分 结语 前言 微积分总共走过了两个时期。首先是牛顿和莱布尼茨利用无穷小量定义微分和积分,并且发现了微分和积分的关系,这是第一个时期,这时的…

设计模式——组件协作模式之模板方法模式

文章目录 前言一、“组件协作” 模式二、模板方法模式1、动机2、源码分析讲解①、结构化软件设计②、面向对象软件设计 三、模板方法模式定义四、结构要点总结 前言 一、“组件协作” 模式 现代软件专业分工之后的第一个结果是 “框架与应用程序的划分”,“组件协作…

Cuckoo Filter

其他判重数据结构 Bloom Filter 无法支持删除和计数的功能,需要更多的存储空间来存储数据 因为在CS中,删除和计数是常见的操作,但是这会对布隆过滤器的存储空间产生影响,同样为了实现这一操作,需要更多的存储空间 数…

ArcGIS Pro导航工具

主要导航工具为浏览工具 、屏幕导航器 、书签 、转到XY工具 。 其它还包括链接视图、地图比例(2D)、场景高度(3D)、暂停并刷新绘制、照相机属性、在3D模式下导航、键盘快捷键等。 1 主要导航工具 地图和场景的默认工具为浏览工具…

C++ “类与对象”

类与对象的概念 类相当于是结构体的声明,是结构体的设计图,而对象是利用设计图的创造的产物. (1).类的大小计算 类的大小计算时与结构体类似,但函数是不计入大小的(函数放在单独的公共空间). 在…

Unity API详解——Object类

Object类是Unity中所有对象的基类,例如GameObject、Component、Material、Shader、Texture、Mesh、Font等都是Object的子类。本博客介绍Object类的一些实例方法和静态方法。 一、Object类实例方法 在Object类中,涉及的实例方法主要有GetInstanceID方法…

8. 优先队列

8. 优先队列 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在某些情况下,我们可能需要找出队列中的最大值或者最小值,例如使用一个队列保存计算机的任务,一般情况下计算机的任务都是有优先级…

ROS1学习笔记:常用可视化工具的使用(ubuntu20.04)

参考B站古月居ROS入门21讲:常用可视化工具的实现 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录 一、日志输出工具:rqt_console二、绘制数据曲线:rqt_plot三、 图像渲染工具:rqt_image_view四、图形界面总接口:r…

kong(4):限流配置

Kong 提供了 Rate Limiting 插件,实现对请求的限流功能,避免过大的请求量过大,将后端服务打挂。 Rate Limiting 支持秒/分/小时/日/月/年多种时间维度的限流,并且可以组合使用。例如说:限制每秒最 多 100 次请求&…