起因来自于短分组。接收方的TCP软件在TCP连接建立后将为该连接申请一定的缓冲空间,用于存放刚刚接收,且未被应用程序读取的数据。这个缓冲区的空闲区间决定了通知窗口的大小。
如果接收缓冲区被数据填满,而应用程序每次却只从中读取很少的数据,比如1个八位组,于是,缓冲区就空闲出1个八位组的空间。于是,接收方就会通知发送方有一个八位组的空间可用,即通知窗口大小为1。这将导致发送方在发送报文段时,数据区只能为1个八位组。与一个报文段的TCP首部的几十个八位组相比,数据传输显得效率十分低下。这种由于每个确认报文通告少量可用空间而导致每个报文段仅能携带少量数据的现象,称为糊涂窗口综合症。
可以分别从接收方和发送方两方面来解决这个问题。
接收方的策略有两种:
一种是当接收方收到报文段后立即进行确认,但是要等到缓冲区可用空间至少达到总空间的一半或达到最大报文段长度之后才发送更新的窗口通告。
另一种是推迟确认技术。在窗口大小不足以避免低效率的传输时,则推迟发送确认。这种方法的优点是可以降低通信量,提高吞吐率。但是其缺点是如果推迟时间太长,会导致报文段重传。反而浪费网络带宽,降低吞吐率。
发送方的策略是在已经传输出去的数据还没有得到确认之前,允许发送应用程序多次调用写数据操作,但是此时并不将数据立即发送出去,而是等数据收集形成一个较长的报文段或者之前发送数据的确认到达时才发送,这项技术称为组块技术。这项技术也根据其发明者的名字被称为Nagle算法。
以下动画可以演示Nagle算法的操作过程: