飞翔飞翔
主页
  • 计算机基础

    • TCP协议
  • 数据库

    • SQL教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP协议
  • 数据库

    • SQL教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • TCP协议

    • TCP 简介与分层模型
    • TCP 连接管理
    • TCP 可靠传输机制
    • TCP 粘包与拆包
    • TCP 拥塞控制
    • TCP 头部字段详解
    • TCP 与 UDP 对比
    • TCP Socket 编程实践
    • TCP 抓包实战
    • TCP 安全与面试综合题

TCP 与 UDP 对比

传输层的两大协议对决 — 什么时候选 TCP,什么时候选 UDP?


1. UDP 简介

UDP(User Datagram Protocol,用户数据报协议) 是 TCP/IP 协议族中另一个重要的传输层协议。与 TCP 的"重型可靠"相反,UDP 追求轻量、快速、无连接。

UDP 头部(仅 8 字节)

    0      7 8     15 16    23 24    31
   +--------+--------+--------+--------+
   |     源端口      |    目的端口      |
   +--------+--------+--------+--------+
   |     长度        |     校验和       |
   +--------+--------+--------+--------+
   |             数据...               |
   +-----------------------------------+

极简设计——没有序列号、确认号、窗口、标志位。UDP 只做了两件事:

  1. 区分不同应用(端口号)
  2. 检测传输错误(校验和,可选)

2. TCP vs UDP 核心对比

维度TCPUDP
连接面向连接(三次握手)无连接,直接发送
可靠性可靠(确认+重传)不可靠,尽力而为
顺序保证有序不保证,可能乱序
流量控制滑动窗口无
拥塞控制有(慢启动/拥塞避免等)无
头部开销20-60 字节8 字节
传输模式字节流数据报(保留消息边界)
广播/多播不支持支持
速度较慢(有连接建立和确认开销)较快
双工全双工全双工

形象比喻

  • TCP:打电话。先拨号建立连接,对方确认接通后再通话,保证每句话都能被对方听到且顺序正确。
  • UDP:寄明信片。直接投递,不确认对方是否收到,可能丢也可能乱序,但速度快。

3. 适用场景分析

3.1 TCP 适用场景

一句话:数据完整性 > 实时性的场景。

场景原因
网页浏览 (HTTP/HTTPS)页面内容一个字都不能错
文件传输 (FTP/SFTP)文件必须完整
电子邮件 (SMTP/IMAP)邮件内容不能丢
数据库查询查询结果必须可靠
远程登录 (SSH/Telnet)每个字符都要正确到达
API 调用 (REST/gRPC)请求和响应必须可靠

3.2 UDP 适用场景

一句话:实时性 > 数据完整性 或 可以容忍少量丢包的场景。

场景原因
视频直播/会议丢几帧比卡顿等待好
VoIP 语音通话实时性要求高,少量丢包听不清但可接受
在线游戏延迟比丢包更致命(位置更新丢了可以靠下一包弥补)
DNS 查询请求简单,超时重试即可,不需要 TCP 连接开销
DHCP广播发现服务器,无连接更合适
IoT 传感器数据设备资源有限,少量丢包可接受
实时监控视频流延迟要求高的视频传输

4. 编程接口差异

TCP Socket 编程典型流程

服务器端                          客户端
socket()                         socket()
   |                                |
bind()                               |
   |                                |
listen()                             |
   |                                |
accept() ←──────── 三次握手 ──────→ connect()
   |                                |
read()  ←────────  数据  ─────────→ write()
write() ─────────→  数据  ←──────── read()
   |                                |
close() ←──────── 四次挥手 ──────→ close()

UDP Socket 编程典型流程

服务器端                          客户端
socket()                         socket()
   |                                |
bind()                               |
   |                                |
recvfrom() ←────── 数据 ───────── sendto()
   |                                |
sendto()   ──────→ 数据 ←──────── recvfrom()
   |                                |
close()                           close()

关键区别:

  • TCP 需要 listen/accept/connect 建立连接,UDP 直接 sendto/recvfrom
  • TCP 用 read/write(字节流),UDP 用 sendto/recvfrom(保留消息边界)
  • TCP 一个连接一个 socket,UDP 一个 socket 可以和多个对端通信

5. QUIC:新一代的融合方案

Google 开发的 QUIC 协议(Quick UDP Internet Connections,已标准化为 RFC 9000)在 UDP 之上实现了类似 TCP 的可靠传输,并加入 TLS 1.3 加密。

维度TCP + TLS 1.3QUIC (UDP)
握手延迟TCP 握手 + TLS 握手(2-3 RTT)0-1 RTT(合并了传输和加密握手)
队头阻塞TCP 层存在(一个流丢包阻塞所有流)消除了(各流独立)
连接迁移不支持(换 IP 需重建连接)支持(通过连接 ID 而非 IP 标识)
部署内核实现,更新困难用户态实现,灵活迭代

HTTP/3 基于 QUIC,正在逐步替代 HTTP/2(基于 TCP)。


6. 选择建议

你的数据需要 100% 可靠吗?
   ├── 是 → 用 TCP
   └── 否 →
       实时性比完整性更重要吗?
         ├── 是 → 用 UDP(或 QUIC)
         └── 否 → 还是用 TCP

经验法则:

  • 传输文件、网页、邮件、数据库 → TCP
  • 音视频通话、直播、游戏、DNS → UDP
  • 既想要可靠又想要低延迟 → QUIC (HTTP/3)

本篇要点

  • TCP 面向连接、可靠、有序、有流量/拥塞控制、字节流;UDP 无连接、不可靠、无序、无控制、保留消息边界
  • UDP 头部仅 8 字节(源端口+目的端口+长度+校验和),追求轻量低延迟
  • TCP 适用:数据完整性优先(网页、文件、邮件、数据库);UDP 适用:实时性优先(音视频、游戏、DNS)
  • TCP 队头阻塞:一个段丢失会阻塞后续所有已到达段的交付,HTTP/2 多路复用会放大这个问题
  • QUIC 基于 UDP 实现可靠传输 + TLS 1.3,优势:0-1 RTT 握手、消除队头阻塞、支持连接迁移
  • 选择原则:需要可靠选 TCP,需要低延迟且能容忍丢包选 UDP,两者都要选 QUIC
上一页
TCP 头部字段详解
下一页
TCP Socket 编程实践