跳到主要内容
约 6 分钟4 张卡

TCP 与 UDP

TCP 提供可靠、有序的字节流。UDP 提供保留消息边界的数据报。本文负责传输语义、可靠性和流量调节。

1. 面试核心​

先记住这几条,再读正文
  • TCP 可靠交付。 TCP 用字节序列号、确认和重传实现可靠有序交付。卡 · TCP 与 UDP 概述
  • UDP 数据报。 UDP 保留数据报边界,头部为 8 字节。
  • 流量与拥塞控制。 TCP 接收窗口 rwnd 保护接收端,拥塞窗口 cwnd 约束网络负载。卡 · 流量控制与拥塞控制
  • 确认与重传。 TCP 按字节累计确认,SACK 可补充报告已收到的区间。卡 · 累计确认与重传
  • 消息边界。 TCP 的一次 send 可被分多次读取,应用需定义消息边界。

2. TCP 与 UDP 概述​

2.1 TCP 与 UDP 的区别​

特性TCPUDP
交付形式有序字节流。保留边界的数据报。
连接状态双方维护连接状态。协议没有握手连接。
恢复机制确认、重传与去重。交由应用协议处理。
发送控制接收窗口和拥塞控制。应用承担速率与拥塞治理。
首部最少 20 字节,带选项时更长。固定 8 字节。

UDP socket 可以调用 connect 指定对端。该调用配置本地 socket,并未增加 UDP 协议握手。

2.2 使用场景​

TCP 适合文件传输和数据库连接等可靠字节流场景。实时音视频可采用 UDP,由应用按时效决定是否重传。UDP 也支持组播使用场景。

DNS 同时支持 UDP 与 TCP。HTTP/3 在 UDP 之上使用 QUIC 提供可靠流。协议选择取决于应用需要的交付语义。

3. TCP​

3.1 传输故障​

IP 数据报会丢失、重复、乱序或损坏。TCP 接收端按序交付已确认有效的字节。连接持续失败时,TCP 最终向应用报告错误。

3.2 TCP 的可靠性设计​

TCP 按字节编号,将数据划分为报文段发送。接收端用序列号处理乱序和重复。校验和用于检测传输错误,但存在漏检概率。

ACK 表示下一个期望字节的位置。发送端保留尚未确认的数据,以便丢失后重传。握手同步初始序列号,详见 TCP 连接。

3.3 TCP 头部​

字段含义
源端口、目标端口与源目标 IP 一起标识连接。
Sequence Number当前段首字节的序号;SYN 使用初始序号。
Acknowledgment Number期望收到的下一个字节序号。
Window接收端通告的可用窗口。
Checksum检测首部和数据的传输错误。
SYN、ACK、FIN、RST标记连接建立、确认、结束和复位。

TCP 头部示例,来源 Wikipedia

3.4 累计确认与重传​

假设先发送字节 1000 至 1499。接收端连续收到后,回复 ACK=1500。若 1500 至 1999 丢失,后续段到达也无法推进累计确认。

SACK 选项可报告已经收到的其他字节区间。发送端据此缩小重传范围。累计 ACK 仍表示连续收到数据的位置。

重传超时 RTO 根据 RTT 和波动估计。超时后,发送端重传并增加等待时间。RFC 5681 的快速重传在收到三个重复 ACK 后触发。RFC 8985 的 RACK 使用基于时间的丢包检测。

TCP ACK 确认对端协议栈接收字节。业务提交结果需要应用响应确认。

3.5 流量控制与拥塞控制​

rwnd 表示接收端还能接收多少数据。cwnd 是发送端估计的网络承载窗口。简化计算中,在途数据受两者较小值约束。可新增发送量还需扣除已在途数据。

接收窗口为 0 时,发送端暂停普通数据发送。零窗口探测用于确认窗口恢复。接收端释放缓冲后,可以重新通告可用窗口。

