Skip to content

408

计算机网络

CN-05-06 TCP流量控制(滑动窗口)


一、定位信息

  • 圈层:核心层
  • 前置知识:需要掌握TCP报文段格式(窗口字段、序号、确认号),理解TCP可靠传输机制(确认和重传)
  • 知识网络位置:流量控制是TCP的两大控制机制之一(另一个是拥塞控制),它解决的是"发送方发得太快,接收方来不及处理"的问题,是理解拥塞控制的前置基础
  • 考点热度等级H级(高频重点)——滑动窗口机制是408综合题的核心考点,经常与拥塞控制结合出大题

二、知识点讲解

2.1 流量控制的基本概念

**流量控制(Flow Control)**的目的是让发送方的发送速率不超过接收方的接收速率。如果不进行流量控制,发送方可能发送数据过快,导致接收方的接收缓冲区溢出,造成数据丢失。

TCP利用滑动窗口机制实现流量控制。接收方通过TCP首部中的**窗口字段(rwnd)**告诉发送方自己的接收窗口大小,发送方据此限制自己的发送量。

2.2 滑动窗口机制

发送窗口是发送方维护的一个逻辑窗口,表示在收到确认之前可以连续发送的数据范围。

发送窗口的几个关键指针:

|<-------- 发送窗口 -------->|
|  已确认  | 可发送 | 不可发送 |
|  的数据  | 的数据 | 的数据   |
           ^        ^
         发送窗口  发送窗口
         左边界    右边界
  • 发送窗口左边界(SendBase):已发送且已确认的最大字节序号+1
  • 发送窗口右边界(SendBase + rwnd):左边界 + 接收方通告的窗口大小
  • 窗口内已发送未确认:已发送但尚未收到确认的数据
  • 窗口内未发送:可以立即发送但尚未发送的数据
  • 窗口外右侧:不允许发送的数据(超出接收方能力)

发送窗口的工作过程

  1. 发送方可以连续发送窗口内的数据,无需等待确认
  2. 收到确认后,窗口左边界向右滑动(已确认的数据移出窗口)
  3. 接收方通告新的窗口大小后,窗口右边界可能移动
  4. 窗口大小可以动态变化,甚至可以收缩到0

2.3 接收窗口

接收方也维护一个接收窗口,表示愿意接收的数据范围:

|<-------- 接收窗口 -------->|
|  已确认  | 可接收 | 不可接收 |
|  并交付  | 的数据 | 的数据   |
  • 接收窗口左边界:已接收并交付给应用层的最大字节序号+1
  • 接收窗口大小(rwnd)= 接收缓冲区剩余空间
  • 接收方通过每次确认报文段中的窗口字段通告自己的rwnd

2.4 窗口大小变化

窗口大小会随时间动态变化:

情况窗口变化原因
接收方读取了缓冲区数据rwnd增大缓冲区空间释放
接收方应用层读取慢rwnd减小缓冲区逐渐填满
缓冲区满rwnd=0发送方必须停止发送
缓冲区重新有空间rwnd>0发送方可以恢复发送

2.5 零窗口与持续计时器

当接收方通告窗口大小为0时,发送方必须停止发送数据。但这里有一个问题:当接收方的缓冲区重新有空间时,接收方会发送一个窗口更新报文段(rwnd>0)通知发送方。如果这个通知报文段丢失了,发送方将永远等待——因为它不知道接收方已经有空间了。

为了解决这个问题,TCP引入了持续计时器(Persist Timer)

  1. 当发送方收到零窗口通告时,启动持续计时器
  2. 计时器超时后,发送方发送一个零窗口探测报文段(携带1字节数据)
  3. 接收方收到探测报文段后,回复确认并通告当前窗口大小
  4. 如果窗口仍为0,则重新启动持续计时器,重复上述过程

2.6 传输效率问题:Nagle算法与Clark方案

Nagle算法(发送方优化):当数据量较小时,先发送一个报文段,然后在收到确认之前将后续小数据缓存起来,等到收到确认或数据积累到一个MSS时再发送。目的是减少网络中的小报文段数量。

Clark方案(接收方优化):当接收方的可用窗口很小时(小于MSS或缓冲区空间的一半),推迟发送窗口更新通知,直到有足够空间容纳一个完整报文段。目的是避免发送大量"只有1字节空间"的窗口更新。

2.7 流量控制与拥塞控制的关系

对比项流量控制拥塞控制
控制目标防止发送方超过接收方的处理能力防止过多数据注入网络导致拥塞
控制范围端到端(发送方↔接收方)全局性(涉及网络中的所有节点)
信息来源接收方通告的窗口rwnd通过丢包/超时等隐式信号感知
实现机制滑动窗口(rwnd)拥塞窗口(cwnd)
最终发送窗口min(rwnd,cwnd)\min(rwnd, cwnd)min(rwnd,cwnd)\min(rwnd, cwnd)

