TCP_NODELAY标志的作用是关闭
Nagle算法,其核心为发送延迟(RFC896)。在TCP/IP包的发送过程中,为了避免频繁发送小包(因为频发发送小包会造成的包头等资源浪费),所以采用了缓存,当数据积累到“
MSS: Maximum Segment Size 最大分段大小”后再发送。
MSS的大小一般为1460B,。当数据包大小==MSS时成为大包,其余为小包。根据Nalge算法,如果单纯的合并数据的话,那么发送的数据除了最后一个包都是大包,而最后一个包一般会是个小包,除非发送的数据恰好是MSS的整数倍。
这样虽然解决了过多小包的问题,但是这样也会产生新的问题,首先如果最后一个包是小包,那么小包在满足什么条件时会发送。
linux采用
TCP_NAGLE_CORK
来解决这个问题,该信号表示塞子有效并且还有数据过来
(
MSG_MORE),比如我在应用层一次写入1000B,那么假设当系统中只读取了500B的时候一定是MSG_MORE的状态。这样,只有当MSG_MORE的状态时我们才启用Nalge延迟发送的算法,否则就立即发送(当其他条件满足时)。
另外,比如FIN标记这样的包也应该被立刻发送,其原因不言自明。
在Nagle算法中还有一个需要注意的地方,就是由于Nagle算法是为看了
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26899445/viewspace-759632/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26899445/viewspace-759632/