TCP(传输控制协议)是计算机网络传输层最核心的协议之一,其核心价值在于在不可靠的 IP 网络之上,提供面向连接、可靠有序的字节流传输服务。支撑 TCP 可靠性与传输效率的,正是流量控制、拥塞控制、超时重传时间选择、基于滑动窗口的可靠传输这四大核心机制。本文将从零开始,逐一拆解每个机制的原理、规则、算法与典型考题,帮助零基础读者彻底掌握 TCP 的核心运作逻辑。
一、TCP 流量控制机制

1.1 核心定义
流量控制的本质是限制发送方的发送速率,确保接收方有足够的缓存空间接收数据,避免因接收不及时导致数据丢失。一般来说,我们总是希望数据传输越快越好,但发送速率超过接收方的处理能力时,会造成数据溢出、丢包,反而降低传输效率。
TCP 的流量控制基于滑动窗口机制实现,是接收方对发送方的直接速率约束。
1.2 基于滑动窗口的流量控制过程

-
连接初始化:TCP 连接建立时,接收方会在报文段首部的窗口字段中告知自己的接收窗口(rwnd)大小,发送方据此将自己的发送窗口设置为相同值。
-
动态调整:接收方在返回确认报文段时,会根据自身缓存的剩余空间,动态调整窗口字段的值;发送方收到确认后,同步向前滑动发送窗口,并调整发送窗口的大小,实现流量控制。
-
零窗口状态:接收方可以将窗口值调整为 0,此时发送方不能再发送新的普通数据报文段。
重点标注 :发送窗口的大小由接收方的接收窗口直接决定(不考虑拥塞时),接收方通过窗口字段实现对发送方的反向流量控制。
1.3 零窗口死锁与解决方案
问题描述
当接收方发送零窗口通知后,接收方缓存释放后又向发送方发送非零窗口的报文段,但该报文段在传输中丢失。此时发送方一直等待非零窗口通知,接收方一直等待数据,双方互相等待形成死锁。
解决方案:持续计时器
TCP 为每个连接设置持续计时器:
-
只要发送方收到对方的零窗口通知,就启动持续计时器。
-
计时器超时后,发送方发送一个零窗口探测报文段(仅携带 1 字节数据)。
-
接收方在确认该探测报文时,返回自己当前的接收窗口值:
-
若窗口仍为 0,发送方重新启动持续计时器;
-
若窗口不为 0,死锁局面被打破,传输恢复。
-
补充规定:即使接收窗口为 0,接收方也必须接收三类报文:零窗口探测报文段、确认报文段、携带紧急数据的报文段。

1.4 经典例题解析

答案:A
解析
-
主机甲初始发送窗口 4000 字节,发送 2000 字节(两个报文段)后,收到对第一个报文段(1000 字节)的确认,发送窗口后沿向前滑动 1000 字节。
-
接收方通知接收窗口为 2000 字节,因此主机甲将发送窗口调整为 2000 字节。
-
此时主机甲已发送但未收到确认的数据还有 1000 字节(第二个报文段),因此剩余可发送字节数 = 2000 - 1000 = 1000 字节。
二、TCP 拥塞控制机制
2.1 拥塞与拥塞控制的意义
拥塞指在某段时间内,网络中某一资源的需求超过了该资源所能提供的可用部分,导致网络整体性能下降。若不进行拥塞控制,网络的吞吐量会随输入负载增大而下降,严重时会出现网络死锁,吞吐量降为 0。

拥塞控制的作用是防止过多数据注入网络,避免网络中间节点过载,维持网络的稳定吞吐量,是全局性的网络调控机制。
前提假设:为简化讨论,默认数据单向传输,接收方缓存足够大,发送窗口大小仅由网络拥塞程度决定;以 TCP 报文段的个数为讨论单位。

2.2 核心概念
-
拥塞窗口(cwnd):发送方维护的状态变量,数值随网络拥塞程度动态变化 ------ 网络无拥塞时窗口增大,出现拥塞时窗口减小。
-
发送窗口:实际发送窗口 = min (拥塞窗口 cwnd, 接收窗口 rwnd),同时受接收能力和网络拥塞程度限制。
-
慢开始门限(ssthresh):用于切换慢开始和拥塞避免算法的阈值。
-
拥塞判断依据:发送方发生超时重传时,判定网络很可能出现了拥塞。

