Why does TCP Reno cut the congestion window in half when I get duplicate ACKs

networkingtcp

I'm having a hard time understanding this conceptually.

Why does TCP Reno cut its congestion window in half when it detects triple duplicate ACKs and cuts its window to 1 segment when it times out?

I understand that Reno does this, but I'm not understanding exactly why. Any help?

Best Answer

The short answer

  • It makes your pipe full and improve your throughput.

The long answer

  • Compare to TCP Tahoe, which has only two state Slow Start and Congestion Avoidance, TCP Reno has another state called Fast Recovery.

  • On a triple duplicate Ack,TCP Reno transitions to Fast Recovery.

  • In the Fast Recovery state, it transitions back to Congestion Avoidance when it receives a new Ack, resetting the congestion window to be half of the congestion window size when it transitioned to the Fast Recovery state.

  • On a timeout, it returns to Slow Start just as in Congestion Avoidance.

  • On receiving a duplicate Ack, it increments the congestion window by 1. (Congestion Window Inflation)

The reason not entering Slow Start state (meaning reduce the congestion window to 1) because receiving duplicate Ack tells TCP more than just a packet has been lost. The receiver can only generate the duplicate Ack when another segment is received, that segment has left the network and is in the receiver's buffer.

So still having data flowing between the two ends, and TCP Reno doesn't want to reduce the flow suddenly.

By halving the congestion window, staying in the Congestion Avoidance state, TCP Reno improves network performance.

You can see a simple test about perfomance of TCP Reno and TCP Tahoe in this link.