Octet

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 getsIt sendsSender sees
Seg 1ACK 1001
Seg 2ACK 2001
Seg 4ACK 2001 (SACK 3001-4001)Dup ACK 1
Seg 5ACK 2001 (SACK 3001-5001)Dup ACK 2
Seg 6ACK 2001 (SACK 3001-6001)Dup ACK 3: retransmit seg 3
Seg 3 (again)ACK 6001Hole filled, everything acknowledged

Wireshark labels these TCP Dup ACK and TCP Fast Retransmission.

Fast recovery (RFC 5681, Reno style)

  1. ssthresh = max(flight size / 2, 2 x MSS).
  2. Retransmit the lost segment.
  3. Keep sending new data as duplicate ACKs show segments leaving the network.
  4. 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.

Traps

  • Saying "three ACKs" trigger it. It is three duplicates, the fourth identical ACK in a row.