windows在回复确认时的情况,在接收到 TCP 段的情况下,等待 200ms 再回复 ack,除非在这 200ms 里接收方也有数据要发给对方,于是就在发送数据的时候将 ack 捎带过去;(win10下现在是40ms)
而在Linux下,所有的延时的 ack,延时时间都在 40 ms 左右(从收到数据到发送 ack 之间的时间);
官方的说法是,当协议栈接受到TCP数据时,并不一定会立刻发送ACK响应,而是倾向于等待一个超时或者满足特殊条件时再发送;对于Linux实现,这些特殊条件如下:
1)收到的数据已经超过了 full frame size
2)或者处于快速回复模式
3)或者出现了乱序的包
4)或者接收窗口的数据足够多
如果接收方有数据回写,则ACK也会搭车一起发送;当以上条件都不满足时,接收方会延迟40ms再回应ACK;
有时候,我们不希望 ack 被延时发送,可以设置 TCP_NODELAY;