| # | Event | Transition | cwnd | ssthresh | What happened |
|---|
| State | Event | Action | Next |
|---|---|---|---|
| Slow start | new ACK | cwnd += MSS | SS → CA once cwnd ≥ ssthresh |
| Slow start | 3 dup ACKs | ssthresh = cwnd/2, cwnd = ssthresh + 3, fast retransmit | FR |
| Congestion avoidance | new ACK | cwnd += MSS·MSS/cwnd | CA |
| Congestion avoidance | 3 dup ACKs | ssthresh = cwnd/2, cwnd = ssthresh + 3, fast retransmit | FR |
| Fast recovery | dup ACK | cwnd += MSS (inflate) | FR |
| Fast recovery | new ACK | cwnd = ssthresh (deflate) | CA |
| any state | timeout | ssthresh = cwnd/2, cwnd = 1 MSS, retransmit | SS |
ssthresh uses max(cwnd/2, 2) here — real TCPs floor the window at ~2 MSS.