2.3 四大拥塞控制算法详解
(1)慢开始(Slow Start)
-
初始状态:TCP 连接建立时,拥塞窗口 cwnd 初始值为 1。
-
增长规则:发送方每收到一个对新报文段的确认,就将 cwnd 加 1;因此每个完整的传输轮次(发送一批报文并收到全部确认)后,cwnd 呈指数增长。
-
切换条件:当 cwnd 增长到慢开始门限 ssthresh 时,停止慢开始算法,改用拥塞避免算法。
重点标注 :慢开始的 "慢" 指初始向网络注入的报文段数量少,而非增长速度慢;其窗口增长是指数级的。
(2)拥塞避免(Congestion Avoidance)
-
增长规则:进入拥塞避免阶段后,每个传输轮次结束后,cwnd 仅线性加 1,而非指数增长。
-
设计目的:让拥塞窗口缓慢增大,降低网络出现拥塞的概率。
重点标注 :拥塞避免不能完全避免拥塞,只是通过线性增长降低了拥塞发生的概率,当网络出现拥塞时,窗口仍会骤降。


(3)快重传(Fast Retransmit)

-
设计背景:个别报文段在网络中丢失,但网络并未发生拥塞。此时超时重传会让发送方误判网络拥塞,错误降低窗口,导致传输效率下降。
-
接收方规则:不等待自己发送数据时捎带确认,收到报文后立即发送确认;即使收到失序的报文段,也要立即发送对已按序接收数据的重复确认。
-
发送方触发条件:收到三个连续的重复确认时,立即重传对应的丢失报文段,无需等待重传计时器超时。
-
优势:可以提早重传丢失的个别报文,避免超时误判拥塞,能让整个网络的吞吐量提升约 20%。
(4)快恢复(Fast Recovery)

-
触发条件:发送方收到三个连续重复确认时(仅个别报文丢失,并非网络拥塞)。
-
核心规则:不启动慢开始算法,而是执行以下操作:
-
将慢开始门限 ssthresh 更新为当前拥塞窗口 cwnd 的一半;
-
将拥塞窗口 cwnd 设置为新的 ssthresh 值;
-
直接开始执行拥塞避免算法,窗口线性增长。
-
-
变体实现:部分实现中,快恢复开始时 cwnd = 新 ssthresh + 3。理由是三个重复确认代表有三个报文段已离开网络、停留在接收方缓存,网络中堆积的报文减少了,因此可以适当扩大窗口。
2.4 拥塞控制完整工作流程

-
初始阶段:cwnd=1,执行慢开始算法,窗口指数增长,直到达到 ssthresh,切换为拥塞避免,窗口线性增长。
-
超时重传(判定拥塞):
-
ssthresh 更新为当前 cwnd 的一半;
-
cwnd 重置为 1,重新开始执行慢开始算法。
-
-
三个重复确认(个别丢包):
-
执行快重传,立即重传丢失报文;
-
执行快恢复:ssthresh = 当前 cwnd/2,cwnd = 新 ssthresh,进入拥塞避免阶段。
-
2.5 经典例题解析
原题

答案:C
解析
-
发生超时重传后,慢开始门限更新为当前拥塞窗口的一半,即
ssthresh = 16KB / 2 = 8KB。 -
拥塞窗口重置为 1KB,重新执行慢开始算法,每个往返时间窗口指数增长:
-
第 1 个往返时间后:cwnd = 2KB
-
第 2 个往返时间后:cwnd = 4KB
-
第 3 个往返时间后:cwnd = 8KB,此时达到新的慢开始门限,切换为拥塞避免算法。
-
-
第 4 个往返时间后,拥塞避免阶段窗口线性加 1,因此
cwnd = 8KB + 1KB = 9KB。

三、TCP 超时重传时间的选择
3.1 设计原则
超时重传时间(RTO)是 TCP 最复杂的问题之一,其取值直接影响传输效率与可靠性:
-
RTO 设置过小:会引发不必要的重传,增大网络负荷;
-
RTO 设置过大:会导致重传推迟时间过长,网络空闲时间增加,传输效率下降。
核心结论 :超时重传时间 RTO 的取值应略大于报文段的往返时间(RTT)。
3.2 加权平均往返时间(RTTs)

