文章目录
- 前言
- [1. UDP 协议简介](#1. UDP 协议简介)
- [2. UDP 协议的报文](#2. UDP 协议的报文)
- [3. UDP 协议的特点](#3. UDP 协议的特点)
- 补充
-
-
- [TCP 和 UDP 协议的区别](#TCP 和 UDP 协议的区别)
- [UDP 在应用层实现可靠性](#UDP 在应用层实现可靠性)
-
- 总结
前言
本文章将会和大家一起了解 TCP/IP 协议栈中的传输层中的 UDP 协议。
1. UDP 协议简介
-
UDP:
UDP(User Datagram Protocol,用户数据报协议)这是一个无连接、不可靠 的传输层协议。
UDP协议主要的特点:
-
数据报 :其协议的数据单元式"数据报 "。我们可以理解为一个个独立的数据包裹,在发生数据的时候,是以一个包裹的形式进行发送的。
-
无连接 :使用 UDP 协议进行通信之间不需要像 TCP 协议一样建立连接 (三次握手)。发送方直接通过
socket返回的文件描述符进行sendto操作就能发送数据。 -
不可靠:UDP 协议并不会保障数据。例如,UDP 协议传输的数据不会管对方是否接受成功、到达对方的顺序是否正确......
-
2. UDP 协议的报文
-
如下图:

-
我们需要解决的两个问题:
-
Q:UDP 协议中的报头和有效载荷是如何分离的?
A:UDP 协议采用固定长度的报头,这个固定长度的报头长度为8字节。
-
Q:有效载荷是如何交付给上层的?
A:在 UDP 报文的报头中有一个字段 "16位的目标端口号"。这个字段描述了应该交付给上层处于应用层的哪一个进程。
-
下面我们来谈谈关于 UDP 协议中字段的详细介绍:
-
源端口号:
发送方应用程序使用的端口号。作用是告诉接收方"回复数据的时候应该交给我的哪一个程序" 这个字段在需要回复的场景下十分重要。
-
目的端口号:
接收方应用程序使用的端口号。作用是能够确保对应的数据报能够被操作系统交付给正确的应用程序。
-
长度:
指示整个 UDP 报文的总长度(包括8字节的头部信息)。根据整个值,我们能够确认一个 UDP 协议中能够传输的数据范围是 [8, 65507( 2 16 − 9 2^{16}-9 216−9)] 。所以当 UDP 报文的数据超过了这个范围的时候,UDP 只能分开发送一整个信息了。
-
校验和:
用于检错。检查数据包在传输过程中是否发生错误。计算的内容:不仅仅计算 UDP 数据部分,同时还会引入一个"伪头部"(包括源IP、目的IP、协议号、UDP长度)。主要在于接受方,和发送方进行同样的数据计算,如果校验和相同,那么就证明数据是有效的;否则,直接丢弃该数据报。
3. UDP 协议的特点
主要特点还是我们上面总结的三点。下面是比较细的一些讲解。关于不可靠,和TCP协议进行对比即可知道了。
-
面向数据报
-
对应用层交下来的报文,UDP既不合并,也不拆分,而是保留原报文的边界。它一次交付一个完整的报文 给下层协议。因此,应用程序必须选择合适大小的报文(TCP 协议有滑动窗口控制),否则 IP 层分片会降低效率。
关于 UDP 缓存区问题 :UDP 没有真正意义上的发送缓冲区 ,使用
sendto这样的调用的时候会将数据直接交付给内核,由内核完成接下来的过程。UDP 是拥有接受缓冲区的,但是这个缓冲区不会保证数据的顺序性。而且如果缓冲区满了,多余的数据会被直接丢弃!UDP 是全双工的。(fd既可以读也可以写)
-
-
无连接
-
优点:开销小,速度快,没有建立和断开连接的开销。
-
缺点:无法预知网络状态和对方接收能力。
-
-
尽最大努力交付
- 它只负责"发送",不保证"送达"。网络拥堵、路由错误等都可能导致数据报丢失。
-
无序性
- 先发送的数据报不一定先到达。因为 UDP 协议没有像 TCP 协议中序列号这样的概念。
-
没有拥塞控制
- UDP 发送数据的速率不受网络拥堵状况的影响。它会以恒定的速率发送,这可能会加剧网络拥堵,导致TCP等有拥塞控制的协议性能下降,但对自己没有影响(因为它不在乎丢包)。
-
支持一对一、一对多、多对多通信
- 由于无连接的特性,UDP可以非常方便地用于广播(发给同一网络的所有主机)和组播(发给一组特定的主机)。
补充
TCP 和 UDP 协议的区别
我们通过一个表格来整理区别:
| 特性 | TCP(传输控制协议) | UDP(用户数据报协议) |
|---|---|---|
| 连接性 | 面向连接:通信前必须通过三次握手建立可靠连接 | 无连接:无需建立连接,直接发送数据 |
| 可靠性 | 可靠:通过确认、重传、序列号等机制保证数据正确、有序、不重复 | 不可靠:不确认、不重传、不保序 |
| 数据传输模式 | 面向字节流:没有边界,应用程序看到的是一个无边界的数据流 | 面向报文:有明确边界,发送和接收都以完整的报文为单位 |
| 拥塞控制 | 有:通过慢启动、拥塞避免等算法动态调整发送速率,公平友好 | 无:恒定速率发送,可能加剧网络拥堵 |
| 头部开销 | 大(20-60字节),包含大量控制信息 | 小(固定8字节),非常轻量 |
| 速度 | 慢:由于连接开销、确认机制和拥塞控制,延迟较高。 | 快:没有额外控制,延迟低,实时性好 |
| 通信模式 | 仅支持一对一通信 | 支持一对一、一对多(广播/组播)、多对多 |
| 适用场景 | 要求数据准确性的场景:文件传输、邮件、网页浏览 | 要求速度和实时性的场景:视频会议、在线游戏、DNS、语音通话 |
综合上面表格我们给出下面的几个方面的差异:
-
协议本身报文格式:报文格式的差异
-
协议的使用:有无连接、传输是否可靠(TCP:确认应答、超时重传、序列号、流量控制...... UDP:校验和(但是直接丢弃))、通信的方式、数据的传输方式、数据传输的速度......
-
使用的场景。
UDP 在应用层实现可靠性
-
UDP的不可靠性主要来自下面三个方面:
-
丢包不重新发送。
-
数据不顺序。
-
错误不纠正。
-
所以,想要在应用层实现 UDP 的可靠性,我们有以下思路(本质就是在应用层模拟 TCP 协议):
-
确认机制:接收方在受到数据包的时候,回复一个 ACK 的确认数据包。
-
重传机制 :发送方设置一个定时器,如果在规定的时间内没有接受到对应的来自接受方的 ACK 就重新发送。
-
序列号 :发送方在数据包中设计一个序列号,保证接收方在应用层能通过序列号对数据进行排序和识别重复的数据包。
-
发送缓冲区(滑动窗口):允许发送方在未收到确认之前连续发送多个数据包,维护重传机制和吞吐量。
注意:
- QUIC 协议 (Quick UDP Internet Connections)就是基于 UDP 并在应用层进行了可靠性、安全性和多路复用的现代传输协议。它是 HTTP/3 的底层基础。
总结
UDP 适用于:极致的速度 、低延迟 、并且能够容忍一定的数据丢失的场景。例如:DNS域名解析、视频会议。
- UDP 并不是一个简单的传输层协议(或者说"丑陋的"),其设计思想体现的是:数据传输效率 和可靠性之间的设计考量!