📖 UDP 和 TCP 的对比
🎯 课程摘要:本节课对 TCP/IP 体系结构运输层提供的两个协议 UDP 和 TCP 进行全面对比,从连接性、通信方式、报文处理方式、可靠性、首部复杂度等维度分析二者差异,并说明各自适用的应用场景。
📝 详细笔记
1. 两个运输层协议概述
TCP/IP 体系结构的运输层为应用层提供了两个不同的运输层协议:UDP 和 TCP,二者使用频率仅次于网际层的 IP 协议。
| 协议 | 全称 | 提供的服务 |
|---|---|---|
| UDP | 用户数据报协议(User Datagram Protocol) | 无连接的、不可靠的数据传输服务 |
| TCP | 传输控制协议(Transmission Control Protocol) | 面向连接的、可靠的数据传输服务 |
- UDP 非常简单,要点一节课即可介绍完成;TCP 非常复杂,需后续课程详细介绍。
- ⚠️ 重点/考点:这里所谓的"连接"是指逻辑连接关系,而不是物理连接。
2. 连接性对比
UDP(无连接)
- 传送数据之前不需要建立连接,可以随时发送数据。
TCP(面向连接)
- 传送数据之前必须使用三报文握手建立 TCP 连接。
- 连接建立成功后,才能基于已建立好的 TCP 连接进行数据传输。
- 数据传输结束后,必须使用四报文挥手释放 TCP 连接。
- 三报文握手和四报文挥手属于 TCP 的连接管理,过程较复杂。
3. 对单播、多播、广播的支持
| 通信方式 | UDP | TCP |
|---|---|---|
| 单播(一对一) | ✅ 支持 | ✅ 支持 |
| 多播(一对多) | ✅ 支持 | ❌ 不支持 |
| 广播(一对全) | ✅ 支持 | ❌ 不支持 |
- UDP 支持一对一、一对多以及一对全的通信。
- TCP 通信双方之间建立连接后就像有一条可靠的通信信道,仅支持单播(一对一)通信。
4. 对应用层报文的处理方式
UDP:面向报文
- 发送方 UDP 直接给应用层报文添加一个 UDP 首部,使之成为 UDP 用户数据报后发送。
- 接收方 UDP 去掉 UDP 首部,将应用层报文向上交付给应用进程。
- UDP 对应用进程交付下来的报文既不合并也不拆分,保留这些报文的边界。
- UDP 是面向应用报文的。
TCP:面向字节流
发送方 TCP 把应用进程交付下来的应用报文仅仅看作一连串无结构的字节流,TCP 并不知道这些待传输字节流的含义。
TCP 将字节编号并存储在发送缓存中,根据发送策略从发送缓存中提取一定数量的字节构建 TCP 报文段并发送。
接收方 TCP 从 TCP 报文段中取出数据载荷存入接收缓存,再将缓存中的一些字节向上交付给应用进程。
TCP 不保证接收方应用进程接收的数据块与发送方应用进程发送的应用层报文之间有对应大小的关系(例如发送方发 10 个报文,接收方可能只用 4 个数据块交付),但接收方收到的字节流必须和发送方发出的字节流完全一样。
TCP 是面向字节流的,这正是 TCP 实现可靠传输、流量控制以及拥塞控制的基础。
⚠️ 重点/考点:
- TCP 基于 TCP 连接的两端可同时进行 TCP 报文段的发送和接收,即全双工通信。
- 实际中一个 TCP 报文段常常包含上千个字节。
5. 数据传输可靠性对比
UDP(不可靠)
- 网际层向其上层提供无连接、不可靠的数据传输服务,UDP 向上层提供的也是无连接、不可靠的服务。
- 若 UDP 用户数据报传输过程中产生误码,接收方 UDP 可通过首部中检验和字段检查出误码,但仅丢弃该报文,其他什么也不做。
- 若 UDP 用户数据报被路由器丢弃(路由器太忙或 IP 数据报首部出现误码),发送方 UDP 也不做任何处理。
- 适用场景:实时应用,如 IP 电话、视频会议等。
TCP(可靠)
- 尽管 IP 协议提供无连接、不可靠服务(IP 数据报可能丢失或误码),但只要运输层使用 TCP,收发双方就可基于 TCP 连接的可靠信道进行数据传输。
- 不会出现误码、丢失、失序和重复等传输差错。
- 适用场景:要求可靠传输且对实时性要求不高的应用,如文件传输、电子邮件等。
6. 首部对比
| 对比项 | UDP 首部 | TCP 首部 |
|---|---|---|
| 构成 | 首部 + 数据载荷 | 首部 + 数据载荷 |
| 字段数 | 4 个字段,每个 2 字节 | 字段多,较复杂 |
| 最小长度 | 8 字节(固定) | 20 字节(固定部分) |
| 最大长度 | 8 字节(固定) | 60 字节(20 固定 + 40 选项) |
| 复杂原因 | 仅添加用于区分应用进程的端口,不提供可靠传输 | 需实现可靠传输、流量控制、拥塞控制等服务 |
7. UDP 与 TCP 全面对比总结
| 对比项 | UDP | TCP |
|---|---|---|
| 全称 | 用户数据报协议 | 传输控制协议 |
| 连接性 | 无连接 | 面向连接(三报文握手建立,四报文挥手释放) |
| 通信方式 | 支持单播、多播、广播 | 仅支持单播 |
| 双工性 | — | 全双工通信 |
| 报文处理 | 面向报文(不合并不拆分,保留边界) | 面向字节流(无结构字节流) |
| 可靠性 | 不可靠(误码/丢失仅丢弃,不处理) | 可靠(无误码、丢失、失序、重复) |
| 首部大小 | 8 字节(固定) | 20~60 字节 |
| 流量控制 | 无 | 有 |
| 拥塞控制 | 无 | 有 |
| 适用场景 | 实时应用(IP 电话、视频会议) | 要求可靠传输、实时性要求不高(文件传输、电子邮件) |
💡 核心总结
- UDP 无连接、不可靠、面向报文、首部仅 8 字节、支持单播/多播/广播,适合实时应用。
- TCP 面向连接、可靠、面向字节流、首部 20~60 字节、仅支持单播全双工,适合要求可靠传输的应用。
- TCP 面向字节流是实现可靠传输、流量控制、拥塞控制的基础。
❓ 课后思考 / 经典考题
- UDP 和 TCP 在处理应用层报文时有什么本质区别?这对实现可靠传输有何影响?
- 为什么说 TCP 仅支持单播通信,而 UDP 可支持多播和广播?
- TCP 的"连接"是物理连接还是逻辑连接?三报文握手和四报文挥手分别用于什么?
- 为什么实时应用(如 IP 电话、视频会议)通常选择 UDP 而非 TCP?
- TCP 首部最小长度和最大长度分别是多少?为什么 TCP 首部比 UDP 首部复杂得多?