当前位置: 首页 > article >正文

传输层协议 --- UDP

序言

 在之前的文章 Socket 编程 中,我们只是简单的知道了怎么利用 UDP协议 或者是 TCP协议 来发送我们的数据,并且我们还知道 UDP 是不可靠的,TCP 是可靠的。但这是为什么呢?底层的构造和策略决定他们的属性!这篇文章中,我们就来先认识 UDP 吧。


UDP 协议端格式

 每一层都有相应的协议,所谓协议,我们也可以简单认为就是在正文之前加上若干结构体字段(报头),确保数据的正确传输、识别、处理以及可能的校验和错误恢复。UDP 的报头如下:
在这里插入图片描述
在正文之前一共包含 64 位长度(8字节)的字段,每个字段的功能如下:

  • 源端口号(Source Port):占用 2 个字节,表示发送方端口号
  • 目标端口号(Destination Port):占用 2 个字节,表示接收方端口号
  • 长度(Length):占用 2 个字节,表示 UDP 数据报文的长度,包括头部和数据部分
  • 检验和(Checksum):占用 2 个字节,用于检测 UDP 数据报在传输过程中是否有错误。如果检验和出错,就会直接将报文丢弃
    - 数据(Data):占用 0 个或多个字节,实际传输的数据部分

在这里我们着重介绍一下 长度 字段,占 2 个字节,构成于 报头 + 报文。我们可以简单计算一下,2 个字节表示的最大数字是 — 2^16 - 1 = 65535,这就代表一个 UDP 数据报的最大长度为 65535 字节,再减去报头的长度 8 字节,那么能传输的最大的报文的长度为 65527 字节。当然这只是理论情况下,实际情况下看到受到其他的限制。


UDP 协议的特点

1. 无连接

UDP 在发送数据之前 不需要建立连接,数据包可以直接发送到目标主机。这种无连接性减少了建立连接和断开连接的开销,并提高了传输效率。
 这个是我们直观感受过的,当时我们的服务端并未启动,但是客户端依然可以将数据传送到服务端!这说明两者之间通信是不需要建立连接状态的。

2. 不可靠(尽最大努力交付)

UDP 不保证可靠交付,即不保证数据包能够到达目标主机或按发送顺序到达。如果数据包在传输过程中丢失或损坏,UDP不会进行重传或错误恢复。
 结构决定特性!UDP 协议端的格式很简单,只是负责将数据发出,并不会去维护发送了哪些信息!

3. 面向报文

UDP 对应用程序交下来的报文不再划分为若干个分组来发送,也不把收到的若干个报文合并后再交付给应用程序。UDP 保留了报文的边界,使得接收方能够准确地识别出每个报文的内容。

 通过了解 UDP,大家不觉得其实它的特征就很像很早之前信件传输吗?一封信发出去,谁也不知道它是否能到达收信人手中,就算收到了也不知道。


UDP 的缓冲区

UDP 是全双工的,可以接受的同时发送,但是他还和 TCP 有点不一样,两者都是全双工,但是 TCP 是包含发送缓冲区和接收缓冲区的,但是 UDP 没有发送缓冲区:
在这里插入图片描述

 这是因为 UDP 对发送数据添加报头后立马就会发送,不会进行其他的操作,而 TCP 为了达到一个可靠通信,在发送数据时会进行相应的处理(在后面介绍 TCP 时会介绍)。并且 UDP 这个接收缓冲区不能保证收到的 UDP 报的顺序和发送 UDP 报的顺序一致,如果缓冲区满了,再到达的 UDP 数据就会被丢弃(果然是不靠谱的协议)。


UDP 的使用注意事项

 刚才我们谈到,一次 UDP 传输的数据最大为 65527 字节,然而该大小在当今的互联网环境下,是一个非常小的数字。如果我们需要传输的数据超过该数字,就需要在应用层手动的分包,多次发送,并在接收端手动拼装。


总结

 在这篇文章中我们了解了 UDP,感觉内容不是很多,也比较好理解。但是在之后学习 TCP 可是截然不同了,毕竟后者为了 可靠 可是下了不少功夫,希望大家这篇文章有所收获!


http://www.kler.cn/news/328668.html

相关文章:

  • C++ 线程
  • Linux 应用层自定义协议与序列化
  • 【Java数据结构】 ArrayList 顺序表
  • Android-Handle消息传递和线程通信
  • LeetCode 面试经典150题 66.加一
  • 【数据类型】C和C++的区别
  • 【C#生态园】探索地理信息系统软件套件与库:功能、API和应用
  • CSS | CSS中强大的margin负边距
  • 深度学习中的卷积神经网络
  • Ubuntu安装Docker和Docker Compose
  • 高性价比PCB分板机高速主轴SycoTec 4025 HY
  • LeetCode 面试经典150题 172.阶乘后的零
  • PCL 最远点采样(FPS)
  • 微服务SpringSession解析部署使用全流程
  • 10.数据结构与算法-线性表的应用(线性表与有序表的合并)
  • 【K8S系列】深入解析 Kubernetes 网络策略(二)
  • Redis篇(Java操作Redis)
  • 微服务JSR303解析部署使用全流程
  • tailwindcss group-hover 不生效
  • Spring Boot驱动的足球青训俱乐部管理解决方案
  • 鹏哥C语言62---第9次作业:函数递归练习
  • 2025 年 IT 前景:机遇与挑战并存,人工智能和云计算成重点
  • 【Android 源码分析】Activity生命周期之onPause
  • local minima 的问题如何解决
  • .Net 基于IIS部署blazor webassembly或WebApi
  • 用Python+flask+mysql等开发的Excel数据资产落地工具
  • 【一文读懂】C#如何实现通用的排序功能
  • 车辆重识别(利用扩散模型合成有效数据进行行人再识别预训练)论文阅读2024/9/27
  • 【树莓派系列】树莓派首次开机配置
  • LeetCode 面试经典150题 50.Pow(x,n)