TCP的接收窗口与发送窗口详解
字数 1605 2025-12-06 09:01:12

TCP的接收窗口与发送窗口详解

一、知识点描述
在TCP协议中,接收窗口(Receiver Window, rwnd)和发送窗口(Sender Window, swnd)是实现流量控制与可靠传输的核心机制。它们定义了接收端能够接受的数据量以及发送端能够发送的数据量,两者协同工作,确保数据传输既高效又不会压垮接收端。简单来说,它们共同决定了发送方“在未收到确认前,最多能发送多少字节数据”。

二、核心原理与交互关系

  1. 基本定义
    • 接收窗口(rwnd):接收方通告给发送方的一个值,表示接收方缓冲区当前可用的空间大小(单位:字节)。它动态变化,取决于接收方处理数据的速度。
    • 发送窗口(swnd):发送方维护的一个动态窗口,其大小由两个因素共同决定:接收窗口(rwnd)拥塞窗口(cwnd)。实际发送窗口大小是两者的最小值:

\[ swnd = \min(rwnd, cwnd) \]

 发送窗口内的字节可以被连续发送,无需等待确认。
  1. 窗口的协同工作机制
    • 接收方通过TCP报文头中的“窗口大小”字段,将当前rwnd告知发送方(经窗口缩放因子调整后)。
    • 发送方根据收到的rwnd和自身计算的cwnd,动态调整swnd的右边界,控制已发送但未确认的数据量不超过swnd。
    • 当接收方处理完缓冲区数据,rwnd增大,并通过ACK报文通告新窗口;发送方检测到swnd扩大,即可继续发送新数据。
    • 如果rwnd减为0,发送方会启动零窗口探测,定期查询窗口是否重新打开。

三、详细运行步骤
假设发送方(A)向接收方(B)传输数据,缓冲区初始状态如下:

  1. 初始状态

    • B通告rwnd = 3000字节(假设拥塞窗口足够大,cwnd > 3000)。
    • A的发送窗口swnd = 3000字节,窗口左边界指向已确认的序列号,右边界 = 左边界 + 3000。
  2. 发送数据

    • A连续发送序列号1~1000、1001~2000、2001~3000的三个段(各1000字节),此时已发送未确认数据占满swnd=3000,暂停发送。
  3. 接收方处理与窗口更新

    • B收到前两个段(1~2000字节),但应用层仅读取了1000字节,缓冲区剩余可用空间减少。
    • 计算新rwnd = 总缓冲区容量 - 未读取数据量。假设缓冲区总大小4000字节,当前未读取数据为2000字节(已收2000但未读),则rwnd = 4000 - 2000 = 2000字节。
    • B在确认序列号2001的ACK中携带rwnd=2000。
  4. 发送方调整窗口

    • A收到ACK后,窗口左边界移动到2001(表示2000及之前数据已确认)。
    • 更新swnd = min(新rwnd=2000, cwnd)=2000,窗口右边界调整为2001+2000=4001。
    • 此时A可继续发送序列号3001~4001的数据(因为2001~3000已发送但未确认,仍占窗口内部分位置)。
  5. 零窗口场景

    • 若B的缓冲区满,rwnd=0,A暂停发送并启动零窗口探测定时器。
    • 当B的应用层读取数据后,rwnd>0,可在A的探测包或下一个ACK中通告新窗口,恢复传输。

四、关键注意事项

  1. 窗口更新延迟:TCP使用累计确认,ACK通常携带最新的rwnd,但可能存在延迟或丢失,发送方需以最新收到的rwnd为准。
  2. 接收窗口缩放:实际rwnd通过TCP选项“窗口缩放因子”左移运算放大,以支持高速网络。
  3. 窗口与吞吐量:最大吞吐量受限于min(rwnd, cwnd)/RTT,若rwnd过小可能限制传输速度。
  4. 糊涂窗口综合征:避免通告过小的窗口(如1字节),可通过延迟通告或积累一定空间后再更新窗口。

