Summary

  • TCP's cumulative acknowledgment advances only across an unbroken run of received bytes. SACK gave the receiver a way to name later blocks already in its queue while an earlier gap remained.
  • RFC 2018 allowed a receiver to discard bytes it had reported in a SACK option. The sender therefore kept its own copy until the cumulative acknowledgment advanced.

A clerk receives pages one, two and four of a report. The official stamp can reach page two; page three is missing. Page four is already on the desk, but the stamp cannot skip the hole. TCP's old cumulative acknowledgment worked much like that stamp. Selective acknowledgment added a note in the margin: page four is here. The catch was that the margin note did not turn a crowded temporary desk into permanent storage.

The 1988 proposal in RFC 1072 laid out the frustration for long-delay paths. After a gap, a sender with only cumulative acknowledgments had little information about later segments that had already arrived. It could wait a round trip to discover another missing segment or retransmit bytes the receiver already held. Selective reports promised to expose the pieces beyond the hole. RFC 1072 was a proposal for experimentation, and the eventual wire format came later.

October 1996's RFC 2018 made that extra report a TCP option. The receiver could send SACK only after its peer had advertised SACK-Permitted on the opening SYN. Each SACK block described a contiguous range of bytes received above the cumulative frontier. The ordinary acknowledgment number stayed in the TCP header, still marking the unbroken prefix. Two reports could now travel together: the firm frontier and the later islands.

The islands had to fit in a small envelope. TCP option space could not list every separate block in a busy receiver queue. RFC 2018 put the newest evidence first: the first SACK block described the block containing the segment that triggered the acknowledgment, unless that segment moved the cumulative number forward. The receiver was advised to include as many distinct blocks as it could and repeat recently reported blocks. Repetition gave a later report another chance to arrive if an earlier ACK went missing. A sender still had to interpret a partial, sometimes reordered list.

Then the specification took away the comforting picture of a filing cabinet. A receiver may discard queued out-of-order data it had reported through SACK, particularly under buffer pressure. RFC 2018 calls this reneging. Once old data is discarded, later SACK options cannot keep claiming those old blocks. The special first-block rule still makes the newest segment visible even when the receiver intends to drop it. A SACK block therefore records an arrival and a momentary queue state; it does not hand ownership of the only surviving copy to the receiver.

The rule for the sender was blunt. It must not discard bytes until the cumulative acknowledgment number covers them. It can use SACK to decide what to retransmit first and avoid sending a block that appears safely parked for now. It keeps the original bytes because the far end may empty its tray before the missing page arrives. That retention rule is the part of the story that rarely fits on a diagram of arrows and checkmarks. The protocol was negotiating useful knowledge without pretending every piece of knowledge was a final receipt.

July 2000's RFC 2883 gave the same option another job. D-SACK let a receiver report that duplicate data had arrived. It did not change the cumulative acknowledgment field or the schedule for sending ACKs. A duplicate might be mentioned in only one ACK; if that packet vanished, so did the report. Even the richer receipt had a delivery problem of its own.

SACK made a broken sequence easier to repair. It let the receiver point to later bytes instead of forcing the sender to guess that the whole tail was missing. RFC 2018 also protected a stubbornly practical truth: a temporary tray can be emptied. The sender was allowed to learn from the receiver's pencil marks. It was not allowed to throw away the pages until the official stamp caught up.