socket 选项 TCP_NODELAY、TCP_CORK、 TCP_QUICKACK,Nagle 算法

 一、简介:

TCP_NODELAY:关闭 Nagle 算法,控制的是数据的发送。

TCP_CORK:设置后不会发送任何小包(小于 mss)除非超时 200ms

TCP_QUICKACK: 从Linux 2.4.4开始,设置后会立刻发送确认 ACK,而不是延迟发送 ack。

Nagle 算法规定,如果包大于 MSS(Max Segment Size) 或含有 FIN 则立即发送,否则放入缓冲区,等已经发送的包被确认后后再发送。即网络上只能有一个未确认的小包。可以降低网络小包数量,减少了 ip 头部在网络上的比重,提升网络性能。
QUICKACK若未开启,则 Delay ack 延迟确认,使得协议有机会合并 ack,提高网络利用率,默认 40ms 超时确认,系统值可配置。

二、测试:

测试方法:server ip 192.168.x.5,client ip 192.168.x.7。sever 接受 client 连接,但是不做任何处理;client 与 server 建立连接后,连续发送 10 个字符,我们看下面的实例


1、server 端关闭 QUICKACK,client 端关闭 NODELAY(也就是会延迟发送):server 关闭了 quickack,故会等一个超时再确认或等到有数据发送顺带发送确认 ack,但 server 没数据发送,故等到 40ms 超时;由于 client 没有收到 server 端的确认 ack,且 nodelay 关闭,即开启了延迟发送,所以等收到 server 的 ack 后才继续发送剩余数据



2、server 端开启 QUICKACK,client 端开启 NODELAY(立刻发送):server 端收到一个数据后立刻发送确认给 client


3、server 端关闭 QUICKACK,client 端开启 NODELAY(立刻发送):client 不等确认连续发送 10 个字符,server 端在 10ms 后发送 ack。疑问:为什么是 10ms 后发送 ack”


4、server 端开启 QUICKACK,client 端关闭 NODELAY(也就是会延迟发送):server 收到数据后立刻发送确认给 client,client 将余下 9 个字符合并发送。


5、server 端关闭 QUICKACK,client 端开启 TCP_CORK:client 端发送 10 个字符,远小于 MSS,故等 200ms 超时后发送


三、总结:

延迟与带宽利用率不可兼得。若需要降低延迟,则应开启 QUICKACK、NODELAY;否则两者都关闭,提高带宽利用率。

Comments

Popular posts from this blog

Python Receiving and parse JSON Data via UDP protocol

ubus lua client method and event registration code demo/example