五、总结
接收窗口是接收方处理能力的实时反馈,发送窗口是发送方根据网络拥塞和接收能力自我调节的“发送许可证”。两者通过动态协商实现端到端的流量控制,并与拥塞控制协同,构成了TCP可靠传输与效率平衡的基石。

TCP的接收窗口与发送窗口详解 一、知识点描述 在TCP协议中,接收窗口(Receiver Window, rwnd)和发送窗口(Sender Window, swnd)是实现流量控制与可靠传输的核心机制。它们定义了接收端能够接受的数据量以及发送端能够发送的数据量,两者协同工作,确保数据传输既高效又不会压垮接收端。简单来说,它们共同决定了发送方“在未收到确认前,最多能发送多少字节数据”。 二、核心原理与交互关系 基本定义 接收窗口(rwnd) :接收方通告给发送方的一个值,表示接收方缓冲区当前可用的空间大小(单位:字节)。它动态变化,取决于接收方处理数据的速度。 发送窗口(swnd) :发送方维护的一个动态窗口,其大小由两个因素共同决定: 接收窗口(rwnd) 和 拥塞窗口(cwnd) 。实际发送窗口大小是两者的最小值: \[ swnd = \min(rwnd, cwnd) \] 发送窗口内的字节可以被连续发送,无需等待确认。 窗口的协同工作机制 接收方通过TCP报文头中的“窗口大小”字段,将当前rwnd告知发送方(经窗口缩放因子调整后)。 发送方根据收到的rwnd和自身计算的cwnd,动态调整swnd的右边界,控制已发送但未确认的数据量不超过swnd。 当接收方处理完缓冲区数据,rwnd增大,并通过ACK报文通告新窗口;发送方检测到swnd扩大,即可继续发送新数据。 如果rwnd减为0,发送方会启动 零窗口探测 ,定期查询窗口是否重新打开。 三、详细运行步骤 假设发送方(A)向接收方(B)传输数据,缓冲区初始状态如下: 初始状态 B通告rwnd = 3000字节(假设拥塞窗口足够大,cwnd > 3000)。 A的发送窗口swnd = 3000字节,窗口左边界指向已确认的序列号,右边界 = 左边界 + 3000。 发送数据 A连续发送序列号1~1000、1001~2000、2001~3000的三个段(各1000字节),此时已发送未确认数据占满swnd=3000,暂停发送。 接收方处理与窗口更新 B收到前两个段(1~2000字节),但应用层仅读取了1000字节,缓冲区剩余可用空间减少。 计算新rwnd = 总缓冲区容量 - 未读取数据量。假设缓冲区总大小4000字节,当前未读取数据为2000字节(已收2000但未读),则rwnd = 4000 - 2000 = 2000字节。 B在确认序列号2001的ACK中携带rwnd=2000。 发送方调整窗口 A收到ACK后,窗口左边界移动到2001(表示2000及之前数据已确认)。 更新swnd = min(新rwnd=2000, cwnd)=2000,窗口右边界调整为2001+2000=4001。 此时A可继续发送序列号3001~4001的数据(因为2001~3000已发送但未确认,仍占窗口内部分位置)。 零窗口场景 若B的缓冲区满,rwnd=0,A暂停发送并启动零窗口探测定时器。 当B的应用层读取数据后,rwnd>0,可在A的探测包或下一个ACK中通告新窗口,恢复传输。 四、关键注意事项 窗口更新延迟 :TCP使用累计确认,ACK通常携带最新的rwnd,但可能存在延迟或丢失,发送方需以最新收到的rwnd为准。 接收窗口缩放 :实际rwnd通过TCP选项“窗口缩放因子”左移运算放大,以支持高速网络。 窗口与吞吐量 :最大吞吐量受限于min(rwnd, cwnd)/RTT,若rwnd过小可能限制传输速度。 糊涂窗口综合征 :避免通告过小的窗口(如1字节),可通过延迟通告或积累一定空间后再更新窗口。 五、总结 接收窗口是接收方处理能力的实时反馈,发送窗口是发送方根据网络拥塞和接收能力自我调节的“发送许可证”。两者通过动态协商实现端到端的流量控制,并与拥塞控制协同,构成了TCP可靠传输与效率平衡的基石。