A link resends any packet whose acknowledgement has not arrived within 10 µs. A noise burst corrupts a packet; the receiver's CRC check fails and it discards the packet. The sender waits the full 10 µs before it learns anything. A second design has the receiver say "that one was bad" the moment its check fails, and the resend starts within a few hundred nanoseconds. Same error, thirty times faster recovery.
How does a sender learn what arrived, and why use both positive and negative acknowledgements?
The obvious reliable link uses positive acknowledgements and a timer: the receiver acknowledges what arrived intact, and the sender resends anything not acknowledged in time. That works for every kind of failure, but recovery from the most common one, a corrupted packet, takes a whole timeout, which must be long enough to cover the worst-case round trip. Waiting for silence is slow when the receiver already knows what went wrong.
Signal | Sent when | Tells the sender | Catches |
|---|---|---|---|
ACK (positive) | A packet arrived intact (and in sequence) | It may free that packet's copy (lesson 10.11) | Successful delivery |
NAK (negative) | A packet arrived damaged or out of sequence | Resend now, from the right point | Corrupted packets, fast |
Timer at the sender | No ACK or NAK arrived in time | Something was lost entirely: resend | Lost packets and lost ACKs or NAKs |
Each covers a gap in the others. ACKs alone recover only by timeout. NAKs alone cannot report a packet that vanished, since the receiver never saw it, nor a NAK that was itself lost. The timer alone is slow. Together: NAKs make the common case fast, ACKs let the sender free its buffer, and the timer catches everything else.
Acknowledging every packet separately costs bandwidth on the return path. Cumulative ACKs say "everything up to and including number n arrived", so one ACK covers many packets, and a lost ACK is repaired by the next one. NAKs are usually cumulative too: "everything up to n was good; resend from n + 1". Both need sequence numbers on packets (lesson 10.10).
Protocol | Acknowledgement scheme |
|---|---|
PCI Express data link layer | Each TLP has a 12-bit sequence number. ACK and NAK DLLPs acknowledge every TLP up to and including the given number; a NAK, or the replay timer expiring, causes a replay of all unacknowledged TLPs. |
TCP | Cumulative acknowledgements with a retransmission timer, plus duplicate acknowledgements as a fast loss signal. |
DCLink (step 9) | Cumulative ACK and NAK carrying the last good sequence number, and a replay timer. |
The opening link (illustrative) recovered only by timeout. Its timeout had to cover the worst-case round trip, including the receiver being busy, so every corrupted packet stalled the link for 10 µs. Adding NAKs made recovery from corruption take one short round trip; the timer stayed, for the rarer cases where a packet or acknowledgement was lost completely.
The sender's timer, or a NAK the receiver sends when the next packet arrives with a gap in the sequence numbers.
The receiver already had the packet; it recognises the repeated sequence number, discards it, and acknowledges again.
ACKs confirm arrival and free buffers; NAKs report damage at once; a timer catches total loss.
NAKs make the common case, corruption, fast; the timer covers lost packets and lost acknowledgements.
Cumulative acknowledgements with sequence numbers reduce return traffic and repair lost ACKs.