由于 TCP 下层是复杂的互联网环境,报文传输的路由、链路速率都可能变化,单次测量的 RTT 波动很大,不能直接用于计算 RTO。因此 TCP 采用加权平均往返时间(平滑往返时间 RTTs),让 RTT 的计算结果更平滑。
计算规则
-
测量到第一个 RTT 样本时:
RTTs₁ = RTT₁ -
后续每个新的 RTT 样本:
新的RTTs = (1 - α) × 旧的RTTs + α × 新的RTT样本 -
RFC 6298 标准推荐:
α = 1/8 = 0.125
3.3 RTT 偏差与 RTO 计算公式

为了更准确地适配 RTT 的波动,TCP 还引入了RTT 偏差的加权平均(RTTd),用于衡量 RTT 样本的波动程度。
计算规则
-
测量到第一个 RTT 样本时:
RTTd₁ = RTT₁ / 2 -
后续每个新的 RTT 样本:
新的RTTd = (1 - β) × 旧的RTTd + β × |RTTs - 新的RTT样本| -
RFC 6298 标准推荐:
β = 1/4 = 0.25
RTO 最终计算公式
RTO = RTTs + 4 × RTTd
3.4 RTT 测量难题与 Karn 算法

问题描述
当报文段发生超时重传后,发送方收到确认时,无法判断该确认是对原报文段的确认,还是对重传报文段的确认,因此无法准确测量本次的 RTT:
-
若误将重传确认当作原报文的确认,会导致计算出的 RTT 和 RTO 偏大,降低传输效率;
-
若误将原报文的迟到确认当作重传确认,会导致计算出的 RTT 和 RTO 偏小,增加不必要的重传。
Karn 算法

-
核心规则:只要报文段发生了重传,就不采用本次的往返时间样本更新 RTTs 和 RTTd,即不重新计算 RTO。
-
存在的问题:如果报文段的时延突然持续增大,重传后不更新 RTO,会导致报文段反复被重传。
-
修正方案:报文段每重传一次,就将 RTO 增大为原来的 2 倍。
重点标注 :Karn 算法解决了重传场景下 RTT 测量不准的核心问题,配合 RTO 翻倍机制,应对时延持续增大的极端场景。



四、TCP 可靠传输的实现
4.1 实现基础:字节级滑动窗口
TCP 的可靠传输基于以字节为单位的滑动窗口机制实现。通过发送窗口和接收窗口的配合,保证数据按序、可靠交付,同时支持流量控制。
简化前提:默认数据单向传输,仅讨论发送方的发送窗口和接收方的接收窗口;暂不考虑网络拥塞,发送窗口大小由接收窗口决定。
4.2 发送窗口的结构与维护
窗口结构
发送方根据接收方确认报文段中的确认号 和窗口字段,构造自己的发送窗口,窗口内的字节分为两类:
-
已发送但未收到确认:必须暂时保留在发送缓存中,用于超时重传。
-
允许发送但尚未发送:可以随时封装成报文段发送。
窗口外侧:
-
窗口后沿左侧:已发送且已收到确认的数据,可以从发送缓存中删除。
-
窗口前沿右侧:当前不允许发送的数据。
窗口移动规则
-
后沿移动 :只能不动或向前移动(收到新的累计确认时前移),绝对不能向后移动------ 不能撤销已经收到的确认。
-
前沿移动:
-
通常随确认的到达向前移动;
-
可能不动:无新确认且窗口大小不变,或新确认带来的前移量与窗口缩小量恰好抵消;
-
极端情况会向后收缩(接收方缩小窗口),但 TCP 标准强烈不赞成这种做法,可能导致发送方已发送的数据违规。
-
指针维护方式

通过三个指针可以精准维护发送窗口状态:
-
小于 P1:已发送并已收到确认
-
P1 ~ P2:已发送但尚未收到确认
-
P2 ~ P3:允许发送但尚未发送
-
大于等于 P3:不允许发送
-
发送窗口大小 = P3 - P1
4.3 接收窗口的结构与确认规则

