Appearance
408
计算机网络
CN-05-06 TCP流量控制(滑动窗口)
一、定位信息
- 圈层:核心层
- 前置知识:需要掌握TCP报文段格式(窗口字段、序号、确认号),理解TCP可靠传输机制(确认和重传)
- 知识网络位置:流量控制是TCP的两大控制机制之一(另一个是拥塞控制),它解决的是"发送方发得太快,接收方来不及处理"的问题,是理解拥塞控制的前置基础
- 考点热度等级:H级(高频重点)——滑动窗口机制是408综合题的核心考点,经常与拥塞控制结合出大题
二、知识点讲解
2.1 流量控制的基本概念
**流量控制(Flow Control)**的目的是让发送方的发送速率不超过接收方的接收速率。如果不进行流量控制,发送方可能发送数据过快,导致接收方的接收缓冲区溢出,造成数据丢失。
TCP利用滑动窗口机制实现流量控制。接收方通过TCP首部中的**窗口字段(rwnd)**告诉发送方自己的接收窗口大小,发送方据此限制自己的发送量。
2.2 滑动窗口机制
发送窗口是发送方维护的一个逻辑窗口,表示在收到确认之前可以连续发送的数据范围。
发送窗口的几个关键指针:
|<-------- 发送窗口 -------->|
| 已确认 | 可发送 | 不可发送 |
| 的数据 | 的数据 | 的数据 |
^ ^
发送窗口 发送窗口
左边界 右边界- 发送窗口左边界(SendBase):已发送且已确认的最大字节序号+1
- 发送窗口右边界(SendBase + rwnd):左边界 + 接收方通告的窗口大小
- 窗口内已发送未确认:已发送但尚未收到确认的数据
- 窗口内未发送:可以立即发送但尚未发送的数据
- 窗口外右侧:不允许发送的数据(超出接收方能力)
发送窗口的工作过程:
- 发送方可以连续发送窗口内的数据,无需等待确认
- 收到确认后,窗口左边界向右滑动(已确认的数据移出窗口)
- 接收方通告新的窗口大小后,窗口右边界可能移动
- 窗口大小可以动态变化,甚至可以收缩到0
2.3 接收窗口
接收方也维护一个接收窗口,表示愿意接收的数据范围:
|<-------- 接收窗口 -------->|
| 已确认 | 可接收 | 不可接收 |
| 并交付 | 的数据 | 的数据 |- 接收窗口左边界:已接收并交付给应用层的最大字节序号+1
- 接收窗口大小(rwnd)= 接收缓冲区剩余空间
- 接收方通过每次确认报文段中的窗口字段通告自己的rwnd
2.4 窗口大小变化
窗口大小会随时间动态变化:
| 情况 | 窗口变化 | 原因 |
|---|---|---|
| 接收方读取了缓冲区数据 | rwnd增大 | 缓冲区空间释放 |
| 接收方应用层读取慢 | rwnd减小 | 缓冲区逐渐填满 |
| 缓冲区满 | rwnd=0 | 发送方必须停止发送 |
| 缓冲区重新有空间 | rwnd>0 | 发送方可以恢复发送 |
2.5 零窗口与持续计时器
当接收方通告窗口大小为0时,发送方必须停止发送数据。但这里有一个问题:当接收方的缓冲区重新有空间时,接收方会发送一个窗口更新报文段(rwnd>0)通知发送方。如果这个通知报文段丢失了,发送方将永远等待——因为它不知道接收方已经有空间了。
为了解决这个问题,TCP引入了持续计时器(Persist Timer):
- 当发送方收到零窗口通告时,启动持续计时器
- 计时器超时后,发送方发送一个零窗口探测报文段(携带1字节数据)
- 接收方收到探测报文段后,回复确认并通告当前窗口大小
- 如果窗口仍为0,则重新启动持续计时器,重复上述过程
2.6 传输效率问题:Nagle算法与Clark方案
Nagle算法(发送方优化):当数据量较小时,先发送一个报文段,然后在收到确认之前将后续小数据缓存起来,等到收到确认或数据积累到一个MSS时再发送。目的是减少网络中的小报文段数量。
Clark方案(接收方优化):当接收方的可用窗口很小时(小于MSS或缓冲区空间的一半),推迟发送窗口更新通知,直到有足够空间容纳一个完整报文段。目的是避免发送大量"只有1字节空间"的窗口更新。
2.7 流量控制与拥塞控制的关系
| 对比项 | 流量控制 | 拥塞控制 |
|---|---|---|
| 控制目标 | 防止发送方超过接收方的处理能力 | 防止过多数据注入网络导致拥塞 |
| 控制范围 | 端到端(发送方↔接收方) | 全局性(涉及网络中的所有节点) |
| 信息来源 | 接收方通告的窗口rwnd | 通过丢包/超时等隐式信号感知 |
| 实现机制 | 滑动窗口(rwnd) | 拥塞窗口(cwnd) |
| 最终发送窗口 |
三、记忆与理解辅助
口诀:"流量控制管快慢,接收方说发多少;滑动窗口来实现,rwnd是关键信号"——记住流量控制的核心是接收方通过rwnd控制发送方。
类比记忆:滑动窗口像一个"传送带"——传送带的长度是rwnd,发送方不断往传送带放数据,接收方不断从另一端取走数据。取走后传送带向右滑动,可以放新的数据。如果接收方取不过来,传送带就满了(rwnd=0),发送方只能等待。
数字记忆:最终发送窗口 = ——取接收能力和网络能力中的较小值。这个公式是连接流量控制和拥塞控制的桥梁。
对比表:滑动窗口的三种使用场景
| 场景 | 窗口大小 | 特点 |
|---|---|---|
| 停止-等待协议 | 1 | 最简单,效率最低 |
| 后退N帧协议(GBN) | 可连续发送,出错后回退 | |
| 选择重传协议(SR) | 可连续发送,只重传出错帧 | |
| TCP滑动窗口 | 动态(rwnd/cwnd) | 结合流量控制和拥塞控制 |
四、例题与精解
例题1(基础巩固)
题目:TCP发送方的发送窗口大小为4000字节,已发送但未确认的数据为2000字节,还可以发送的数据为( )字节。若此时收到一个确认号=1500、窗口=3000的报文段(原SendBase=1000),则新的发送窗口大小为( )字节,可发送的数据量变为( )字节。
A. 2000, 3000, 2500
B. 2000, 3000, 3000
C. 4000, 3000, 2500
D. 2000, 3000, 1500
命题意图:考查发送窗口的计算方法和窗口滑动过程。
精解:
审题分析:需要计算三个量——当前可发送数据、新窗口大小、新可发送数据。
解题思路:
- 可发送数据 = 发送窗口大小 - 已发送未确认的数据
- 收到确认后:SendBase更新为确认号,窗口大小更新为rwnd
- 新可发送数据 = 新窗口大小 - 新的已发送未确认数据
完整步骤:
当前:发送窗口=4000,已发送未确认=2000
还可以发送 = 4000 - 2000 = 2000字节
收到确认后:
- SendBase从1000更新为1500(确认号)
- 窗口大小更新为3000(rwnd)
- 已发送未确认的数据:原来2000字节中,序号1000~1499的500字节被确认,剩余1500字节(序号1500起的已发数据)未确认
- 但注意:新的已发送未确认 = 原来的已发送未确认 - 被确认的部分 = 2000 - 500 = 1500字节
- 新可发送 = 新窗口 - 新的已发送未确认 = 3000 - 1500 = 1500字节
但让我重新审视:题目说"已发送但未确认的数据为2000字节",原SendBase=1000,所以已发送的数据覆盖1000~2999。收到ack=1500后,1000~1499被确认,SendBase变为1500。已发送未确认变为1500~2999共1500字节。新窗口=3000,右边界=1500+3000=4500。可发送=4500-3000=1500字节。
选项中没有完全匹配的...让我重新计算。选项A是2000,3000,2500。
如果已发送未确认从SendBase开始算:原来发送窗口范围是[1000, 5000),已发送未确认2000字节意味着已发到3000。确认后SendBase=1500,已发数据到3000,未确认=3000-1500=1500字节。新窗口=3000,右边界=1500+3000=4500。可发送=4500-3000=1500。
仍然不对。让我看选项B:2000,3000,3000。如果新窗口=3000且已发送未确认=0(全部被确认了),那可发送=3000。但题目只确认了1500-1000=500字节...
我重新理解题目:也许"已发送但未确认的数据为2000字节"不包括序号1000~2999这种含义,而是说在窗口内已发送了2000字节。原窗口4000,已发2000未确认,还可发2000。
收到ack=1500后:
- 被确认的数据:从原来的SendBase到1500,即500字节
- 新的已发送未确认 = 2000 - 500 = 1500字节
- 新窗口 = 3000
- 可发送 = 3000 - 1500 = 1500
选D:2000, 3000, 1500。
方法反思:发送窗口计算的核心公式是:可发送数据 = 发送窗口大小 - 已发送未确认的数据。收到确认后,已发送未确认的数据量减少(被确认的部分移出),窗口大小可能变化。
答案:D
例题2(中等提升)
题目:主机A和主机B建立了一个TCP连接,B的接收缓冲区大小为4000字节。A向B连续发送数据,某时刻B的接收缓冲区中已占用3600字节(其中1000字节已被应用层读取但尚未从缓冲区清除),则此时B向A通告的窗口大小rwnd为( )字节。若随后B的应用层读取了全部已接收数据,则B应向A发送的窗口更新报文段中rwnd为( )字节。
A. 400, 4000
B. 400, 3000
C. 3600, 4000
D. 400, 400
命题意图:考查接收窗口rwnd的计算方法,理解缓冲区占用与窗口大小的关系。
精解:
审题分析:需要理解接收缓冲区、已占用空间、rwnd之间的关系。
解题思路:rwnd = 接收缓冲区大小 - 已占用但未被应用层读取的空间
完整步骤:
- 接收缓冲区大小 = 4000字节
- 缓冲区中已占用3600字节,其中1000字节已被应用层读取但未清除
- 实际仍占用缓冲区的空间 = 3600 - 1000 = 2600字节(已读取的1000字节虽未清除,但可被覆盖...)
等等,这里需要更准确的理解。在TCP中,"已被应用层读取"的数据仍然在缓冲区中占据空间,直到TCP将其从缓冲区中移除。所以:
- rwnd = 4000 - 3600 = 400字节
当B的应用层读取了全部已接收数据后:
- 缓冲区全部清空
- rwnd = 4000 - 0 = 4000字节
方法反思:rwnd反映的是接收缓冲区的剩余可用空间。注意区分"已被应用层读取"和"已从缓冲区清除"——在TCP实现中,数据被读取后可能仍占据缓冲区空间,但考研中通常简化处理:rwnd = 缓冲区大小 - 已接收未读取的数据量。
答案:A
五、考情分析
- 考查频次:近5年408真题中滑动窗口/流量控制相关题目约出现5~8次
- 常见题型:选择题(窗口计算、rwnd值)和综合题(结合拥塞控制的完整窗口变化过程分析)
- 分值占比:4~10分(综合题中与拥塞控制合计)
- 命题趋势:近年倾向于将流量控制与拥塞控制综合出大题,要求画出窗口变化过程图或计算特定时刻的窗口大小。零窗口和持续计时器也是常见考点
- 基于大纲与命题规律推测
六、易错点提醒
错误表现:将发送窗口大小等同于拥塞窗口cwnd
- 错误原因:忽略了流量控制的影响
- 正确理解/做法:实际发送窗口 = 。流量控制限制了发送窗口不超过rwnd,拥塞控制限制了发送窗口不超过cwnd。两者取较小值。
错误表现:认为接收方通告rwnd=0后,发送方完全不能发送任何数据
- 错误原因:忽略了零窗口探测机制
- 正确理解/做法:rwnd=0时,发送方可以发送零窗口探测报文段(携带1字节数据),以检测接收方窗口是否重新打开。此外,URG=1的紧急数据也可以发送。
错误表现:在滑动窗口计算中,确认号更新后忘记调整已发送未确认的数据量
- 错误原因:只更新了SendBase,没有同步更新已发送未确认的数据量
- 正确理解/做法:收到确认后,已发送未确认的数据量 = 原来的已发送未确认量 - 本次确认的数据量。
错误表现:认为窗口大小只能增大或保持不变,不能减小
- 错误原因:对窗口机制理解不全面
- 正确理解/做法:TCP允许接收方缩小窗口(窗口收缩),但这种做法可能导致问题(发送方已发出的数据超出新窗口),因此RFC建议避免窗口收缩。
七、来源标注
- 依据2026考研统考大纲·计算机网络部分
- 依据《计算机网络(第8版)》谢希仁版
- 依据《计算机网络:自顶向下方法(第8版)》James F. Kurose版