简而言之,nagle算法主要目的是减少网络流量,当你发送的数据包太小时,TCP并不立即发送该数据包,而是缓存起来直到数据包
到达一定大小后才发送。(improving the efficiency of TCP/IP networks by reducing the number of packets that need to
be sent over the network.)
关于这个算法,我觉得wikipedia上讲的比较好。具体点说,当上层提交数据给TCP时,TCP觉得你的数据太小了(套用一般的例子,
如果你要发送1一个字节的数据,当附加上TCP和IP头后,数据包通常就会增加到41字节,那么这显然是低效的),就缓存你的数据,
当数据缓存到一定长度后,如果之前发送的数据得到了ACK确认且接收方有足够空间容纳数据,就发送这些数据,否则继续等待。
wikipedia上给了一段nagle的伪代码:
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
TCP socket提供了关闭nagle算法的接口,你可以通过TCP_NODELAY选项决定是否开启该算法。不过MSDN上建议不要关闭此算法。如果
你发送的数据不至于很小的话(<40byte),我也不建议你关闭。