Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

流量控制

复习

  • 滑动窗口:允许连续发送多个尚未确认的数据
  • 序号与确认:接收方用确认告知收到进度
  • 超时与重传:保证数据最终被送达

TL;DR

  • 发送太快会压垮接收方
  • 接收方通过“通告窗口”告诉发送方自己还能收多少
  • 流量控制保护的是接收方
  • 它常与拥塞控制一起,共同限制发送速率

正文

  滑动窗口让发送方可以连续发。可如果它发得太猛,接收方会不会被“淹”了?

  会。接收方的处理能力和缓冲区都是有限的。如果发送速度长期超过接收速度,数据就会堆积,缓冲区一满,后来的就被丢掉,白白重传。

接收方说了算

  解决办法是让接收方来定“你能发多少”。

  接收方在每一次确认里,都会附带一个通告窗口(receive window),意思是:“我还能接受这么多字节,你先别超过这个数。”

  发送方于是把对方的通告窗口,作为自己滑动窗口的上限:

  • 通告窗口变小:发送方放慢,少发一些
  • 通告窗口变成 0:发送方暂停,不再发送新数据
  • 后来窗口重新变大:发送方再继续

  通过这种“随收随报”的方式,发送速度就能自动贴合接收方的处理能力。

保护谁,是两回事

  这里要分清两个容易混淆的概念:

  • 流量控制:怕把接收方压垮,由接收方通告窗口来限制
  • 拥塞控制:怕把网络压垮,由发送方根据网络的拥塞情况来调整

  两者都会限制发送速率,但保护的对象不同:一个是端点的缓冲区,一个是途中的链路和路由器。实际运行时,发送方的实际速率,通常是这两个限制里更紧的那一个决定的。

  这再次体现了网络设计的层次感:同一个“发多快”的问题,站在不同位置看,会有不同的约束,最后取最严的那条。

思考题 1

  流量控制与拥塞控制,保护的对象有什么不同?

思考题 2

  如果发送方无视接收方的通告窗口,一直猛发,会发生什么?

小结

知识点

  • 接收方缓冲区有限,发送太快会导致丢包
  • 通告窗口告诉发送方还能接收多少
  • 发送方的窗口受通告窗口限制
  • 流量控制保护接收方,拥塞控制保护网络

参考资料

  1. Wikipedia(zh):流量控制:防止发送方压垮接收方
  2. Wikipedia(zh):传输控制协议:窗口与流量控制机制

思考题答案(仅供参考)

思考题 1

  流量控制保护的是接收方的缓冲区,防止它来不及处理而被压垮;拥塞控制保护的是网络本身,防止过多数据涌入链路和路由器造成拥堵。两者都限制发送速率,但护的对象不同。

思考题 2

  接收方的缓冲区会很快被填满,之后收到的数据只能被丢弃。发送方发了却收不到确认,只好一遍遍重传,既浪费带宽又拖慢传输,整体效率反而更差。所以无视通告窗口,最终损害的是自己。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