Flow Control
流量控制
流量控制解决的是:发送方不能把接收方压垮。
接收方收到数据后,要先放入接收缓存,再交给上层处理。若发送方连续发送太快,接收缓存可能被填满。缓存满了以后,即使后续数据在链路上传输时没有误码,接收方也可能无法接收。
流量控制不等于差错控制。差错控制关心数据是否出错;流量控制关心接收方是否有能力继续接收。
| 问题 | 发生原因 | 结果 |
|---|---|---|
| 差错控制 | 信道干扰、噪声、误码 | 数据内容不可靠 |
| 流量控制 | 发送过快、接收缓存或处理能力不足 | 正确到达的数据也可能被丢弃 |
接收缓存和发送限制
流量控制的核心是接收方让发送方知道自己还能发多少。
接收方能接收多少,取决于:
- 接收缓存还有多少空位。
- 已收到的数据能否及时交给上层。
- 协议允许接收方同时接收多少个未交付数据。
发送方要受限制:
- 不能无限制连续发送。
- 已发送但未确认的数据要占据发送窗口。
- 窗口满时,即使发送方还有数据,也必须等待确认或窗口更新。
停止等待是最保守的流量控制
停止-等待方式中,发送方每发送一个数据,就停下来等 ACK。
从窗口角度看:
$$
W_T=1,\quad W_R=1
$$
发送方同一时刻最多只有一个未确认数据在路上,接收方同一时刻只需要处理当前期待的数据。这样几乎不会给接收方造成缓存压力,但信道利用率很低。
滑动窗口是更一般的流量控制
滑动窗口允许发送方连续发送多个数据,但用窗口限制“已经发送、尚未确认”的数量。
窗口大小决定了流量控制的松紧:
| 窗口较小 | 窗口较大 |
|---|---|
| 接收方压力小 | 更能填满信道 |
| 发送方等待多 | 未确认数据多 |
| 信道利用率可能低 | 缓存和编号压力更大 |
窗口不是越大越好。窗口过小会浪费链路,窗口过大可能让接收方处理不过来,也可能让有限序号空间发生新旧数据混淆。
与可靠传输的关系
流量控制和可靠传输经常使用同一套窗口机制,但它们的目标不同。
- 流量控制使用窗口限制发送速度。
- 可靠传输使用确认、编号、缓存和重传保证交付结果。
因此可以这样理解:窗口本身先限制“能发多少”,在此基础上再配合 ACK、超时和重传处理“发出去后是否正确到达”。
可靠传输机制见 Reliable-Transmission;更一般的滑动窗口协议见 Sliding-Window。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Elian's blog page!