Skip to content

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
数据链路层 ─┐       网络接口层          以太网
物理层     ─┘

核心区别对比表 ​

对比维度TCPUDP
连接性面向连接(传输前需 3 次握手建立连接)无连接(发送前无需建立连接)
可靠性可靠交付:确认应答、超时重传、按序到达尽最大努力交付,不保证可靠、不保证有序
连接对象只能一对一(点对点)支持一对一、一对多、多对一、多对多(支持广播/多播)
首部开销首部 20~60 字节(固定部分 20 字节)首部仅 8 字节,开销小
拥塞/流量控制有(滑动窗口流量控制、慢启动等拥塞控制)无,网络拥塞不影响发送速率
传输方式面向字节流(可能出现粘包/拆包问题)面向报文(保留报文边界,一次交付一个完整报文)
传输效率慢(握手、确认、重传有开销)快,实时性好
通信边界字节流无边界报文有边界
典型应用HTTP/HTTPS、FTP、SMTP、SSH、TelnetDNS、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 依据主题重写。