TCP 流量控制
流量控制的功能就是让发送方的发送速率不要太快,以便让接收方来得及接收,因此可以说流量控制是一个速度匹配服务(匹配发送方的发送速率与接收方的读取速率)。
真题考过利用接收窗口实现流量控制的过程(2016、2021)。做这类题的核心是一个区间:发送方能发的字节,从确认号开始,长度为窗口值,再扣掉其中已经发过的。 本页两道错题,一道就是这个区间(2021),另一道是窗口为零时靠什么计时器打破僵局。
机制
接收窗口
TCP 利用滑动窗口机制来实现流量控制,滑动窗口的基本原理已在第 3 章中介绍过(3.4.1),这里要介绍的是 TCP 如何使用窗口机制来实现流量控制。TCP 要求接收方维持一个接收窗口(rwnd),接收方根据当前接收缓存的大小,动态地调整接收窗口的大小,其大小反映了接收方的容量。接收方将其放在 TCP 报文段首部中的”窗口”字段,以通知发送方。发送方的发送窗口不能超过接收方给出的接收窗口值,以限制发送方向网络注入报文的速率。
利用可变窗口进行流量控制
王道的例子(利用接收窗口实现流量控制的过程 2016、2021 年考过):假设数据只从 A 发往 B,而 B 仅向 A 发送确认报文段,则 B 可通过设置确认报文段首部中的窗口字段来将 rwnd 通知给 A。rwnd 即接收方允许连续接收的能力,单位是字节。发送方 A 总是根据最新收到的 rwnd 值来限制自己发送窗口的大小,从而将未确认的数据量控制在 rwnd 大小之内,保证 A 不会使 B 的接收缓存溢出。设 A 向 B 发送数据,在连接建立时,B 告诉 A:“我的接收窗口 rwnd=400”。
sequenceDiagram participant A as 主机 A participant B as 主机 B A->>B: seq=1, DATA(1~100) A->>B: seq=101, DATA(101~200) A-xB: seq=201, DATA(丢失) B-->>A: ACK=1, ack=201, rwnd=300 Note over A: 允许发送 201~500 共 300 字节 A->>B: seq=301, DATA(301~400) A->>B: seq=401, DATA(401~500) Note over A: 不能再发送新数据 A->>B: seq=201, DATA(超时重传) B-->>A: ACK=1, ack=501, rwnd=100 Note over A: 允许发送 501~600 共 100 字节 A->>B: seq=501, DATA(501~600) B-->>A: ACK=1, ack=601, rwnd=0 Note over A: 不允许再发送
接收方 B 进行了三次流量控制,这三个报文段都设置了 ACK=1,只有在 ACK=1 时确认号字段才有意义。第一次把窗口减到 rwnd=300,第二次又减到 rwnd=100,最后减到 rwnd=0,即不允许发送方再发送数据。这使得发送方暂停发送的状态将持续到 B 重新发出一个新的窗口值为止。
注意第一次流量控制后 A 的状态:ack=201、rwnd=300 允许的是 201~500;A 已经发过 201~200 之外的哪些?201 号报文段丢失尚未确认,仍在窗口内,所以 A 能发的新数据只剩 301~500。窗口的左端由确认号决定,与”哪些报文段已经发过”无关。
持续计时器
TCP 为每个连接设有一个持续计时器,只要发送方收到对方的零窗口通知,就启动持续计时器。若计时器超时,就发送一个零窗口探测报文段,而对方就在确认这个探测报文段时给出现在的窗口值。若窗口仍然为零,则发送方收到确认报文段后就重新设置持续计时器。
之所以需要它,是因为接收方后来发出的”窗口已打开”的报文段可能丢失:接收方在等数据,发送方在等窗口,双方会一直等下去,形成死锁。持续计时器让发送方主动去问。
传输层与数据链路层的流量控制
| 传输层(TCP) | 数据链路层 | |
|---|---|---|
| 范围 | 端到端,即两个进程之间 | 两个中间的相邻节点之间 |
| 窗口大小 | 可以动态变化 | 不能动态变化 |
计算模板
发送方还能发送哪些字节
- 确定窗口左端:最近收到的确认号
。 - 确定窗口大小:
(只给了 rwnd 时就取 rwnd;cwnd 见 5.3.6)。 - 窗口覆盖的序号为
。 - 扣掉其中已经发送过(尚未确认)的部分,剩下的就是还能发送的序号范围;对应的字节数就是”还可以发送的最大字节数”。
边界
错题复盘:收到零窗口通知后启动的是持续计时器
错题复盘:还能发送的字节 = 窗口(从确认号算起)− 已发送但未被确认的
2021 年统考真题(王道 5.3.7 第 57 题):设主机甲通过 TCP 向主机乙发送数据,部分过程如上图所示。甲在
时刻发送一个序号 seq=501、封装 200B 数据的段,在 时刻收到乙发送的序号 seq=601、确认序号 ack_seq=501、接收窗口 rcvwnd=500B 的段,则甲在未收到新的确认段之前,可以继续向乙发送的数据序号范围是(A. 501~1000 B. 601~1100 C. 701~1000 D. 801~1100)。答案 C。 主机甲发送 200B 数据的段后,继续发送数据的段的序号 seq=701。因为甲收到乙发来的确认序号为 501、接收窗口为 500B 的段,即从序号 501 开始,甲累积还能发送 500B 的数据;因为甲此时已发送从序号 501 开始的 200B 数据,所以甲在未收到新的确认段之前,还能发送的数据字节数为
B,还能发送的数据序号范围是 701~1000。 两处容易被带偏:① 乙的确认序号仍是 501,说明乙还没有确认甲刚发出的那 200B,但这 200B 已经占掉了窗口,不能重复计算;② 乙报文段自己的 seq=601 是乙这个方向的序号,与甲能发多少毫无关系——选 B、D 都是把它当成了窗口的左端。
窗口从确认号算起。 窗口字段表示”从本报文段的确认号开始,还能接收多少字节”,不是从已发送数据的末尾开始。
窗口为零时仍可发送零窗口探测报文段和紧急数据。 零窗口只是不允许发送普通的新数据(5.3.2)。
流量控制由接收方决定发送量,拥塞控制由发送方自己检测网络决定。 两者同时存在时,发送窗口取两者较小值。
TCP 的窗口能动态变化,链路层的窗口不能。 这是两层流量控制的主要区别。
口径差异:零窗口探测报文段带不带数据
教材口径:持续计时器超时后,发送方发送一个零窗口探测报文段,对方在确认时给出现在的窗口值。
标准口径:零窗口探测报文段通常只携带 1 字节的数据(或者重发窗口外的 1 字节),这样接收方必须对它作出确认,从而带回当前的窗口值。探测的间隔也会按指数退避逐渐增大。
考试按教材口径作答。
对照速查
| 说法 | 对错 |
|---|---|
| 流量控制是让发送方的速率与接收方的读取速率匹配 | ✅ |
| 发送窗口可以超过接收方给出的接收窗口 | ❌ |
| rwnd 的单位是报文段 | ❌(字节) |
| 窗口值从确认号算起 | ✅ |
| 收到零窗口通知后启动重传计时器 | ❌(持续计时器) |
| 持续计时器超时后发送零窗口探测报文段 | ✅ |
| TCP 的流量控制是相邻节点之间的 | ❌(端到端) |
| 数据链路层滑动窗口的大小可以动态变化 | ❌ |
考点
- 接收窗口 rwnd 放在窗口字段中;发送窗口 ≤ rwnd
- 可变窗口的例子:确认号定左端、窗口值定长度(2016、2021)
- 持续计时器与零窗口探测报文段
- TCP 与链路层流量控制的区别:端到端、窗口可变
链接
- 🏠 返回总览:计算机网络第 5 章:传输层总览
- ⬅️ 上一节:5.3.4 TCP 可靠传输
- ➡️ 下一节:5.3.6 TCP 拥塞控制
- 🔗 3.4.1 流量控制与滑动窗口机制
- 📖 名词库:第 5 章名词库
