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:
Note: Optimal window size = bandwidth * delay