1. Nagle算法:
是为了减少广域网的小分组数目,从而减小网络拥塞的出现;该算法要求一个tcp连接上最多只能有一个未被确认的未完成的小分组,在该分组ack到达之前不能发送其他的小分组,tcp需要收集这些少量的分组,并在ack到来时以一个分组的方式发送出去;其中小分组的定义是小于MSS的任何分组;
该算法的优越之处在于它是自适应的,确认到达的越快,数据也就发哦送的越快;而在希望减少微小分组数目的低速广域网上,则会发送更少的分组.
2. 禁止Nagle和开启Nagle算法发送数据与确认示意图:
开启Nagle算法会导致TCP发送数据必须满足2个条件中的任意一个才会将数据发送出去:
1、达到TCP最大包长度(1500字节)
2、达到时间(测试下来是200ms)
这样在实时控制系统中,实时性不能得到满足,因此必须关闭Nagle算法。
关闭Nagle算法
Qt
TcpSocket tcpSocket;
tcpSocket.setSocketOption(QAbstractSocket::LowDelayOption, 1);
Linux
#include <netinet/tcp.h>
int on = 1;
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void *)&on, sizeof(int));