TCP交换数据流——Nagle算法简单记录

Nagle算法:

     该算法提出的目的是想解决网络中大量的小的TCP数据包造成网络拥塞的问题,举个例子,当客户端要发送一个字节的TCP数据包到服务器时,我们实际上产生了41字节长的分组:包括20字节的IP首部,20字节的TCP首部以及1个字节的数据。这被称为微小分组。这种情况下,有效传输通道的利用率只有1/40 

      Nagle算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,也就是说,当A想要向B很多报文时,A不能一次性发完,必须要等待B发送第一个分组的确认,A收到该确认之后才能发第二个分组。

 

Nagle算法用伪代码的形式可以表示如下:


<span style="font-size:14px;">if there is new data to send
  if the window size >= MSS and available data is >= MSS
    send complete MSS segment now
  else
    if there is unconfirmed data still in the pipe
      enqueue data in the buffer until an acknowledge is received
    else
      send data immediately
    end if
  end if
end if</span>


参考资料:http://blog.csdn.net/louiswang2009/article/details/7772346

 

       在有些情况下,我们需要关闭Nagle算法,例如:对时延要求较高的鼠标移动响应、窗口程序、X窗口系统服务器等。Socket API用户可以使用TCP_NODELAY选项来关闭Nagle算法。

       在TCP/IP详解中,个人认为P205的例子翻译可能有些问题,与图19-8不符,开启Nagle算法会产生2秒的延时的问题,可能会产生数据的丢失,由此引发TCP的超时和重传。如P207所述,“当进行多字节的按键输入时,默认使用Nagle算法会引起额外的延时”。


经受时延确认算法:

        

  简单的说,就是在上图中,如果服务器回复客户的数据报23的时间间隔小于200ms,那么它们将被合并成一个报文进行发送。




原文地址:https://www.cnblogs.com/webber1992/p/5850763.html