TCP_QUICKACK is needed for TCP_NODELAY (--no-delay) to be efficient.

Author: enihcamCreated Aug 8, 2020Updated Jun 17, 2026
Labelsenhancement

Nagle's algorithms conflicts with TCP Delayed ACK mechanism. TCP_QUICKACK is the only way to disable TCP Delayed ACK. Also, according to TCP Optimization Guide by ExtraHop, TCP_QUICKACK should be enabled "almost always".

Delayed ACK interacts terribly with Nagle's algorithm, which is turned on by default for many systems. This means enabling Delayed ACK might have unforeseen consequences that would be difficult to diagnose or pinpoint (especially if you have a heterogeneous traffic mix across multiple switches, routers, and VLANs). Beyond that, Delayed ACK just isn't that efficient. At best, you're getting a threefold reduction in network overhead. Using Nagle's algorithm by itself can yield 40x improvement in header to payload ratio, but turning on delayed ACK and Nagle's algorithm at the same time negates the value of both.

TCP_QUICKACK offers some of the benefits, and none of the downsides, of TCP_NODELAY. John Nagle himself, the creator of Nagle's algorithm, had this to say on a comment thread comparing TCP_NODELAY to TCP_QUICKACK: "Set TCP_QUICKACK. If you find a case where that makes things worse, let me know."

Hence the proposal here is to enable TCP_QUICKACK together with TCP_NODELAY (--no-delay).

What version of shadowsocks-libev are you using?

3.3.4

What operating system are you using?

Archlinux

What did you do?

I found in the shadowsocks code that TCP_QUICKACK is not enabled.

What did you expect to see?

For --no-delay option, enable both TCP_NODELAY and TCP_QUICKACK.

What did you see instead?

TCP_QUICKACK is not enabled.

What is your config in detail (with all sensitive info masked)?

I use --no-delay.

Source: shadowsocks/shadowsocks-libev