三、记忆与理解辅助

  1. 口诀:"流量控制管快慢,接收方说发多少;滑动窗口来实现,rwnd是关键信号"——记住流量控制的核心是接收方通过rwnd控制发送方。

  2. 类比记忆:滑动窗口像一个"传送带"——传送带的长度是rwnd,发送方不断往传送带放数据,接收方不断从另一端取走数据。取走后传送带向右滑动,可以放新的数据。如果接收方取不过来,传送带就满了(rwnd=0),发送方只能等待。

  3. 数字记忆:最终发送窗口 = min(rwnd,cwnd)\min(rwnd, cwnd)——取接收能力和网络能力中的较小值。这个公式是连接流量控制和拥塞控制的桥梁。

  4. 对比表:滑动窗口的三种使用场景

场景窗口大小特点
停止-等待协议1最简单,效率最低
后退N帧协议(GBN)1<W2n11 < W \leq 2^n - 1可连续发送,出错后回退
选择重传协议(SR)W2n1W \leq 2^{n-1}可连续发送,只重传出错帧
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

命题意图:考查发送窗口的计算方法和窗口滑动过程。

精解

  1. 审题分析:需要计算三个量——当前可发送数据、新窗口大小、新可发送数据。

  2. 解题思路

    • 可发送数据 = 发送窗口大小 - 已发送未确认的数据
    • 收到确认后:SendBase更新为确认号,窗口大小更新为rwnd
    • 新可发送数据 = 新窗口大小 - 新的已发送未确认数据
  3. 完整步骤

    • 当前:发送窗口=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。

  4. 方法反思:发送窗口计算的核心公式是:可发送数据 = 发送窗口大小 - 已发送未确认的数据。收到确认后,已发送未确认的数据量减少(被确认的部分移出),窗口大小可能变化。

答案: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的计算方法,理解缓冲区占用与窗口大小的关系。

精解

  1. 审题分析:需要理解接收缓冲区、已占用空间、rwnd之间的关系。

  2. 解题思路:rwnd = 接收缓冲区大小 - 已占用但未被应用层读取的空间

  3. 完整步骤

    • 接收缓冲区大小 = 4000字节
    • 缓冲区中已占用3600字节,其中1000字节已被应用层读取但未清除
    • 实际仍占用缓冲区的空间 = 3600 - 1000 = 2600字节(已读取的1000字节虽未清除,但可被覆盖...)

    等等,这里需要更准确的理解。在TCP中,"已被应用层读取"的数据仍然在缓冲区中占据空间,直到TCP将其从缓冲区中移除。所以:

    • rwnd = 4000 - 3600 = 400字节

    当B的应用层读取了全部已接收数据后:

    • 缓冲区全部清空
    • rwnd = 4000 - 0 = 4000字节
  4. 方法反思:rwnd反映的是接收缓冲区的剩余可用空间。注意区分"已被应用层读取"和"已从缓冲区清除"——在TCP实现中,数据被读取后可能仍占据缓冲区空间,但考研中通常简化处理:rwnd = 缓冲区大小 - 已接收未读取的数据量。

答案:A


五、考情分析

  • 考查频次:近5年408真题中滑动窗口/流量控制相关题目约出现5~8次
  • 常见题型:选择题(窗口计算、rwnd值)和综合题(结合拥塞控制的完整窗口变化过程分析)
  • 分值占比:4~10分(综合题中与拥塞控制合计)
  • 命题趋势:近年倾向于将流量控制与拥塞控制综合出大题,要求画出窗口变化过程图或计算特定时刻的窗口大小。零窗口和持续计时器也是常见考点
  • 基于大纲与命题规律推测

六、易错点提醒

  1. 错误表现:将发送窗口大小等同于拥塞窗口cwnd

    • 错误原因:忽略了流量控制的影响
    • 正确理解/做法:实际发送窗口 = min(rwnd,cwnd)\min(rwnd, cwnd)。流量控制限制了发送窗口不超过rwnd,拥塞控制限制了发送窗口不超过cwnd。两者取较小值。
  2. 错误表现:认为接收方通告rwnd=0后,发送方完全不能发送任何数据

    • 错误原因:忽略了零窗口探测机制
    • 正确理解/做法:rwnd=0时,发送方可以发送零窗口探测报文段(携带1字节数据),以检测接收方窗口是否重新打开。此外,URG=1的紧急数据也可以发送。
  3. 错误表现:在滑动窗口计算中,确认号更新后忘记调整已发送未确认的数据量

    • 错误原因:只更新了SendBase,没有同步更新已发送未确认的数据量
    • 正确理解/做法:收到确认后,已发送未确认的数据量 = 原来的已发送未确认量 - 本次确认的数据量。
  4. 错误表现:认为窗口大小只能增大或保持不变,不能减小

    • 错误原因:对窗口机制理解不全面
    • 正确理解/做法:TCP允许接收方缩小窗口(窗口收缩),但这种做法可能导致问题(发送方已发出的数据超出新窗口),因此RFC建议避免窗口收缩。

七、来源标注

  • 依据2026考研统考大纲·计算机网络部分
  • 依据《计算机网络(第8版)》谢希仁版
  • 依据《计算机网络:自顶向下方法(第8版)》James F. Kurose版

考研全科复习资料 - 基于2026考研统考大纲