Appearance
TCP和UDP区别
看在前面
- [计算机网络常见面试题]((原链已失效 2026-10,内容已在本篇/本库)%80-osi%E4%B8%8Etcpip%E5%90%84%E5%B1%82%E7%9A%84%E7%BB%93%E6%9E%84%E4%B8%8E%E5%8A%9F%E8%83%BD%E9%83%BD%E6%9C%89%E5%93%AA%E4%BA%9B%E5%8D%8F%E8%AE%AE)
一句话答案

UDP 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信)。比如: QQ 语音、 QQ 视频 、直播等等。
TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。 TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的传输服务,这一难以避免增加了许多开销。TCP的可靠体现在TCP在传递数据之前,会有 3 次握手来建立连接。而且在数据传递时,有确认、窗口、重传、拥塞控制机制。在数据传完后,还会断开连接用来节约系统资源。开销如确认、流量控制、计时器以及连接管理。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP 一般用于文件传输、发送和接收邮件、远程登录这类场景。
背景:OSI 与 TCP/IP 分层模型
- OSI 七层(自上而下):应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
- TCP/IP 四层:应用层(对应 OSI 上三层)、传输层、网络层、网络接口层(对应下两层)。
- TCP 与 UDP 都是传输层协议,为应用层进程之间提供端到端的通信(端口号区分进程)。可靠性差异从这一层开始。
OSI 七层 TCP/IP 四层 典型协议
应用层 ─┐
表示层 ├─ 应用层 HTTP/DNS/SMTP/Telnet
会话层 ─┘
传输层 传输层 TCP/UDP
网络层 网络层 IP/ICMP/ARP
数据链路层 ─┐ 网络接口层 以太网
物理层 ─┘核心区别对比表
| 对比维度 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接(传输前需 3 次握手建立连接) | 无连接(发送前无需建立连接) |
| 可靠性 | 可靠交付:确认应答、超时重传、按序到达 | 尽最大努力交付,不保证可靠、不保证有序 |
| 连接对象 | 只能一对一(点对点) | 支持一对一、一对多、多对一、多对多(支持广播/多播) |
| 首部开销 | 首部 20~60 字节(固定部分 20 字节) | 首部仅 8 字节,开销小 |
| 拥塞/流量控制 | 有(滑动窗口流量控制、慢启动等拥塞控制) | 无,网络拥塞不影响发送速率 |
| 传输方式 | 面向字节流(可能出现粘包/拆包问题) | 面向报文(保留报文边界,一次交付一个完整报文) |
| 传输效率 | 慢(握手、确认、重传有开销) | 快,实时性好 |
| 通信边界 | 字节流无边界 | 报文有边界 |
| 典型应用 | HTTP/HTTPS、FTP、SMTP、SSH、Telnet | DNS、DHCP、SNMP、RIP、QQ 语音/视频、直播、游戏 |
TCP 的可靠性是如何实现的
- 校验和:首部+数据计算校验和,检测传输过程中的比特差错,失败则丢弃。
- 序列号 + 确认应答(ACK):数据按序编号,接收方确认;发送方超时未收到 ACK 则重传(超时重传)。
- 快速重传:连续收到 3 个重复 ACK 立即重传丢失报文,不必等超时。
- 滑动窗口(流量控制):接收方通过通告窗口(rwnd)限制发送速率,防止接收缓冲区被打满。
- 拥塞控制:慢启动、拥塞避免、快速恢复,根据网络状况(cwnd)调整发送量,防止网络过载。
- 连接管理:3 次握手建立、4 次挥手释放,保证双方收发能力都确认后才传输。
为什么各自适合这些场景
TCP 适合"数据必须完整正确"的场景
- 文件传输(FTP/HTTP 下载):少一个字节都不行,宁可慢也要可靠、有序。
- 邮件(SMTP/POP3/IMAP)、远程登录(SSH/Telnet):交互式流量要求数据准确且按序。
UDP 适合"快比全更重要"的场景
- 即时通信:QQ 语音/视频、直播——丢一两帧画面无感,重传过来的旧帧已无意义,实时性优先。
- DNS 查询:一问一答报文极小,UDP 无需建连开销,查询快;查失败由应用层重试即可。
- 广播/多播:DHCP、路由协议(RIP/OSPF)需要一对多发送,TCP 点对点模型做不到。
首部结构对比
- UDP 首部固定 8 字节,只有 4 个字段:
源端口(2B) | 目的端口(2B) | 长度(2B) | 校验和(2B)- TCP 首部固定 20 字节,最大 60 字节,字段多得多:
源端口(2B) | 目的端口(2B)
序号 seq(4B) | 确认号 ack(4B)
数据偏移/保留/控制位 SYN/ACK/FIN/RST 等 | 窗口大小(2B)
校验和(2B) | 紧急指针(2B)
[选项(0~40B):MSS、窗口缩放、SACK 等]- 首部长度的差距正是开销差距的直观体现:UDP 8 字节 vs TCP 至少 20 字节。TCP 的 seq/ack/窗口等字段全部服务于可靠性。
面试常见追问
- TCP 一定比 UDP 可靠吗? 应用层基于 UDP 也可以自己实现确认重传(如 QUIC/HTTP3 基于 UDP 却实现了可靠传输)。"可靠"是 TCP 内置了这套机制。
- UDP 如何实现可靠传输? 在应用层模拟 TCP 思路:序列号、确认应答、超时重传、滑动窗口,典型实现 QUIC。
- TCP 粘包/拆包:TCP 是字节流无消息边界,应用层需自定义边界(定长、分隔符、长度字段,如 Netty 的 LengthFieldBasedFrameDecoder)。UDP 报文有边界,不存在粘包。
- 为什么 DNS 用 UDP 又有用 TCP? 查询/响应通常用 UDP(53);区域传送(zone transfer)和响应超过 512 字节(或 EDNS 不支持)时用 TCP。
原链接已失效,2026-10 依据主题重写。