Skip to content

TCP 和 UDP 有什么区别? ​

  • 标签:网络

🏛 业务架构师 ​

核心差异一句话:TCP 要"对",UDP 要"快"。

  • TCP:面向连接、可靠有序(重传、确认)、流量/拥塞控制、字节流——保证数据完整到达,代价是延迟与开销;
  • UDP:无连接、尽力而为、报文边界保留(不粘包)、开销极小——不保证到达与顺序,换来低延迟与简单。

业务选型按"丢一次的代价"排序:

  • 必须用 TCP:交易支付、订单、API 调用、文件传输、数据库连接——丢一个字节都是资损或错误;
  • UDP 更合适:
    • 音视频通话、直播推流——晚到的数据等于丢数据,宁可丢帧不要卡顿,应用层(RTCP/FEC)自己做弱恢复;
    • 游戏、心跳、设备状态上报——高频小包,单条无价值;
    • DNS 查询——一问一答,超时重发比建连接便宜;
    • 海量 IoT 传感数据——按价值密度选协议,省电省流量;
  • 折中典范 QUIC:UDP 上重建可靠性 + 多路复用 + 0-RTT——HTTP/3 证明"在 UDP 上按需定制"比"忍受 TCP 的历史包袱"更优——这给架构设计的启示是:当通用方案的税太重时,在更原始的地基上按业务重建。

工程提醒:UDP 的报文边界保留看似方便,但大报文分片后丢一片整包全丢——UDP 消息要控制大小(MTU 内)或自己做分包;另外运营商对 UDP 的 QoS 限制(限速)在国内环境真实存在,UDP 业务要带 TCP 降级路径。

一句话:协议选择 = 对"完整性"与"实时性"的优先级表态——业务对"错"和"慢"哪个更敏感,答案就在那里。

🏗 系统架构师 ​

一张表对比,再讲选型:

维度TCPUDP
连接面向连接(握手建状态)无连接
可靠性确认重传、不丢不重尽力而为,可能丢/乱
有序保证字节流顺序不保证
速度/开销头部 20B+,有握手/重传/拥塞开销头部 8B,极轻
传输形态字节流(无边界)数据报(有边界)
拥塞/流控有无
通信模型一对一一对一/多播/广播

选型逻辑(场景驱动):

  • TCP:数据完整性优先——HTTP/WebSocket、RPC、数据库连接、消息队列、文件传输;
  • UDP:实时性优先、可容忍丢包——音视频通话(WebRTC,应用层自己做 FEC/ARQ)、直播(QUIC 之前的方案)、游戏(帧同步)、DNS 查询、心跳/服务发现(小报文一问一答,握手纯属浪费);
  • 混合路线:现代演进是"UDP 上重建可靠性"——QUIC(HTTP/3)用 UDP 绾开内核 TCP 的队头阻塞与升级困难,自己实现流级可靠、0-RTT、连接迁移;这是"TCP 太重、UDP 太裸"的第三条路。

架构启示:可靠性不是免费午餐,TCP 把重传/排序成本内置给所有用户;当你的业务不需要全部保证(或需要定制保证),UDP + 应用层协议是更精准的成本模型。

💻 全栈开发专家 ​

维度TCPUDP
连接面向连接(握手/挥手)无连接,拿起来就发
可靠性确认+重传+校验,不丢不重不乱尽力而为,可能丢/乱/重
有序性字节流严格有序数据报,无序
速度/开销慢(状态 + 头部 20B+)快(头部 8B,无拥塞控制)
通信模式一对一一对一/一对多/广播/组播
边界字节流(要自己处理粘包)报文有边界

场景选择(按业务矛盾定):

  • 要"对":HTTP/文件传输/邮件/数据库连接 → TCP;
  • 要"快"且容忍丢:DNS 查询(小报文,丢了重问)、音视频通话(丢了跳帧,等重传不如丢)、游戏同步、心跳广播 → UDP;
  • 既要快又要部分可靠:QUIC/HTTP3 在 UDP 上自建选择性重传;WebRTC 数据通道。

容易忽略的点(加分):

  1. UDP 不是"不可靠所以没人用"——DHCP、NTP、流媒体都靠它,组播直播能省大量带宽;
  2. TCP 的可靠 ≠ 应用可靠:连接断开、进程崩溃时消息照样丢,应用层确认/幂等永远不能省;
  3. UDP 无拥塞控制,滥用会打爆网络(视频码率自适应就是在补这个),自建可靠 UDP 的难点全在拥塞控制上。

我做过的心跳选型:设备心跳用 UDP(丢了无所谓,下个周期再来),指令下发走 TCP(必须到达)。