窗口结构
接收窗口的尺寸由接收方根据自身缓存能力设置,通过确认报文段通知发送方:
-
窗口左侧:已接收、已确认、已交付给应用进程的数据,可以从接收缓存删除。
-
窗口内:允许接收的数据。
-
窗口右侧:当前不允许接收的数据。
核心确认规则
-
累计确认 :接收方只能对按序到达的数据中的最高序号给出确认,确认号代表该序号之前的数据全部正确接收,期望收到下一个序号的数据。
-
失序数据处理:对于失序到达的数据,TCP 通常不会直接丢弃,而是临时存放在接收窗口中,等待缺失的字节到达后,再按序交付给上层应用进程,以提高网络资源利用率。
4.4 可靠传输的补充说明
-
窗口大小非实时同步:同一时刻,发送方的发送窗口和接收方的接收窗口大小并不总是相等。一方面,窗口字段的传输存在网络时延;另一方面,发送方可能根据网络拥塞情况,主动减小自己的发送窗口。
-
确认推迟规则:接收方可以推迟发送确认,但推迟时间不能超过 0.5 秒;如果收到一连串最大长度的报文段,必须每隔一个报文段发送一次确认。
-
捎带确认:确认信息可以捎带在反向传输的数据报文段中,减少报文数量,但实际场景中捎带确认并不常见。
-
全双工特性:TCP 是全双工通信,通信双方都各自维护一套发送窗口和接收窗口,可同时双向传输数据。

4.5 经典例题解析
例题 1
原题

答案:D
解析
-
第一个报文段首字节序号为 200,共 300 字节,因此最后一个字节的序号为
200 + 300 - 1 = 499。 -
第二个报文段首字节序号为 500,共 500 字节,因此最后一个字节的序号为
500 + 500 - 1 = 999。 -
TCP 采用累计确认,确认号为期望接收的下一个字节序号,即
999 + 1 = 1000。
例题 2
原题

答案:B
解析
-
第三个报文段首字节序号为 900,因此第二个报文段最后一个字节的序号为 899。
-
第二个报文段共 400 字节,因此其首字节序号为
899 - 400 + 1 = 500。 -
第一个报文段最后一个字节序号为 499,即序号 499 及之前的数据已按序正确接收。
-
TCP 只能对按序到达的最高序号进行确认,因此确认号为
499 + 1 = 500。

五、TCP 核心机制知识点汇总表
|----------|------------------------------|----------------------------|---------------------------------|------------------------------------------|-------------------------------------|
| 机制名称 | 核心目标 | 实现基础 | 关键概念 / 算法 | 核心规则 | 典型问题与解决方案 |
| 流量控制 | 限制发送方速率,保证接收方能及时接收数据,避免接收端丢包 | 滑动窗口 + 接收窗口字段 | 接收窗口 rwnd、发送窗口、零窗口、持续计时器 | 接收方通过窗口字段动态通知接收能力,发送方同步调整发送窗口 | 零窗口死锁 → 持续计时器 + 零窗口探测报文 |
| 拥塞控制 | 防止网络过载,维持网络稳定吞吐量,避免全局拥塞死锁 | 拥塞窗口 cwnd + 慢开始门限 ssthresh | 慢开始、拥塞避免、快重传、快恢复 | 超时重传判定拥塞,窗口骤降;三个重复确认判定个别丢包,执行快恢复 | 个别丢包误判拥塞 → 快重传 + 快恢复算法 |
| 超时重传时间选择 | 设定合理的重传等待时间,平衡传输效率与网络负荷 | 往返时间 RTT 采样 + 加权平滑计算 | 平滑往返时间 RTTs、RTT 偏差 RTTd、Karn 算法 | RTO 略大于 RTT,基于加权平均公式计算;重传时不更新 RTT,RTO 翻倍 | 重传时 RTT 测量不准 → Karn 算法 + 重传时 RTO 翻倍 |
| 可靠传输实现 | 保证数据按序、无丢失、无重复地交付给应用层 | 以字节为单位的滑动窗口 | 发送窗口、接收窗口、累计确认、捎带确认 | 发送方缓存未确认数据,超时重传;接收方累计确认,缓存失序数据 | 数据失序到达 → 临时缓存,等待补全后按序交付 |
以上就是 TCP 四大核心机制的完整内容,从接收端的流量控制,到全局的拥塞控制,再到底层的超时重传时间计算,最终落地到滑动窗口实现可靠传输的完整细节,共同构成了 TCP 可靠高效传输的技术闭环。掌握这些知识点,不仅能深入理解传输层的运作原理,也能轻松应对计算机网络相关的考试与面试问题。