Summary

  • RFC 2001 treated three duplicate ACKs as a strong indication of a missing segment, not proof of why it was missing; fast retransmit acted before the retransmission timer expired.
  • Fast recovery temporarily set cwnd to ssthresh + 3 segments, added one segment for each further duplicate ACK, and removed that inflation when an ACK advanced to new data.
  • The feedback supports a narrow sender-side inference about data still moving and the receiver’s cumulative frontier. It does not certify path capacity, peer identity, application receipt or later delivery.

The third copy changed the sender’s authority

The first two duplicate acknowledgments leave a TCP sender in suspense. The receiving TCP has repeated the same next expected sequence number, but the sender cannot tell whether an earlier segment was lost or merely arrived behind later traffic. RFC 2001 made the third duplicate ACK the operational threshold. At that point the signal becomes strong enough to retransmit the apparent hole without waiting for the retransmission timer.

That choice is easy to misread as a verdict. It was an inference disciplined by a small count. RFC 2001 assumed ordinary reordering would generally produce only one or two duplicate ACKs before the delayed segment arrived and advanced the cumulative acknowledgment. The third repeat did not reveal a router, a queue or a cause. It changed what the sender was allowed to do under uncertainty.

This is where the four algorithms become one chain. Slow start probes an unknown path from a small congestion window. Congestion avoidance grows that sender-side limit more cautiously. Fast retransmit reacts to a particular ACK pattern. Fast recovery then avoids throwing away evidence that later segments are still leaving the network. The interest lies less in four names than in the transitions connecting them.

Two windows answer different questions

The receiver-advertised window reports how much data the receiving TCP is prepared to accept. The congestion window, cwnd, is the sender’s own limit based on perceived network conditions. RFC 2001 permits transmission only up to the smaller of the two. Buffer permission at the far end is therefore not treated as proof that routers and links in between can absorb the same burst.

The slow-start threshold, ssthresh, selects how the congestion window grows. Below the threshold, each ACK that advances new data can open the window quickly. Above it, congestion avoidance aims at roughly one segment of growth per round-trip time. Loss changes the regime because the sender must reduce pressure before testing for more capacity again.

A timeout supplies very little evidence of continued flow, so the RFC returns cwnd to one segment. Three duplicate ACKs carry a different fact pattern. The cumulative frontier is stuck, yet later segments have reached the receiving TCP. Fast recovery preserves that distinction.

What the repeated ACK actually reports

RFC 1122 allowed an immediate acknowledgment when a valid segment arrived in the receive window but not at its left edge. The ACK repeats RCV.NXT: the next sequence number the receiver expects. In ordinary cumulative-ACK terms, it says that bytes below that frontier are still incomplete while something later has arrived out of order.

This is more than silence, but less than a diagnosis. One repeat might reflect reordering. Two repeats might do the same. Three in a row gave RFC 2001 its practical loss threshold. The sender can point to an apparent missing segment because several later arrivals have failed to move the frontier.

The evidence remains local to the transport conversation. It does not say whether a bottleneck discarded the segment, a link damaged it, a path changed, feedback was duplicated, or the receiver behaved unexpectedly. It identifies a useful recovery hypothesis, not the physical history of the packet.

Inflation was temporary accounting

On the third duplicate ACK, RFC 2001 takes three linked actions. It sets ssthresh to half the current cwnd, with a floor of two segments. It retransmits the apparently missing segment. It then sets cwnd to ssthresh + 3*segsize.

The addition of three segments is not a reward and not a new estimate of the path’s capacity. Each duplicate ACK could be generated only after another segment reached the receiving TCP. The algorithm therefore treats three later segments as having left the network and entered the receiver’s buffer. Temporary inflation preserves room corresponding to those inferred departures while the original hole is repaired.

Every additional duplicate ACK adds one more segment to cwnd. If the resulting window permits, the sender may transmit another packet. Again the permission is conditional. The ACK supplies evidence that one more later segment has cleared the network, so the sender can replace that inferred departure without abruptly draining the ACK clock.

This is the subtle centre of fast recovery. A duplicate ACK does not increase the long-run sending rate. It lends the sender one unit of temporary accounting while the cumulative frontier is frozen.

The new-data ACK closes the loan

The temporary state ends when an acknowledgment covers new data. RFC 2001 then sets cwnd to ssthresh, removing the inflation accumulated from the three threshold ACKs and any later duplicates. The sender is left at roughly half the rate it had when loss was inferred, which the RFC identifies as congestion avoidance rather than a return to slow start.

The document expects this advancing ACK to acknowledge the retransmission and the intermediate segments already buffered at the receiver. “Expects” matters. A trace should not convert that sequence into omniscience. The sender sees the cumulative frontier move; it does not directly observe the receiver’s application, the route taken by each copy or the causal reason the ACK arrived at that moment.

Deflation separates recovery bookkeeping from lasting authority. The extra window existed only while duplicate ACKs supplied evidence of packets leaving the network. Once the hole closes, that exceptional allowance disappears.

A receipt chain, not a success badge

An auditable RFC 2001 trace should preserve distinct records: the repeated acknowledgment number, the duplicate count, outstanding sequence ranges, cwnd, ssthresh, the fast retransmit event, each temporary increment, the first ACK that advances new data and any later application-level confirmation. Collapsing these into a single “recovered” counter destroys the reason for the transition.

The strictest boundary comes from TCP itself. RFC 793 says a TCP acknowledgment does not guarantee delivery to the end user; it says the receiving TCP has accepted responsibility. A duplicate ACK proves even less: its cumulative frontier has not advanced. Three such ACKs justify a sender-side recovery action under RFC 2001’s assumptions. They do not prove that a person, process or durable store received anything.

They also do not authenticate the peer. RFC 2001’s security section offers no security analysis. Operational telemetry must therefore keep transport progress separate from identity, authorization and application completion.

Historical scope and sources

The RFC Editor record identifies RFC 2001 as W. Richard Stevens’s January 1997 Proposed Standard and marks it obsolete in favour of RFC 2581. The HTML and plain-text editions preserve the three-step fast-recovery algorithm; the IETF Datatracker preserves its document history. RFC 1122 supplies the out-of-order ACK context, while RFC 793 bounds what acknowledgment means. RFC 2581 is cited only for the obsolescence path.

This article does not claim that current stacks execute RFC 2001 verbatim. It does not compare modern algorithms, benchmark Reno, retell the timer lineage or turn later specifications into evidence about 1997. Its subject is the original ledger: receipt, inference, temporary permission, deflation—and the proof boundary between them.