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/

面试考察点

  1. 基础掌握度:面试官不仅仅是想知道 "TCP 可靠、UDP 不可靠" 这种浅层答案,更是想知道你是否理解两者在连接方式、传输机制、头部开销等方面的本质区别,以及这些区别带来的实际影响。

  2. 场景选择能力:考察你是否清楚什么场景该用 TCP、什么场景该用 UDP,能否根据业务需求(实时性 vs 可靠性)做出正确的技术选型。

  3. 原理理解深度:如果你能从 OSI 模型、首部结构、拥塞控制、流量控制等维度深入分析,说明你不只是 "背八股文",而是真正理解了传输层协议的设计哲学。

核心答案

TCP 和 UDP 是传输层最重要的两个协议,核心区别可以概括为 "一个面向连接,一个无连接"

对比维度TCPUDP
连接性面向连接(三次握手)无连接(直接发)
可靠性可靠传输(确认、重传)不可靠(发完就不管了)
有序性有序(序列号保证)无序(先发可能后到)
速度较慢(握手、确认开销)快(无连接、无确认)
头部开销20 字节8 字节
流量/拥塞控制
传输方式字节流(无边界)数据报(有边界)
应用场景文件传输、网页浏览视频直播、DNS、游戏

一句话总结:TCP 是 "打电话"(先拨号建立连接,确保对方听到),UDP 是 "广播"(对着话筒喊,听没听到不管)。

深度解析

一、连接性:三次握手 vs 无连接

TCP 和 UDP 最本质的区别在于 是否需要建立连接

TCP 三次握手的目的:

  1. 确认双方收发能力:第一次确认客户端能发,第二次确认服务端能收能发,第三次确认客户端能收。

  2. 同步序列号:双方交换初始序列号(ISN),作为后续数据传输的基准。

  3. 防止历史连接:避免网络中滞留的旧 SYN 包造成错误连接。

三次握手的代价:建立连接需要 1.5 个 RTT(往返时间),高延迟网络(如跨洋)首包延迟明显。

UDP 的特点:

  1. 无连接:不需要建立连接,想发就发。

  2. 无状态:发送方不知道数据是否到达,接收方也不知道是谁发的(除非数据里带上)。

  3. 速度快:省去握手开销,首包延迟极低。

代价:不保证数据到达、不保证数据有序、不保证数据完整。

二、可靠性:全套保障 vs 裸奔

TCP 提供了完整的可靠性保障机制,而 UDP 基本上是 "裸奔":

三、首部开销:20 字节 vs 8 字节

TCP 的首部比 UDP 复杂得多,因为它要承载各种控制信息:

四、传输方式:字节流 vs 数据报

这是一个容易被忽视但很重要的区别:

五、应用场景对比

理解了区别,选择就清晰了:

TCP 适用场景(需要高可靠性):

场景为什么选 TCP
HTTP/HTTPS网页内容必须完整
FTP 文件传输文件不能丢一个字节
SMTP 邮件邮件内容必须准确
SSH 远程登录命令和输出必须完整
数据库连接SQL 语句和结果必须准确

特点:数据比速度更重要,宁可慢也不能错。

UDP 适用场景(需要高实时性、可容忍丢包):

场景为什么选 UDP
DNS 查询查询包小,快速响应更重要
视频直播丢几帧没关系,延迟要低
语音通话卡顿比延迟更难接受
在线游戏实时性第一,丢包可以预测插值
IoT 传感器数据量大,偶尔丢一个无所谓
QUIC/HTTP/3UDP + 应用层可靠性 = 两全其美

特点:速度比数据更重要,宁可丢也不能等。

六、QUIC:UDP 的逆袭

现代协议 QUIC(HTTP/3 的底层)展示了如何在 UDP 之上实现 TCP 的可靠性:

面试高频追问

  1. 追问一:什么情况下用 TCP,什么情况下用 UDP?

    • 需要可靠性(数据不能丢、不能错)用 TCP,如文件传输、网页浏览;需要实时性(宁可丢也不能等)用 UDP,如视频直播、在线游戏。现代趋势是 UDP + 应用层可靠性(如 QUIC)。
  2. 追问二:TCP 为什么需要三次握手?两次不行吗?

    • 两次握手无法确认客户端的接收能力,也无法防止历史连接(网络中滞留的旧 SYN 包)。三次握手确保双方都能收发,并同步初始序列号。
  3. 追问三:UDP 可以实现可靠传输吗?怎么做?

    • 可以,在应用层实现 ACK 确认、超时重传、序列号等机制。QUIC 协议就是这样做的。代价是增加开发复杂度,但可以获得更好的性能和灵活性。
  4. 追问四:什么是 TCP 粘包?怎么解决?

    • TCP 是字节流,没有消息边界,多个小包可能被合并发送(粘包)或大包被拆分(拆包)。解决方案:固定长度、分隔符、长度字段 + 数据体。

常见面试变体

  • 变体一:"为什么视频直播用 UDP 而不是 TCP?"
  • 变体二:"TCP 和 UDP 可以共用一个端口吗?"
  • 变体三:"HTTP/3 为什么基于 UDP 而不是 TCP?"
  • 变体四:"如何让 UDP 变得可靠?"

记忆口诀

TCP:面向连接、可靠有序、三次握手、流量拥塞控制、字节流(粘包)、20 字节首部。

UDP:无连接、不可靠、无序、无控制、数据报(有边界)、8 字节首部。

选型原则:要可靠选 TCP,要速度选 UDP,要兼得用 QUIC。

总结

TCP 是 "靠谱管家"——面向连接、可靠传输、有序到达、流量拥塞控制,适合文件传输、网页浏览等对数据准确性要求高的场景;UDP 是 "莽撞快递"——无连接、不可靠、无序、无控制,但速度快、开销小,适合视频直播、在线游戏等对实时性要求高的场景。现代趋势是 UDP + 应用层可靠性(如 QUIC),兼顾性能与可靠。