什么是nagle算法,用来干什么的
是为了减少广域网的小分组数目,从而减小网络拥塞的出现;
该算法要求一个tcp连接上最多只能有一个未被确认的未完成的小分组,在该分组ack到达之前不能发送其他的小分组,tcp需要收集这些少量的分组,并在ack到来时以一个分组的方式发送出去;其中小分组的定义是小于MSS的任何分组;
Nagle算法只允许一个未被ACK的包存在于网络,它并不管包的大小,因此它事实上就是一个扩展的停-等协议,只不过它是基于包停-等的,而不是基于字节停-等的。Nagle算法完全由TCP协议的ACK机制决定,这会带来一些问题,比如如果对端ACK回复很快的话,Nagle事实上不会拼接太多的数据包,虽然避免了网络拥塞,网络总体的利用率依然很低。
延迟ACK
如果对每个包返回一个ACK确认包的话,代价过高,所以设置一个ACK确认定时器,在这段时间内,若有数据需要发送到对等方,则捎带ACK过去;若发现ACK在定时的这段时间内尚未发送,则单独发出一个ACK包
避免糊涂窗口综合症;
发送数据的时候将ack捎带发送,不必单独发送ack;
如果延迟时间内有多个数据段到达,那么允许协议栈发送一个ack确认多个报文段;
不好的情况
"写-写-读",两次发送的数据包均小于MSS,对等方延迟ACK,又由于nagle的限制,所以只能等到超时后,收到对等方单独的ACK包,有时需要关掉nagle算法。
如何关闭
使用TCP套接字选项TCP_NODELAY可以关闭套接字选项;
对比
实现
//TODO