美文网首页
TCP流量控制

TCP流量控制

作者: 风亡小窝 | 来源:发表于2019-05-31 16:09 被阅读0次

TCP流量控制

如果应用程序读取数据的速度相对较慢,则发送者很容易通过过快的发送数据使连接的接收缓冲区溢出。

流量控制和拥塞控制所采取的行为很相似:调节发送者的发送速度

TCP通过发送者维持一个被称为“接收窗口”的变量来提供流量控制。接收窗口让发送者知道接收者还有多少可用的缓冲空间。

为了更好的理解接收窗口和发送缓冲区的关系,我们来定义几个变量。

  • RcvBuffer 接收缓冲区的大小
  • rwnd 接收窗口的大小
  • LastByteRead 应用程序进程从缓冲区读取的数据流中的最后一个字节的编号
  • LastByteRcvd 数据流中从网络到达并已放入接收缓冲区的最后一个字节的编号

因为TCP不允许分配的缓冲区溢出,所以我们必须有:

LastByteRcvd - LastByteRead <= RecvBuffer

rwnd = RcvBuffer - (LastByteRcvd - LastByteRead)

image.png

那么连接如何使用rwnd这个变量来提供流量控制服务呢?

主机B通过将其当前值rwnd放在它发送给A的每个段的接收窗口字段中,告诉主机A它在连接缓冲区中有多少可用空间。

注意:

这个方案存在一个小技术问题。 为了看到这一点,假设主机B的接收缓冲区已满,因此rwnd = 0.在向主机A发布rwnd = 0之后,还假设B没有任何内容可以发送给A.现在考虑一下这个问题。 当B处的应用程序进程清空缓冲区时,TCP不会向主机A发送带有新rwnd值的新段; 实际上,只有在有数据要发送或者有确认要发送的情况下,TCP才会向主机A发送一个段。 因此,主机A永远不会被告知在主机B的接收缓冲区中已经有一些可用空间 -——主机A被阻止并且不能再传输数据! 为了解决这个问题,TCP规范要求主机A在B的接收窗口为零时继续发送带有一个数据字节的段。 这些段将由接收方确认。 最终缓冲区将开始为空,并且确认将包含非零rwnd值。

相关文章

网友评论

      本文标题:TCP流量控制

      本文链接:https://www.haomeiwen.com/subject/umlgtctx.html