Nagle算法简介
只有收到前一数据的ACK消息时,Nagle算法才发送下一数据。
TCP默认开启Nagle算法进行数据传输,因此最大限度地进行缓冲,直到收到ACK。 如上图所示,为了发送字符串"Nagle",将其传递到输出缓冲,此时第一个字母"N"之前没有其他数据(没有需接收的ACK),因此立即传输。之后开始等待字母"N"的ACK消息,等待过程中,剩下的"agle"填入输出缓冲。接下来,收到字母"N"的ACK消息后,将输出缓冲的"agle"装入一个数据包发送。也就是说共需传递4个数据包以传输1个字符串。
当未开启Nagle算法时,假设字母"N"到"e"依序传到输出缓冲,此时的发送过程与ACK接收与否无关,因此数据到达输出缓冲后将立即被发送出去。也就是说共需传递10个数据包以传输1个字符串。
由此可知,不使用Nagle算法将对网络流量产生负面影响,即使只传输一个字节的数据,其头信息都有可能是几十个字节。因此,为了提高网络传输效率,必须使用Nagle算法。
何时不采用Nagle算法
当网络流量未受太大影响时,不使用Nagle算法要比使用它时传输速度快。
最典型的是"传输大文件数据",将文件数据传入输出缓冲不会花太多时间,因此,即使不使用Nagle算法,也会在装满输出缓冲时传输数据包,这不仅不会增加数据包的数量,反而会在无需等待ACK的前提下连续传输,因此可以大大提高传输速度。
禁用Nagle算法
Nagle算法使用与否在网络流量上差别不大,使用Nagle算法的传输速度更慢。
禁用方法:将套接字可选项中的TCP_NODELAY改为1(真)即可。