📖 TCP 的流量控制 (Flow Control)
🎯 课程摘要:TCP 利用滑动窗口 (sliding window) 机制实现流量控制 (flow control),由接收方根据自身接收缓存的可用空间,通过确认报文段中的窗口字段 RWND 来控制发送方的发送速率。当接收窗口降为零时,需借助持续计时器与零窗口探测报文段打破可能出现的死锁。
📝 详细笔记
1. 流量控制的基本概念
- 概念定义:流量控制 (flow control) 是接收方根据自己的接收能力(即接收缓存的可用空间大小)来控制发送方发送速率的机制。
- 解决的问题:防止发送方发送数据太快,导致接收方来不及从接收缓存取走数据,造成接收缓存溢出和数据丢失。
- 原理解析:
- TCP 客户与服务器通过三报文握手建立连接后,发送方将上层交付的报文视为字节流存入发送缓存,按发送策略取出封装成 TCP 报文段发送。
- 接收方正确接收后将数据暂存接收缓存,应用程序从中读取数据;若应用读取较慢而发送方持续快速发送,则易造成缓存溢出。
- ⚠️ 重点/考点:流量控制是点对点通信问题,只与特定发送方和接收方之间的流量有关;本质是"接收方控制发送方"。
2. 利用滑动窗口实现流量控制
- 核心机制:接收方在确认报文段的窗口字段 (RWND) 中通告自己当前的接收窗口大小,发送方据此调整自己的发送窗口 SWND。
- 关键变量:
变量 含义 维护方 SWND 发送窗口 发送方 RWND 接收窗口(接收缓存可用空间) 接收方 - 工作流程(以主机 A 发送、主机 B 流量控制为例,每报文段携带 100 字节数据):
- 累计确认含义:确认号 ACK = N 表示序号 N 之前的数据已全部正确接收,现在期望收到序号 N 及其后续数据。
- 窗口调整规则:发送方收到确认后,根据确认号 ACK 前移窗口后沿,根据 RWND 调整窗口大小;已发送并收到确认的数据可从发送缓存删除,未收到确认的数据须保留以备超时重传。
- ⚠️ 重点/考点:本例中主机 B 对主机 A 进行了三次流量控制,RWND 依次为 300 → 100 → 0,体现接收方逐步减小发送方速率。
3. 零窗口探测报文段与持续计时器
- 死锁问题:当接收方发送零窗口通知后,其接收缓存又有可用空间,于是发送非零窗口通知;若该通知在传输中丢失,则发送方等待非零窗口通知、接收方等待数据,形成互相等待的死锁。
- 持续计时器 (persist timer):
- TCP 为每个连接设有持续计时器。
- 只要 TCP 连接的一方收到对方的零窗口通知,就启动持续计时器。
- 计时器超时时,发送一个零窗口探测报文段(仅携带 1 字节数据),对方在确认时给出自己当前的接收窗口值。
- 若接收窗口仍为 0,则重新启动持续计时器;若非零,则打破死锁。
- TCP 规定:即使接收窗口值为零,也必须接受零窗口探测报文段、确认报文段以及携带有紧急数据的报文段。
- ⚠️ 重点/考点:零窗口探测报文段本身也有重传计时器,若丢失会被重传,因此仍能打破死锁。
4. 相关 408 考研真题要点
- MSS 含义:TCP 最大报文段长度 MSS 指 TCP 报文段数据载荷的长度,而非整个 TCP 报文段的长度。
- 真题示例:主机甲向主机乙连续发送两个 MSS(共 2000 字节),乙对第一个 TCP 段确认并通告 RWND=2000;甲收到后窗口前滑,SWND 调整为 2000,还可发送序号 2000~2999 共 1000 字节。答案为选项 A。
💡 核心总结
- 流量控制是接收方控制发送方的点对点机制,核心手段是确认报文段中的窗口字段 RWND。
- 发送窗口 SWND 随接收方通告的 RWND 动态调整,实现"按需减速"。
- 零窗口 + 持续计时器 + 零窗口探测报文段是打破死锁的三件套。
- 区分 MSS(数据载荷长度)与报文段总长度。
❓ 课后思考 / 经典考题
- TCP 流量控制中,若非零窗口通知报文段丢失会产生什么后果?如何解决?
- 为什么即使接收窗口为零,接收方也必须接受零窗口探测报文段?
- (408 真题)主机甲发送窗口为 4000 字节,连续发送两个 MSS 后收到对第一段的确认且通告 RWND=2000,此时甲还可向乙发送多少字节的数据?