TCP和UDP是什么、彼此关系、各自机制细节、典型场景

224 阅读5分钟

它们是什么(在哪一层)

  • TCP(Transmission Control Protocol) :传输层的面向连接、可靠、按序的字节流协议。适合“必须一字不差”的场景(网页、文件、数据库…)。

  • UDP(User Datagram Protocol) :传输层的无连接、尽力而为的数据报协议。适合“低时延、轻量、不必严格可靠”的场景(实时音视频、游戏状态、DNS…)。

二者都位于传输层(OSI 第4层),都用端口号在同一台主机上复用/区分不同的应用进程,下面都跑在 IP 之上(常见 IPv4/IPv6)。


它们的关系

  • 同层兄弟:都把“端到端”的数据送给对方应用,但服务模型不同:TCP=可靠字节流;UDP=不保证可靠的消息(数据报)。
  • 都靠 IP 转发:真正的路由、分片/组装发生在网络层(IP)。
  • 都用端口号:套接字五元组(源/目的IP、源/目的端口、协议) 唯一标识连接(TCP)或会话(UDP)。
  • 都带校验和:UDP 的校验和 IPv6 必须,IPv4 可为 0(表示不用);TCP 必须。

TCP 细节(如何做到“可靠按序”)

  1. 连接 & 关闭

    • 三次握手:SYN → SYN+ACK → ACK 建立连接,协商初始序号等。
    • 四次挥手:双方各自 FIN/ACK 关闭;异常断开用 RST。
  2. 序号 & 确认 & 重传

    • 每个字节都有序号;对端返回 ACK 告知已收到的最大连续序号。
    • 重传:超时重传(RTO 基于 RTT 估计)、快速重传(三次重复 ACK 触发)。
  3. 流量控制(Flow Control)

    • 滑动窗口 + 接收窗口 rwnd:避免把对端缓存冲爆;对端告知还能收多少。
  4. 拥塞控制(Congestion Control)

    • 慢启动、拥塞避免、快速重传/恢复;拥塞窗口 cwnd 决定“在网里飞行的数据”上限。
    • 现代实现(CUBIC/BBR…)各有策略以平衡吞吐与时延。
  5. 有序交付 & 乱序重排

    • 内核将乱序片段缓存、按序交付应用(Head-of-Line 阻塞:前面少一块,后面的都等)。
  6. 其他机制

    • MSS/MTU 协商与分片避免;Nagle(合小包)与延迟 ACK优化;KeepAlive 探活等。

结果:可靠、按序、拥塞友好,但:握手有开销、丢包会触发重传导致时延跃增、HoL 阻塞可能放大时延抖动。


UDP 细节(为什么“轻”)

  1. 无连接、无握手:直接发包,最小报头 8 字节(源/目的端口、长度、校验和)。

  2. 不保证:到达、不重复、按序 —— 这些都交给应用层按需实现(或干脆不要)。

  3. 消息边界:应用写入一次就是一个数据报,接收端一次 recvfrom() 读取一个完整报文(超出接收缓冲会被丢弃)。

  4. 路径 MTU:单个 UDP 报文不宜超过 PMTU(常见以 1200~1400B 为经验值),否则可能被 IP 分片,丢一个分片就丢整报文。

  5. 常见增强(在应用/库里实现):

    • RTP/RTCP(实时音视频时钟、序号、抖动估计、统计反馈);

    • FEC/ARQ 前向纠错或选择性重传;

    • DTLS/QUIC:在 UDP 上实现的安全/可靠(QUIC 自带拥塞控制与按流复用,解决 TCP HoL)。

结果:时延小、开销小;可靠性、拥塞友好与安全要靠上层协议/应用补齐;穿透 NAT 相对容易(打洞)。


典型使用场景

  • TCP:HTTP(S)、WebSocket(基于 TCP 的持久连接)、SSH、FTP、数据库连接、邮件协议等。
  • UDP:DNS、DHCP、SNMP、实时语音视频(RTP/RTCP、WebRTC 底层)、在线游戏状态同步、流媒体直播(部分协议)、QUIC(HTTP/3)。

选择建议(怎么选)

  • 不能丢、必须按序、吞吐优先” → TCP(或 QUIC:想要低时延 + 可靠可以考虑 QUIC/HTTP3)。
  • 低时延、偶尔丢也行、自己能容错/补偿**” → UDP(配 RTP/ARQ/FEC/拥塞控制/加密)。
  • 防火墙/NAT 友好”:TCP 443 几乎必通;UDP 有时被限,但 QUIC(UDP/443) 越来越通行。

安全与攻击面

  • TCP:配 TLS(HTTPS、TLS over TCP);易遭 SYN flood(需 SYN cookies 等防护)。
  • UDP:无握手、易被放大型 DDoS(利用可伪造源地址的反射协议);安全常用 DTLS/QUIC

报头与开销

  • TCP 头:最小 20 字节(+ 可选项如 SACK、时间戳等);
  • UDP 头:固定 8 字节;
  • IP 头:IPv4 20B、IPv6 40B(未含扩展);实际链路还有以太网等二层开销。

对比速查表

维度TCPUDP
连接三次握手/四次挥手无连接
可靠性有:序号/ACK/重传无(需上层自建)
有序性有(乱序重排)无(应用自行处理)
流量/拥塞控制有(rwnd/cwnd/算法)无(应用/协议自建或放任)
时延较高(握手、重传、HoL)低(无握手、无重排)
报头开销≥20B(+可选)8B
适配 NAT/防火墙TCP/443 最通行UDP/443 趋好(QUIC),但部分网络受限
典型场景Web、文件、DB、邮件DNS、音视频、游戏、QUIC/HTTP3

小误区澄清

  • “UDP 不可靠=一定丢” ❌:只是“不保证”,真实网络质量 + 上层容错决定体验。
  • “TCP 一定更快” ❌:在低时延、允许少量丢的实时场景,UDP 往往更好;而在大文件传输、必须可靠时 TCP/QUIC 更优。
  • “UDP 没拥塞控制就更猛” ❌:没有控制会压垮网络且自身丢包更多;现代 UDP 协议(QUIC/WebRTC)都有拥塞控制。