TCP 和 UDP 的区别是什么?
一则或许对你有用的小广告
欢迎 加入小哈的星球 ,你将获得: 专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新开坑项目: 《Spring AI 项目实战(问答机器人、RAG 增强检索、联网搜索)》 正在持续爆肝中,基于
Spring AI + Spring Boot3.x + JDK 21..., 点击查看; - 《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot3.x + JDK 17..., 点击查看项目介绍; 演示链接: http://116.62.199.48:7070/; - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
面试考察点
-
基础掌握度:面试官不仅仅是想知道 "TCP 可靠、UDP 不可靠" 这种浅层答案,更是想知道你是否理解两者在连接方式、传输机制、头部开销等方面的本质区别,以及这些区别带来的实际影响。
-
场景选择能力:考察你是否清楚什么场景该用 TCP、什么场景该用 UDP,能否根据业务需求(实时性 vs 可靠性)做出正确的技术选型。
-
原理理解深度:如果你能从 OSI 模型、首部结构、拥塞控制、流量控制等维度深入分析,说明你不只是 "背八股文",而是真正理解了传输层协议的设计哲学。
核心答案
TCP 和 UDP 是传输层最重要的两个协议,核心区别可以概括为 "一个面向连接,一个无连接":
| 对比维度 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接(三次握手) | 无连接(直接发) |
| 可靠性 | 可靠传输(确认、重传) | 不可靠(发完就不管了) |
| 有序性 | 有序(序列号保证) | 无序(先发可能后到) |
| 速度 | 较慢(握手、确认开销) | 快(无连接、无确认) |
| 头部开销 | 20 字节 | 8 字节 |
| 流量/拥塞控制 | 有 | 无 |
| 传输方式 | 字节流(无边界) | 数据报(有边界) |
| 应用场景 | 文件传输、网页浏览 | 视频直播、DNS、游戏 |
一句话总结:TCP 是 "打电话"(先拨号建立连接,确保对方听到),UDP 是 "广播"(对着话筒喊,听没听到不管)。
深度解析
一、连接性:三次握手 vs 无连接
TCP 和 UDP 最本质的区别在于 是否需要建立连接:
TCP 三次握手的目的:
-
确认双方收发能力:第一次确认客户端能发,第二次确认服务端能收能发,第三次确认客户端能收。
-
同步序列号:双方交换初始序列号(ISN),作为后续数据传输的基准。
-
防止历史连接:避免网络中滞留的旧 SYN 包造成错误连接。
三次握手的代价:建立连接需要 1.5 个 RTT(往返时间),高延迟网络(如跨洋)首包延迟明显。
UDP 的特点:
-
无连接:不需要建立连接,想发就发。
-
无状态:发送方不知道数据是否到达,接收方也不知道是谁发的(除非数据里带上)。
-
速度快:省去握手开销,首包延迟极低。
代价:不保证数据到达、不保证数据有序、不保证数据完整。
二、可靠性:全套保障 vs 裸奔
TCP 提供了完整的可靠性保障机制,而 UDP 基本上是 "裸奔":
三、首部开销:20 字节 vs 8 字节
TCP 的首部比 UDP 复杂得多,因为它要承载各种控制信息:
四、传输方式:字节流 vs 数据报
这是一个容易被忽视但很重要的区别:
五、应用场景对比
理解了区别,选择就清晰了:
TCP 适用场景(需要高可靠性):
| 场景 | 为什么选 TCP |
|---|---|
| HTTP/HTTPS | 网页内容必须完整 |
| FTP 文件传输 | 文件不能丢一个字节 |
| SMTP 邮件 | 邮件内容必须准确 |
| SSH 远程登录 | 命令和输出必须完整 |
| 数据库连接 | SQL 语句和结果必须准确 |
特点:数据比速度更重要,宁可慢也不能错。
UDP 适用场景(需要高实时性、可容忍丢包):
| 场景 | 为什么选 UDP |
|---|---|
| DNS 查询 | 查询包小,快速响应更重要 |
| 视频直播 | 丢几帧没关系,延迟要低 |
| 语音通话 | 卡顿比延迟更难接受 |
| 在线游戏 | 实时性第一,丢包可以预测插值 |
| IoT 传感器 | 数据量大,偶尔丢一个无所谓 |
| QUIC/HTTP/3 | UDP + 应用层可靠性 = 两全其美 |
特点:速度比数据更重要,宁可丢也不能等。
六、QUIC:UDP 的逆袭
现代协议 QUIC(HTTP/3 的底层)展示了如何在 UDP 之上实现 TCP 的可靠性:
面试高频追问
-
追问一:什么情况下用 TCP,什么情况下用 UDP?
- 需要可靠性(数据不能丢、不能错)用 TCP,如文件传输、网页浏览;需要实时性(宁可丢也不能等)用 UDP,如视频直播、在线游戏。现代趋势是 UDP + 应用层可靠性(如 QUIC)。
-
追问二:TCP 为什么需要三次握手?两次不行吗?
- 两次握手无法确认客户端的接收能力,也无法防止历史连接(网络中滞留的旧 SYN 包)。三次握手确保双方都能收发,并同步初始序列号。
-
追问三:UDP 可以实现可靠传输吗?怎么做?
- 可以,在应用层实现 ACK 确认、超时重传、序列号等机制。QUIC 协议就是这样做的。代价是增加开发复杂度,但可以获得更好的性能和灵活性。
-
追问四:什么是 TCP 粘包?怎么解决?
- TCP 是字节流,没有消息边界,多个小包可能被合并发送(粘包)或大包被拆分(拆包)。解决方案:固定长度、分隔符、长度字段 + 数据体。
常见面试变体
- 变体一:"为什么视频直播用 UDP 而不是 TCP?"
- 变体二:"TCP 和 UDP 可以共用一个端口吗?"
- 变体三:"HTTP/3 为什么基于 UDP 而不是 TCP?"
- 变体四:"如何让 UDP 变得可靠?"
记忆口诀
TCP:面向连接、可靠有序、三次握手、流量拥塞控制、字节流(粘包)、20 字节首部。
UDP:无连接、不可靠、无序、无控制、数据报(有边界)、8 字节首部。
选型原则:要可靠选 TCP,要速度选 UDP,要兼得用 QUIC。
总结
TCP 是 "靠谱管家"——面向连接、可靠传输、有序到达、流量拥塞控制,适合文件传输、网页浏览等对数据准确性要求高的场景;UDP 是 "莽撞快递"——无连接、不可靠、无序、无控制,但速度快、开销小,适合视频直播、在线游戏等对实时性要求高的场景。现代趋势是 UDP + 应用层可靠性(如 QUIC),兼顾性能与可靠。