糊涂窗口综合症

糊涂窗口综合症（Silly window syndrome），亦称愚蠢窗口综合症、愚笨窗口综合症，是TCP实现不良导致的一种计算机网络问题。当发送程序缓慢地生产数据，接收程序缓慢地消耗数据，或者两者同时存在时，滑动窗口运作会出现严重问题。如果一个服务器无法处理所有传入的数据而存在此问题，它会要求客户端减少一次发送的数据量（TCP網路封包的滑动窗口）。如果服务器仍然无法处理所有传入的数据，窗口会随此问题越来越小，有时甚至将使传输数据小于数据包头，使数据传输变得极为低效。这个问题的名字取自窗口缩小到“愚蠢”的值。当该综合症发生时，连接上交换的数据段是小数据段而不是全尺寸的数据段。

基于窗口的流量控制网络协议，特别是使用非固定段大小的（例如TCP），都有可能陷入糊涂窗口综合症。

处理每个封包都存在一定量的，封包数增加会增加网络通信的开销，可能使数据处理量进一步减少。最终的结果就是。

 描述 
SWS 可能由 TCP 连接的任何一方引起：接收方应该等到可以发较大窗口通告再发窗口通告，但是没有等而发了小窗口公告；发送方应该等到数据够多的时候一次性发送一个较大的段，但是没有等而发了较小的段。

 解决方案 
当发送者与接收者之间没有就数据流量或数据包大小的容量同步时，则会发生窗口综合症问题。如果糊涂窗口综合症是由发送方产生，则納格算法发挥作用。 納格的解决方案要求发送方发送第一个，即使它是小的，然后就等待直至收到一个ACK，或者累积到最大大小段（MSS）。如果糊涂窗口综合症由接收方产生，则发挥作用。Clark的解决方案是关闭窗口，直到接收到最大段大小（MSS）的另一个段，或者缓冲区为半空。

糊涂窗口综合症的成因有三种：
 当服务器宣布空闲空间为0
 当客户端每次只能生成1个字节
 当服务器一次只能消耗1个字节

在糊涂窗口综合症期间，通信效率几乎为零，因此该问题的持续时间应尽可能短。

TCP 的实现要满足以下规则：

 接收方 TCP 不能通告小窗口。中定义的接收算法是不通告比当前正被通告的窗口大的段(可以是0)，直到窗口可以增加一个全尺寸段(即接收MSS)或者增加接收方缓冲区的一半大，以较小者为准。在两种情况下，该规则可以发挥作用: 当缓冲区中的部分数据已被应用程序消费而缓冲区可用时，以及当TCP必须响应窗口探测时。
 发送方 TCP 不能发送过小的段，納格算法发挥作用。发送方只有以下情况才能发送段
 待发送的数据为一个全尺寸的段。
 TCP 可以发送大小至少为另一端在此连接上通告的最大窗口大小的一半。
 納格算法启动的情况下，TCP 在没有急需 ACK 的数据的情况下，TCP 可以发送任何它必须立即发送的数据。

其中 2.1 是最直截了当的，直接避免了段的开销过高的问题。2.2 避免主机总是通告过小的窗口。2.3 避免 TCP 在有急需 ACK 的数据的情况下还发送比较小的段。如果发送方应用程序一直在往连接写入大小很小的数据，2.3 可以避免糊涂窗口。2.2 要求发送方记录接收方通告的最大窗口。

納格算法禁止我们在有急需ACK数据的情况下发送过小的段，那么納格算法中的小指的是多小呢？2.1 说明大小不能小于SMSS（接收方的MSS或者不超过PMTU的最大包大小）。

 发送端糊涂窗口避免 
一种发送TCP的启发法方法是必须允许发送程序执行“写”调用，并在发送大段之前收集每个调用传送的数据。发送TCP将延迟发送段，直到它累积起合理数量的数据。这被称为聚集（clumping）。

 接收端糊涂窗口避免 
一种接收端的启发式方法是维护可用窗口的内部记录，并且延迟向发送方宣告增加窗口大小，直到可以推进显着的量。该数量取决于接收端的緩衝器大小和最大段大小。通过此方法可以防止接收端程序缓慢提取八位元組数据时宣告小窗口。

 參考資料 



 外部链接 
 Explanation of the silly window syndrome 
 Recommended sender- and client-side solutions to silly window syndrome
Category:TCP协议