1. Nagle 算法
在一个 Rlogin 连接上客户一般每次发送一个字节到服务器,这就产生了一些 41 字节长的分组:20 字节的 IP 首部、20 字节的 TCP 首部和 1 个字节的数据。在局域网上,这些小分组(被称为微小分组(tinygram))通常不会引起麻烦,因为局域网一般不会出现拥塞。但在广域网上,这些微小分组则会增加拥塞出现的可能。一个简单和好的方法就是采用 Nagle 算法。
Nagle 算法要求一个 TCP 连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反,TCP 收集这些少量的分组,并在确认到来时以一个分组的方式发出去。该算法的优越之处在于它是自适应的:确认到达得越快,数据也就发送得越快。而在希望减少微小分组数目的低速广域网上,则会发送更少的分组(小分组的含义是小于报文段的大小)。
2. TCP_NODELAY
有时我们需要关闭 Nagle 算法。一个典型的例子是 X 窗口系统服务器:小消息(鼠标移动)必须无时延地发送,以便为进行某种操作的交互用户提供实时的反馈。
另一个例子是:在一个交互注册过程中键入终端的一个特殊功能键。这个功能键通常可以产生多个字符序列,经常从 ASCII 码的转义(escape)字符开始。如果 TCP 每次得到一个字符,它很可能会发送序列中的第一个字符(ASCII 码的 ESC),然后缓存其他字符并等待对该字符的确认。但当服务器接收到该字符后,它并不发送确认,而是继续等待接收序列中的其他字符。这就会经常触发服务器的经受时延地确认算法,表示剩下的字符没有在 200ms 内发送。对交互用户而言,这将产生明显的时延。
TCP/IP 协议栈提供了 TCP_NODELAY 选项来关闭 Nagle 算法。