TCP Reno is another variant of TCP that appeared after TCP Tahoe. We will observe the behaviour of TCP Reno in two major events: on a timeout and on duplicate ACKs.

  • On a timeout: enters Slow Start mode.


  • on receiving dup ACKs:
    • the missing segment is sent (TCP Fast Retransmit)
    • ssthresh ← cwnd/2
    • TCP enters Fast Recovery mode: cwnd ← cwnd/2 + #of dup ACKs received. This means that the window size increases by one for each dup ACK received. This is called Window Inflation, a technique that is part of Fast Recovery. Window Inflation lasts only during Fast Recovery. This is where the trick lies. Since Fast Retransmit takes a whole RTT, TCP Reno says “why not take the opportunity to send new data?” So since the “inflated” window size allow to send more outstanding segments (because its size is bigger than the old cwnd), then what happens is the sender sends new data without waiting for the next RTT. On the figure below, the window inflation is not shown.


  • When the ACK for the retransmitted segment is received (a good ACK), TCP exits Fast Recovery: the Window is Deflated and shrinks to cwnd ← old cwnd /2 (the old window size halved). If this window size allows for more outstanding segments to be sent, then the sender sends them. Now the sender waits for the segments sent during Fast Recovery to be ACKed. If a good ACK is received, TCP enters Congestion Avoidance state

The TCP Reno FSM is given here:


TCP Reno FSM © Stanford University

Note: Optimal window size = bandwidth * delay


TCP/IP Illustrated, Volume 1: The Protocols (2nd Edition)

Categories: Networking Basics

Keyboard Banger

Keyboard Banger is a network engineer from Africa. He has been working in network support and administration since 2008. He started writing study notes about certification exams and technology topics a couple of years ago. When he's not writing articles, he can be found wandering on technical forums.

1 Comment

Ruben · 23/01/2018 at 13:39


I am a bit unsure about the size of cwnd when timeout occurs. Is it updated to cwnd = 1 or should it be cwnd = 1*MSS? Same with fast recovery and dupack, shouldn’t it say cwnd += 1*MSS?

Leave a Reply

Your email address will not be published. Required fields are marked *