TCP流量控制
如果应用程序读取数据的速度相对较慢,则发送者很容易通过过快的发送数据使连接的接收缓冲区溢出。
流量控制和拥塞控制所采取的行为很相似:调节发送者的发送速度
TCP通过发送者维持一个被称为“接收窗口”的变量来提供流量控制。接收窗口让发送者知道接收者还有多少可用的缓冲空间。
为了更好的理解接收窗口和发送缓冲区的关系,我们来定义几个变量。
- RcvBuffer 接收缓冲区的大小
- rwnd 接收窗口的大小
- LastByteRead 应用程序进程从缓冲区读取的数据流中的最后一个字节的编号
- LastByteRcvd 数据流中从网络到达并已放入接收缓冲区的最后一个字节的编号
因为TCP不允许分配的缓冲区溢出,所以我们必须有:
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值。
网友评论