3.流量控制

3.流量控制

Posted by ZhaoLe on January 3, 2021

什么是TCP缓冲区

一条TCP连接的每侧主机都为连接设置了接受缓存,当TCP正确,按序的接受到字节数据后将放入缓存中。相关应用程序会从缓存中读取相关数据。但是不一定是数据一到达就立刻读取了,实际上,接收方可能正在忙于其他任务,会等一段时间去读取缓存,这个时候如果发送方继续过快,过大的发送数据就会快会使接受缓存溢出。

为什么需要流量控制

当数据到达接受缓存后,相关应用进程就会去读取数据,但由于接收方和发送方速度不匹配导致缓存溢出。TCO为它的应用程序提供了流量控制服务,用来消除发送速度过快使接收方缓存溢出。

什么是滑动窗口

TCP为它应用程序提供了流量控制服务,TCP连接的收发数据量是通过一组窗口结构来维护的。每个活动连接的两端都维护一个发送窗口结构和接受窗口结构。

接收方

1

  • 接受窗口的大小就是反馈给发送方提供窗口的大小。
  • 小于左边界和大于右边界的数据均被丢弃。只有当接受数据序列号等于左边界的时候,数据才会被存储并且窗口右移。

发送方

2

  • 提供窗口的大小是由接收端返回ACK中窗口大小(window size)提供的。
  • 窗口和左边界是无法左移的。窗口的右边界无法向左收缩.(RFC1122中不支持)

什么是零窗口

3 存在于TCP报头中,TCP是通过接收端通告来实现流量控制的,当窗口值为零,则可以有效的阻止发送端继续发送数据。直到接收端重新获得空间。

4 图片来源

由于window size 是接收端反馈而来,当零窗口的情况下接收端并不直到什么时候能恢复,所以当接收端又有了可用空间,会给发送端传输一个窗口更新。 这种窗口更新通常不包含数据(为纯ACK)。

由于传输窗口更新ACK不能保证其可靠性,所以发送方会采用一个持续计时器间歇性的查询接收端,检查窗口是否增长。持续计时器会触发窗口探测(window probe)的传输。强制要求接收端返回ACK,同时采用丢失重传的方式保证其可靠性。

什么是糊涂窗口综合征(Silly Window Syndrome ,SWS)

如果接收方处理数据速率过慢,来不及从接受缓存中取走数据,那么会导致发送发的窗口越来越小。有时会使的传输数据小于数据包头大小,使得数据传输极为低效。特别使用非固定段的大小的时候容易陷入糊涂窗口的综合征。

糊涂窗口综合征是如何触发的

SWS是由连接的任何一方引起的。接收方发送较小的窗口通告,发送方发送较小的短数据都会引起该问题。

在糊涂窗口综合征期间,通信效率几乎为零,所以持续时间应该尽可能的短。

如何解决糊涂窗口综合征

如果由接收端引发的:收到数据导致窗口小于某个值,可以直接返回0到发送端。把窗口给关闭了,组织发送端再次发送数据。直到接收端处理完数据后窗口大小大于MSS或者缓存中有一半为空。就可以把window打开。 如果是发送端引发的:使用Nagle算法,触发这个算法必须要满足两个调节 1:窗口大小>= MSS 后者 数据大小 >= MSS。 2: 收到之前发送数据的ack回包才发数据,否则就是在攒数据


资料引用

  • [TCP 的那些事儿(下) 酷 壳 - CoolShell](https://coolshell.cn/articles/11609.html)
  • 《TCP/IP 详解卷1》
  • 《计算机网络 自顶向下方法(第七版)》