Summary
- TCP's cumulative acknowledgment makes a strong promise: every byte below this number has arrived. One missing segment freezes that promise even when later segments are safely queued.
- SACK adds negotiated reports of non-contiguous byte ranges. It helps the sender find holes without changing the ordinary acknowledgment field or transferring control of retransmission to the receiver.
- The report is bounded and advisory. The sender preserves its data, applies congestion rules and falls back to cumulative evidence if the receiver reneges or the option information disappears.
Seven segments behind one hole
Suppose a receiver expects byte 5000. The segment beginning at 5000 is lost, while seven later segments arrive and fill the range from 5500 to 9000. The ordinary acknowledgment still says 5000. That is not ignorance and not an error. It is a precise refusal to certify an unbroken stream when the first required bytes are absent.
For the sender, however, the same number repeated seven times is a poor map. It does not say whether everything after 5000 was lost, whether only the first segment is missing, or whether packets were reordered. Replaying the whole flight wastes capacity. Discovering each hole one round trip at a time wastes time. As TCP windows grew, several losses inside one flight made this ambiguity increasingly expensive.
The original TCP specification made the cumulative rule explicit. Every octet receives a sequence number, and acknowledgment X means all octets below X have been received. That compact promise is why buffers can eventually be released and streams can advance. Its strength also creates the blind spot: a receiver cannot move the left edge past a hole merely because it possesses later data.
An option before an implementation consensus
In October 1988, RFC 1072 proposed a way to add more information without redefining the base field. A SACK-Permitted option in the opening SYN would negotiate the feature. Later acknowledgments could carry a SACK option describing non-contiguous blocks already received and queued.
The design was not deployed as specified. RFC 2018 later recorded disagreement about its interaction with the window-shift option. That is an important piece of standards history: publication supplied a candidate syntax, not evidence that running systems had converged. The first design remained useful enough to revise, but a document date did not upgrade endpoints.
The 1996 revision kept the two-option structure and changed the representation. Each block now used full 32-bit left and right edges. The first edge is the first byte present; the right edge is the sequence number immediately after the last byte. In the example, the cumulative acknowledgment can remain 5000 while a SACK block reports [5500, 9000). The old promise and the new observation coexist in one packet.
A map too small to contain the whole receiver
TCP headers leave only 40 bytes for options. A SACK report uses two bytes of kind and length plus eight bytes per block, so it can list no more than four blocks by itself. With timestamps, the practical maximum is commonly three. A fragmented receive queue may contain more islands than the packet can describe.
RFC 2018 therefore gives priority to the block changed by the newest arrival and repeats recent blocks in later acknowledgments. Redundancy matters because acknowledgments can also be lost. The receiver does not publish a complete permanent ledger. It sends a bounded, rolling sketch from which the sender can accumulate a more useful picture.
This was an architectural economy. The wire format carried enough shared evidence to improve recovery without exporting the receiver's entire queue, implementation or memory policy. Different endpoints could keep different internal structures while agreeing on two sequence edges.
Advice is not final delivery
The specification calls SACK advisory. A receiver may later discard bytes it previously reported, a behavior known as reneging. The sender therefore may mark a range as selectively acknowledged and skip it during ordinary repair, but it must not free the original data merely because a SACK block mentioned it. Only advancement of the cumulative acknowledgment closes that obligation.
After a retransmission timeout, the sender must be prepared to disregard earlier SACK state and retransmit from the left edge. The fallback may appear conservative, yet it preserves a crucial distinction. A transient observation helps choose an action; it does not become an irrevocable receipt.
The distinction also limits power. A receiver can describe its queue, but it does not issue retransmission commands. The sender maintains the retransmission queue, combines reports, infers holes and decides which permitted segment to send next. RFC 6675 later described that sender-side state as a scoreboard and supplied a conservative algorithm for estimating how much data remains in the network.
Better evidence did not buy more capacity
SACK improved loss recovery, not congestion entitlement. RFC 2018 insisted that established congestion-control behavior remain in force. A single out-of-order report does not prove loss; the sender still needs an appropriate threshold. During recovery it limits new transmissions and reduces the congestion window when congestion evidence requires it.
That boundary separates this history from the 1986 congestion-collapse repair. Slow start and congestion avoidance decide how much a sender may place in the network. SACK helps decide which bytes are worth sending inside that allowance. A more accurate map is not a larger road.
In 2000, D-SACK extended the report to duplicates. A receiver could identify a byte range received more than once, helping a sender infer reordering, a lost acknowledgment, replication or a premature timeout. The document deliberately did not prescribe one reaction. It also warned that a sender cannot necessarily trust a receiver's report. New evidence created a better question, not an obedient actuator.
Sources and evidence limits
The base cumulative meaning comes from RFC 793. The first option design is RFC 1072; the deployed standards-track format and its limitations are in RFC 2018. Duplicate reporting is defined by RFC 2883, the congestion boundary by RFC 5681, the old proposal's later status by RFC 6247, and a conservative scoreboard recovery algorithm by RFC 6675.
These documents prove protocol definitions, lineage and stated limits. They do not establish one worldwide activation date, a universal performance gain or the location and cause of any particular packet loss. SACK reports receiver state claimed at one moment; it is neither authentication nor a durable delivery receipt.
Member Briefing
Deeper Profile Context
Sign in with the right membership level to unlock the full briefing and source notes.
Only for Strategic Circle
Strategic Circle
Open to all readers. Unlock profile briefings after joining and signing in.
Join Strategic CircleOnly for Leadership Alliance
Leadership Alliance
For qualified IP-asset owners and management; sign in to unlock alliance briefings.
Join Leadership Alliance
