What is fast retransmit, why three duplicate ACKs, and what happens to the congestion window afterwards?
Show the answer
Say this first
When one segment is lost, every later segment that arrives makes the receiver repeat the same ACK for the missing byte. After three duplicate ACKs, the fourth identical ACK in a row, the sender retransmits the missing segment at once instead of waiting for the RTO. Three is the threshold because reordering commonly causes one or two duplicates. Then fast recovery cuts ssthresh to about half the flight size (to 0.7 times with CUBIC) and continues from there instead of dropping to one segment.
Go deeper
Worked example
The sender sends segments 1 to 6, each 1,000 bytes, starting at byte 1. Segment 3 (bytes 2001 to 3000) is lost.
| Receiver gets | It sends | Sender sees |
|---|---|---|
| Seg 1 | ACK 1001 | |
| Seg 2 | ACK 2001 | |
| Seg 4 | ACK 2001 (SACK 3001-4001) | Dup ACK 1 |
| Seg 5 | ACK 2001 (SACK 3001-5001) | Dup ACK 2 |
| Seg 6 | ACK 2001 (SACK 3001-6001) | Dup ACK 3: retransmit seg 3 |
| Seg 3 (again) | ACK 6001 | Hole filled, everything acknowledged |
Wireshark labels these TCP Dup ACK and TCP Fast Retransmission.
Fast recovery (RFC 5681, Reno style)
- ssthresh = max(flight size / 2, 2 x MSS).
- Retransmit the lost segment.
- Keep sending new data as duplicate ACKs show segments leaving the network.
- When new data is acknowledged, set cwnd to ssthresh and continue in congestion avoidance.
NewReno handles several losses in one window. SACK tells the sender exactly which blocks are missing. Linux now detects loss by time with RACK-TLP (RFC 8985) rather than only counting duplicates, which copes better with reordering, and paces the reduction with proportional rate reduction.
They will ask next
Why is per-packet load balancing bad for TCP?
It reorders segments within a flow. Reordering creates duplicate ACKs, which trigger spurious fast retransmits and needless window cuts. Per-flow hashing keeps a flow on one path.
What happens if there are not enough segments in flight to produce three duplicates?
With a small window or at the end of a transfer there may be fewer than three later segments, so only the RTO or a tail loss probe can recover. Limited transmit (RFC 3042) lets the sender send new segments on the first two duplicate ACKs to help generate the third.
Traps
- Saying "three ACKs" trigger it. It is three duplicates, the fourth identical ACK in a row.