Go-Back-N Automatic Repeat reQuest
Cumulative Acknowledgments
Read aloud is unavailable in this browser.
The Power of Cumulative Semantics
In reliable data transfer protocols, acknowledgments serve as the fundamental feedback mechanism confirming successful frame reception. However, not all acknowledgment schemes are created equal. While individual (selective) acknowledgments explicitly confirm each frame independently, Go-Back-N employs cumulative acknowledgments—a semantically richer approach where a single ACK carries information about multiple frames.
Cumulative acknowledgments are not merely an implementation choice; they represent a profound design decision with far-reaching implications for protocol efficiency, robustness to ACK loss, and implementation complexity. Understanding cumulative ACK semantics is essential for mastering Go-Back-N and provides insight into TCP's acknowledgment mechanisms, which share the same fundamental principle.
This page dissects cumulative acknowledgments from first principles: their precise semantics, mathematical properties, practical advantages, edge cases, and the subtle ways they interact with the sliding window mechanism.
By the end of this page, you will understand the formal semantics of cumulative acknowledgments, why they provide natural tolerance to ACK loss, how they simplify sender state management, their relationship to window advancement, and how to trace through complex scenarios involving ACK loss and reordering.
Formal Semantics of Cumulative ACKs
Definition:
In Go-Back-N, when the receiver sends ACK(n), it asserts:
"I have correctly received all frames with sequence numbers 0, 1, 2, ..., n in order, and I have delivered them to my upper layer. I am now expecting frame n+1."
This single acknowledgment carries information equivalent to n+1 individual acknowledgments. It is cumulative because it implicitly acknowledges all frames up to and including the specified sequence number.
Formal Properties:
Let ACK(n) denote an acknowledgment for sequence number n. The cumulative semantics imply:
- Monotonicity: If
ACK(n)has been sent, then for all k ≤ n, frame k has been received correctly - Subsumption:
ACK(n)subsumesACK(k)for all k < n (i.e.,ACK(n)provides strictly more information) - Ordering: ACKs are logically monotonically increasing; once
ACK(n)is valid,ACK(k)for k < n is redundant - Atomicity: There is no partial acknowledgment; either all frames ≤ n are acknowledged, or
ACK(n)is not valid
Some protocol specifications define ACK(n) as "I expect frame n next" rather than "I have received up to frame n." This is merely a convention difference—if ACK means "expecting n," then it implies frames 0 through n-1 are received. GBN implementations may use either convention; what matters is consistency between sender and receiver interpretations.
| Aspect | Cumulative ACK | Selective ACK (SACK) |
|---|---|---|
| ACK(5) means | Frames 0-5 all received | Only frame 5 received |
| Information content | Multi-frame (implicit) | Single-frame (explicit) |
| ACK loss tolerance | High (later ACK recovers) | Low (each ACK independent) |
| Sender state tracking | Single variable (send_base) | Bitmap or list per frame |
| Bandwidth overhead | Lower (fewer ACKs needed) | Higher (more ACKs needed) |
| Gap reporting | Cannot report gaps | Can report non-contiguous receipt |
| Used in | GBN, TCP (base) | SR, TCP SACK extension |
Mathematical Representation:
Let R(t) denote the set of sequence numbers correctly received by time t. In Go-Back-N with cumulative ACKs:
- At any time t, R(t) = {0, 1, 2, ..., k} for some k ≥ -1 (where k = -1 means no frames received)
- The receiver sends ACK(k) where k = max(R(t))
- R(t) is always a contiguous prefix of the natural numbers
This contiguity property is enforced by the receiver discarding out-of-order frames. If the receiver accepted out-of-order frames, R(t) could have gaps, and cumulative ACKs would be insufficient to report the reception status accurately.
Robustness to ACK Loss
One of the most powerful properties of cumulative acknowledgments is their natural tolerance to ACK loss. This robustness arises directly from the subsumption property: if ACK(n) is received, all information from ACK(0) through ACK(n-1) is recovered.
Scenario: Lost ACKs in Go-Back-N
Consider the sender transmits frames 0, 1, 2, 3, 4 with window size N = 5. The receiver correctly receives all frames and sends ACK(0), ACK(1), ACK(2), ACK(3), ACK(4). However, ACK(0), ACK(1), and ACK(2) are lost in transit. Only ACK(3) and ACK(4) arrive at the sender.
What the receiver sent:
- ACK(0) — lost ✗
- ACK(1) — lost ✗
- ACK(2) — lost ✗
- ACK(3) — received ✓
- ACK(4) — received ✓
What the sender concludes from ACK(3):
- Frames 0, 1, 2, 3 are all received
- Can advance send_base from 0 to 4
- Frames 0, 1, 2, 3 can be removed from buffer
- Window slides forward by 4 positions
Despite losing 3 out of 5 ACKs (60% ACK loss rate!), the protocol operates correctly. The sender doesn't retransmit frames 0, 1, 2 because ACK(3) implicitly confirms their receipt. This is the power of cumulative semantics—a single successful acknowledgment can recover information from multiple lost acknowledgments.
Contrast with Selective ACKs:
If the protocol used selective (individual) acknowledgments, losing ACK(0), ACK(1), ACK(2) would be catastrophic. The sender would have no confirmation for frames 0, 1, 2 and would eventually time out and retransmit them—even though they were correctly received. This wastes bandwidth and increases latency.
Formal Analysis:
Let p be the probability of ACK loss. In a system with selective ACKs, a frame requires retransmission if its ACK is lost. Expected transmissions per frame = 1/(1-p).
With cumulative ACKs, a frame requires retransmission only if ALL subsequent ACKs are lost (i.e., no later ACK arrives before timeout). If we send k frames after frame n, frame n needs retransmission only if ACK(n), ACK(n+1), ..., ACK(n+k) are all lost. Probability = p^(k+1).
For even moderate k (say, k = 5 frames before timeout), and p = 0.1:
- Selective: 10% of frames need retransmission
- Cumulative: 0.000001% of frames need retransmission
This dramatic difference demonstrates why cumulative ACKs provide superior ACK loss tolerance.
- •Reduced unnecessary retransmissions — Frames aren't resent just because their specific ACK was lost
- •Lower sensitivity to reverse path quality — Protocol tolerates degraded ACK channel
- •Improved effective throughput — Bandwidth isn't wasted on redundant data
- •Simplified timeout handling — No need to maintain per-ACK timeout tracking
- •Natural integration with pipelining — Fits well with multiple outstanding frames
Window Advancement with Cumulative ACKs
Cumulative acknowledgments directly drive the sliding window mechanism. When an ACK arrives, the sender's window advances proportionally, potentially opening space for multiple new frames to be transmitted.
Window Update Algorithm:
on_receive_ack(ack_num):
if ack_num >= send_base: // Valid cumulative ACK
frames_acked = ack_num - send_base + 1
send_base = ack_num + 1 // Advance window left edge
// Now we can send 'frames_acked' new frames
// (assuming upper layer has data to send)
for i in range(frames_acked):
if upper_layer_has_data():
transmit_next_frame()
Example: Window Dynamics
Consider window size N = 4, initial send_base = 0, and frames 0-7 to send.
| State | Action | send_base | nextseqnum | Outstanding | Can Send |
|---|---|---|---|---|---|
| Initial | — | 0 | 0 | {} | 4 |
| Send 0,1,2,3 | — | 0 | 4 | {0,1,2,3} | 0 |
| Recv ACK(1) | Advance by 2 | 2 | 4 | {2,3} | 2 |
| Send 4,5 | — | 2 | 6 | {2,3,4,5} | 0 |
| Recv ACK(4) | Advance by 3 | 5 | 6 | {5} | 3 |
| Send 6,7 | — | 5 | 8 | {5,6,7} | 1 |
| Recv ACK(7) | Advance by 3 | 8 | 8 | {} | 4 |
Notice how a single ACK can advance the window by multiple positions. When ACK(4) arrives at send_base=2, the window advances by 3 (acknowledging frames 2, 3, 4). This burst advancement is more efficient than incremental advancement and is a direct benefit of cumulative semantics.
Interaction with Delayed ACKs:
In practice, receivers often delay ACKs to reduce the number of acknowledgment packets. Instead of sending ACK(n) immediately upon receiving frame n, the receiver might:
- Wait for additional frames — If frame n+1 arrives shortly, send ACK(n+1) instead
- Piggyback on data — If receiver has data to send, include ACK in the data frame
- Use a delayed ACK timer — Send ACK after a short delay (e.g., 200ms) or after every 2nd frame
Cumulative ACKs work seamlessly with delayed acknowledgments. If the receiver delays ACK(n) and frame n+1 arrives, it can send only ACK(n+1), effectively combining two acknowledgments into one. The sender receives full information despite fewer ACK packets.
This is particularly valuable for asymmetric channels where the reverse path (receiver → sender) has limited bandwidth. Reducing ACK traffic improves overall channel efficiency.
Duplicate ACKs as Error Signals
While cumulative ACKs cannot directly report reception gaps (unlike SACKs), they provide an indirect mechanism for error detection: duplicate acknowledgments.
Definition:
A duplicate ACK is an acknowledgment with the same sequence number as a previously received ACK (where the receiver has already advanced past that point but continues to receive out-of-order frames).
How Duplicate ACKs Arise:
When the receiver expects frame n but receives frame n+1 (because frame n was lost or delayed):
- Receiver discards frame n+1 (Go-Back-N receiver behavior)
- Receiver sends ACK(n-1) — acknowledging up to the last in-order frame
- If frame n+2 arrives (still expecting n), receiver again sends ACK(n-1)
- Each out-of-order arrival generates another ACK(n-1)
The sender receives multiple ACK(n-1) packets— these are duplicate ACKs.
Interpreting Duplicate ACKs:
Duplicate ACKs signal a potential problem:
- 1-2 duplicates: Could be reordering in the network; not necessarily a loss
- 3+ duplicates: Strong indication that a frame was lost and subsequent frames are arriving
This interpretation inspired TCP Fast Retransmit: upon receiving 3 duplicate ACKs, TCP retransmits the presumed lost segment without waiting for timeout.
In classic Go-Back-N, duplicate ACKs are typically ignored—the sender waits for timeout before retransmitting. This is simpler but slower to recover from errors. Enhanced GBN implementations can use duplicate ACKs to trigger early retransmission, improving performance on lossy channels.
Example: Duplicate ACK Generation
Sender transmits frames 0, 1, 2, 3, 4 (window N = 5). Frame 2 is lost.
| Receiver Gets | Receiver Action | ACK Sent |
|---|---|---|
| Frame 0 | Accept, deliver | ACK(0) |
| Frame 1 | Accept, deliver | ACK(1) |
| Frame 3 | Discard (expected 2) | ACK(1) ← duplicate |
| Frame 4 | Discard (expected 2) | ACK(1) ← duplicate |
The sender receives: ACK(0), ACK(1), ACK(1), ACK(1).
Three ACK(1)s confirm that:
- Frames 0 and 1 were received
- Frame 2 (or later) is missing
- Frames after 2 are arriving (hence the duplicate ACKs)
Using Duplicate ACKs for Fast Retransmit (Enhancement):
on_receive_ack(ack_num):
if ack_num == last_ack_received:
dup_ack_count++
if dup_ack_count >= 3:
// Fast retransmit: don't wait for timeout
retransmit_from(ack_num + 1)
dup_ack_count = 0
else:
last_ack_received = ack_num
dup_ack_count = 0
advance_window(ack_num)
This enhancement is not part of classic GBN but demonstrates how cumulative ACKs can be leveraged for faster error recovery.
| Duplicate Count | Likely Cause | Recommended Action |
|---|---|---|
| 1 | Network reordering | Wait for timeout |
| 2 | Network reordering or loss | Wait for timeout |
| 3+ | Frame loss (high confidence) | Consider fast retransmit |
| Many (> N) | Severe congestion or failure | Possible connection reset |
Edge Cases and Anomalies
Cumulative acknowledgments, while elegant, introduce subtle edge cases that implementations must handle correctly.
Edge Case 1: Out-of-Order ACK Arrival
ACKs can arrive out of order due to network path variations. If the sender receives ACK(5) then ACK(3):
- ACK(5) advances send_base to 6
- ACK(3) arrives, but 3 < 6, so it's stale
- Sender must recognize ACK(3) as redundant and ignore it
Implementation:
if (ack_num >= send_base):
// Valid, advance window
else:
// Stale ACK, ignore
Edge Case 2: ACK for Unsent Frame
Due to corruption or bugs, an ACK might arrive for a sequence number not yet sent:
if (ack_num >= nextseqnum):
// Impossible! ACK for unsent frame
// Likely corruption or protocol violation
// Ignore or log anomaly
Edge Case 3: ACK During Retransmission
If a timeout occurs and the sender is retransmitting frames, an ACK might arrive mid-retransmission. Should the sender:
a) Complete retransmission of all outstanding frames? b) Stop retransmission and process the ACK?
Option (b) is more efficient—if ACK(k) arrives during retransmission, frames ≤ k are confirmed received; only frames > k need retransmission.
A robust GBN implementation should be tolerant of
• Stale ACKs (ack_num < send_base) • Duplicate ACKs (same as previous) • Corrupted ACKs (fail checksum)
In all cases, the safest action is to ignore the anomalous ACK and let the timeout mechanism ensure correctness.
Edge Case 4: Wraparound Near Window Boundary
With finite sequence number space (say, 0 to 7 with 3-bit sequence numbers), ACK values wrap around. An ACK(1) could mean:
- Frame 1 in the current cycle, OR
- Frame 1 from a previous cycle (stale)
The protocol must use the window position to disambiguate:
if (ack_num is within the range [send_base, send_base + N) modulo sequence_space):
// Valid ACK for current window
else:
// Likely stale or corrupted
This check relies on having a sequence number space larger than the window size—a constraint we'll explore in the window sizing page.
Edge Case 5: ACK for Exactly send_base - 1
If ACK(send_base - 1) arrives:
- This acknowledges up to the frame before the current window
- But frames before send_base are already acknowledged
- This is a duplicate/stale ACK and should be ignored
Notably, the receiver might send this ACK if it receives a duplicate of a frame it already processed. The cumulative semantics don't advance the sender's window.
Cumulative ACKs in TCP: A Connection
TCP, the workhorse of Internet transport, uses cumulative acknowledgments in its core design, directly inheriting from Go-Back-N principles. Understanding GBN cumulative ACKs provides direct insight into TCP behavior.
TCP's Acknowledgment Field:
The TCP header contains a 32-bit Acknowledgment Number field. When the ACK flag is set:
"The acknowledgment number contains the next sequence number the sender of the ACK is expecting to receive, acknowledging receipt of all bytes up to but not including this number."
This is cumulative semantics using byte sequence numbers rather than frame numbers.
TCP Enhancement: SACK
While TCP's base mechanisms use cumulative ACKs, the Selective Acknowledgment (SACK) option (RFC 2018) adds the ability to report non-contiguous blocks. This combines GBN's cumulative robustness with SR's gap reporting.
TCP SACK example:
ACK = 1000 (cumulative: bytes 0-999 received)
SACK block 1: 1500-2000
SACK block 2: 2500-3000
Meaning: Received 0-999, 1500-1999, 2500-2999
Missing: 1000-1499, 2000-2499
| Aspect | Go-Back-N | TCP |
|---|---|---|
| Unit | Frames | Bytes |
| ACK(n) meaning | Frames 0-n received | Bytes 0 to n-1 received |
| Sequence space | Small (mod 2^k) | Large (32-bit) |
| Gap reporting | Not supported | Via SACK option |
| Retransmission trigger | Timeout only (classic) | Timeout + fast retransmit |
| Delayed ACK | Implementation-dependent | Standardized (200ms max) |
| ACK every | Every frame (typical) | Every 2 segments or timeout |
TCP can be viewed as a sophisticated GBN variant with: • Byte-stream abstraction (not frames) • Bidirectional data flow (piggybacked ACKs) • Congestion control (adjusting window dynamically) • SACK option for selective repeat benefits • Fast retransmit/recovery optimizations
The cumulative ACK foundation remains the same—understanding GBN provides direct insight into TCP internals.
Summary: Cumulative Acknowledgments
Cumulative acknowledgments are a cornerstone of Go-Back-N's elegance and efficiency. Let's consolidate the essential insights:
- •ACK(n) means all frames ≤ n received — A single acknowledgment carries multi-frame information
- •Subsumption enables ACK loss tolerance — Later ACKs implicitly cover earlier lost ACKs
- •Window advancement is efficient — One ACK can slide the window multiple positions
- •Duplicate ACKs signal potential errors — Indirect gap detection through repeated ACKs
- •Edge cases require careful handling — Stale, reordered, and corrupted ACKs must be correctly processed
- •TCP inherits cumulative semantics — Understanding GBN ACKs directly applies to TCP internals
What's Next:
With cumulative acknowledgments understood, we're ready to explore a critical protocol constraint: window size limits. Why can't we simply set N to infinity for maximum efficiency? The next page reveals how sequence number space, receiver buffer, and error recovery interact to impose strict bounds on the window size—and how violating these bounds leads to protocol failure.
You now have a deep understanding of cumulative acknowledgment semantics: their formal properties, robustness to ACK loss, interaction with the sliding window, role in error detection via duplicate ACKs, and connection to TCP. This foundation is essential for understanding window sizing constraints and efficiency analysis.
KEEP LEARNING
There’s more to understand.
You’re reading the introduction. Create a free account to read the complete lesson, save notes and keep track of your progress.