Interview Questions

What exactly does the Nagle algorithm do?

Unix Socket FAQ for Network programming


(Continued from previous question...)

What exactly does the Nagle algorithm do?

It groups together as much data as it can between ACK's from the other end of the connection.

This diagram is not intended to be complete, just to illustrate the point better...

Case 1: client writes 1 byte per write() call. The program on host B is tcpserver.c from the FAQ examples.


    CLIENT                          SERVER
APP      TCP          TCP             APP
               [connection setup omitted]

 "h" --------->          [1 byte]
               ------------------>
                       -----------> "h"
                           [ack delayed]
   "e" ---------> [Nagle alg.        .
                   now in effect]       .
   "l" ---------> [ditto]            .
   "l" ---------> [ditto]            .
   "o" ---------> [ditto]            .
   "\n"---------> [ditto]            .
                                        .
                                        .
                         [ack 1 byte]
                 <------------------
                  [send queued
                  data]
                          [5 bytes]
                  ------------------>
                ------------> "ello\n"
               <------------ "HELLO\n"
                   [6 bytes, ack 5 bytes]
                   <------------------
   "HELLO\n" <----
                [ack delayed]
                   .
                   .
                   .   [ack 6 bytes]
                    ------------------>

Total segments: 5. (If TCP_NODELAY was set, 
could have been up to 10.)
Time for response: 2*RTT, plus ack delay.

Case 2: client writes all data 
with one write() call.

   CLIENT                        SERVER
APP     TCP      TCP             APP
            [connection setup omitted]

 "hello\n" --->          [6 bytes]
                 ------------------>
             ------------> "hello\n"
             <------------ "HELLO\n"
                 [6 bytes, ack 6 bytes]
                 <------------------
        "HELLO\n" <----
                   [ack delayed]
                        .
                        .
                     .   [ack 6 bytes]
                ------------------>

  Total segments: 3.

Time for response = 
RTT (therefore minimum possible).

  Hope this makes things a bit clearer...

Note that in case 2, you don't 
want the implementation to gratuitously
delay sending the data, since that
would add straight onto the response time.

(Continued on next question...)

Other Interview Questions