“ACK ” means “I have everything through — one number naming a contiguous prefix of the stream. So a receiver holding bytes and must acknowledge 199, not 399, even though it physically holds the later bytes.

Acknowledging 399 would assert that arrived. The sender would then clear those bytes from its buffer, and they’d be lost permanently — both sides believing success. The cumulative ACK’s contiguity is what makes it safe.

Two things fall out of this design:

  • The receiver re-sends ACK 199 as more out-of-order data arrives. Those duplicate ACKs tell the sender data is still flowing but a specific gap isn’t filling — three duplicate ACKs trigger fast retransmit without waiting for the timer (RFC 5681 §3.2). A limitation became a loss signal.
  • The receiver can’t say it already holds , risking needless retransmission of those bytes. Hence SACK (RFC 2018), a later option that reports the islands past the gap.

Once the gap fills, the ACK jumps 199 → 399 in a single step.

See also

References

Questions

flashcards/software-engineering/networking

What does a cumulative “ACK N” assert?::That the receiver has everything through byte N — a contiguous prefix; it cannot ACK past a gap even if it holds later bytes

Why can’t a receiver ACK bytes it holds past a gap?::Doing so would assert the gap arrived; the sender would clear those bytes from its buffer and they’d be lost permanently

Three duplicate ACKs signal a specific unfilled gap and trigger fast retransmit without waiting for the timeout.

What does SACK add on top of cumulative ACKs?::A way to report the islands of data already held past the gap, avoiding needless retransmission