RFC 5681 的慢启动快速扩大 cwnd。进入拥塞避免后,窗口增长放缓。丢包触发窗口调整和相应恢复。CUBIC、BBR 等算法有各自规则,面试应区分算法版本。

3.6 小包合并与延迟确认​

Nagle 算法在有未确认数据时合并后续小写入。延迟 ACK 则让接收端等待合适时机确认。两者叠加会增加部分请求响应模式的等待。

Linux 的 TCP_NODELAY 可关闭 Nagle。启用后也应关注小包数量和 CPU 开销。消息边界仍由应用协议定义。

4. UDP​

4.1 传输控制开销​

UDP 省去协议握手、确认和重传状态。需要可靠性的应用仍要自行承担相关成本。TCP 长连接则能分摊握手开销。

4.2 UDP 的特点​

UDP 数据报会丢失、重复或乱序。应用可丢弃过期媒体帧,也可实现自己的恢复机制。Linux recv 的用户缓冲区过小时,数据报会被截断。剩余数据不会留给下次 recv 补齐。

4.3 UDP 的头部​

UDP 首部包含源端口、目标端口、长度和校验和。长度包含首部及数据。UDP 校验和检测错误,恢复策略由应用定义。

过大数据报的分片和路径 MTU 处理见 IP。

5. 协议选择​

需要可靠字节流时,可直接使用 TCP。需要保留边界或控制过期数据时,可选择 UDP。最终应比较重传、时延、拥塞治理与部署支持。

6. 常见问题​

6.1 UDP 与 TCP 的性能条件​

UDP 头部更小,也省去协议握手。端到端性能仍受应用恢复逻辑和网络状况影响。长连接中的 TCP 握手成本已被多个请求分摊。

6.2 应用消息边界​

7 · 面试题卡片​

本页题目与参考回答

7.1 TCP 和 UDP 有哪些差异,实际项目中怎样选择​

考察重点

  • 连接、可靠性、有序性和消息边界。
  • 流量控制、拥塞控制与应用层责任。
  • DNS、实时音视频和 QUIC 等实际场景。

相关内容:TCP 与 UDP 概述、协议选择。

参考回答

TCP 提供面向连接的可靠有序字节流。

它通过确认、重传和窗口机制控制传输。UDP 提供保留边界的数据报,应用负责恢复和拥塞治理。

文件传输可直接使用 TCP。实时媒体可使用 UDP,并按时效处理丢包。HTTP/3 使用 UDP 上的 QUIC 提供可靠传输。因此要按交付语义和恢复成本选择协议。

7.2 流量控制与拥塞控制分别限制什么?​

考察重点:rwnd、cwnd 和零窗口探测。

相关内容:流量控制与拥塞控制。

参考回答

流量控制用 rwnd 保护接收端缓冲。

拥塞控制用 cwnd 约束注入网络的数据量。在途数据受两者较小值限制。rwnd 为 0 时,发送端通过探测确认窗口恢复。网络拥塞则由所用算法调整 cwnd。

7.3 累计 ACK、SACK 和超时重传怎样处理丢包?​

考察重点:字节编号、连续确认和恢复路径。

相关内容:累计确认与重传。

参考回答

累计 ACK 指向下一个期望字节。

SACK 补充报告缺口之后已经收到的区间。发送端据此重传缺失数据。确认迟迟未到时,RTO 到期会触发重传。RTO 由 RTT 及其波动估计,并在超时后退避。

7.4 小请求为什么会受 Nagle 和延迟 ACK 影响?​

考察重点:小写入合并与确认等待。

相关内容:小包合并与延迟确认。

参考回答

已有未确认数据时,Nagle 会缓存后续小写入。

收到 ACK 或攒够完整段后,再继续发送。接收端同时延迟 ACK 时,小请求会多等一段时间。TCP_NODELAY 可关闭 Nagle,但会增加小包开销。配置前应观察实际写入模式和延迟。

8. 参考资料​