The Nagle Algorithm for TCP Network Communication

The Nagle algorithm, named after engineer John Nagle, was designed to reduce network congestion caused by "small packet problems" with TCP applications. UNIX implementations began using Nagle's algorithm in the 1980s, and it remains a standard feature of TCP today.

How the Nagle Algorithm Works

Nagle's algorithm processes data on the sending side of TCP applications by a method called nagling. It detects small-sized messages and accumulates them into larger TCP packets before sending data across the wire, thereby avoiding the generation of unnecessarily large numbers of small packets.

The technical specification for Nagle's algorithm was published in 1984 as RFC 896. The decisions for much data to accumulate and how long to wait in between sends are critical to its overall performance.

Nagling can more efficiently utilize the bandwidth of a network connection at the expense of adding delays (latency). An example described in RFC 896 illustrates the potential bandwidth benefits and the reason for its creation:

  • A TCP application that intercepts keyboard keystrokes and wants to communicate each character being typed to a receiver, can generate a series of messages each containing 1 byte of data.
  • Before these messages can be sent across the network, each one must be packaged together with TCP header information as required by TCP/IP. Each header ranges in size between 20 and 60 bytes.
  • Without nagling, this example application would generate network messages consisting of 95% or more header information (at least 20 out of 21 bytes) and 5% or less actual data from the sender's keyboard. Using the Nagle algorithm, the same data could instead be delivered using many fewer messages and having 95% of the content being keyboard information - a very large bandwidth savings.

    Applications control their use of the Nagle algorithm with the TCP_NODELAY socket programming option. Windows, Linux, and Java systems all normally enable Nagle by default, so applications written for those environments need to specify TCP_NODELAY when wanting to switch the algorithm off.

    Limitations

    Nagle's algorithm is only usable with TCP.

    Other protocols including UDP do not support it.

    TCP applications that need fast network response, like Internet phone calling or first person shooter games, may not work well when Nagle is enabled. The delays caused while the algorithm takes extra time to assemble smaller chunks of data together can trigger noticeable lag visually on a screen or in a digital audio stream. These applications typically disable Nagle.

    This algorithm was originally developed at a time when computer networks supported much less bandwidth than they do today. The example described above was based on John Nagle's experiences at Ford Aerospace in the early 1980s, where nagling tradeoffs on their slow, heavily-loaded long distance network made good sense. There are increasingly fewer situations where network applications can benefit from his algorithm today.

    Was this page helpful?