TCP的接收窗口与发送窗口详解
字数 1605 2025-12-06 09:01:12
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可靠传输与效率平衡的基石。