面试知识库
进阶

TCP可靠传输机制#

一句话答案#

TCP 靠序列号+确认应答+超时重传+滑动窗口+流量控制+拥塞控制保证可靠传输。

核心要点

流量控制(Flow Control):防止发送方发太快,接收方来不及处理

机制:滑动窗口(Sliding Window)

接收方在 ACK 中告知自己的接收窗口大小(rwnd)
发送方的发送量不超过 min(cwnd, rwnd)

当接收方缓冲区满时(rwnd=0):
  → 发送方停止发送
  → 接收方缓冲区有空间后发送 Window Update 通知
  → 接收方不主动通知时,发送方定时发 1 字节探测包(ZWP,零窗口探测)
plaintext

拥塞控制(Congestion Control):防止发送方将网络打满

四个算法(协同工作):

1. 慢启动(Slow Start)

初始:cwnd = 1 MSS(最大报文段)
每收到一个 ACK:cwnd += 1 MSS(指数增长)
直到 cwnd 达到 ssthresh(慢启动阈值)
plaintext

2. 拥塞避免(Congestion Avoidance)

cwnd > ssthresh 后切换到拥塞避免
每个 RTT:cwnd += 1 MSS(线性增长,更保守)
plaintext

3. 快速重传(Fast Retransmit)

收到 3 个重复 ACK → 不等超时,立即重传丢失的报文段
同时:ssthresh = cwnd/2,cwnd = ssthresh + 3
plaintext

4. 快速恢复(Fast Recovery)

快速重传后进入快速恢复,cwnd 从 ssthresh 开始线性增长
(不回到 1,比超时重传的惩罚轻)

超时重传:ssthresh = cwnd/2,cwnd 重置为 1(最严重的惩罚)
plaintext
面试回答(2分钟版)

TCP 保证可靠传输依赖六个核心机制。第一是序列号,TCP 给每个字节编号,接收方可以按序重组数据。第二是确认应答,接收方通过 ACK 告知发送方已收到哪些数据,ACK 号表示期望收到的下一个字节。第三是超时重传,发送方发出数据后启动定时器,超时未收到 ACK 就重发,超时时间根据 RTT 动态计算并做指数退避。还有快速重传,收到 3 个重复 ACK 后不等超时直接重传丢失的报文。第四是滑动窗口,允许发送方在收到 ACK 之前连续发送多个报文,大幅提升吞吐量。第五是流量控制,接收方在 ACK 中携带接收窗口大小 rwnd,发送方据此控制发送速率,防止接收方缓冲区溢出。当 rwnd 为 0 时发送方暂停发送并定期发送零窗口探测包。第六是拥塞控制,发送方维护拥塞窗口 cwnd,通过慢启动、拥塞避免、快重传和快恢复四个算法感知和适应网络状况,实际发送窗口取 cwnd 和 rwnd 的最小值。流量控制保护接收端,拥塞控制保护网络,两者协同工作。

追问与易错

追问方向:

  • “超时重传的超时时间怎么确定?”→ 根据 RTT 动态计算 RTO(Retransmission Timeout),用 Jacobson 算法平滑 RTT 估算,超时后做指数退避(RTO 翻倍)
  • “滑动窗口和拥塞窗口的关系?”→ 滑动窗口是接收方通告的接收能力(rwnd),拥塞窗口是发送方感知的网络承载力(cwnd),实际发送量 = min(rwnd, cwnd)
  • “流量控制和拥塞控制的区别?”→ 流量控制是端到端的,防止发送方压垮接收方(rwnd);拥塞控制是面向网络的,防止发送方压垮网络链路(cwnd)

易错点:

  • ❌ TCP 重传就是固定间隔重发——有指数退避
  • ❌ 流量控制和拥塞控制一样——前者端到端后者网络