It ensures error-free delivery of TLPs (Transaction Layer Packets) across every link, using automatic retransmission when errors are detected.
👉 Think of it like a “guaranteed delivery receipt” system at the Data Link Layer.

🧩 How It Works (Step by Step)
- Sending a TLP
- Every outgoing TLP gets:
- A Sequence Number (unique ID for ordering and tracking)
- An LCRC (Link CRC, error detection checksum)
- The transmitter also stores a copy of the TLP in its Replay Buffer until it knows the receiver got it safely.
- Every outgoing TLP gets:
- Receiver Checks It
-
The receiver checks:
- LCRC → verifies integrity
- Sequence Number → checks order
-
Then one of two things happens:
- ✅ No error → Receiver sends an Ack DLLP with the last good sequence number.
- ❌ Error detected → Receiver drops the TLP and sends a Nak DLLP.

-
- Transmitter Responds
- If Ack received → Transmitter flushes the TLP (and any older ones) from the Replay Buffer.
- If Nak received → Transmitter replays all unacknowledged TLPs from its Replay Buffer.
Since most errors are transient, simply replaying usually fixes the problem.
🔁 Example Walkthrough (Memory Read across a Switch)
- Step 1: Requester sends
MRd TLP→ Switch checks it, sends Ack back → Requester flushes replay buffer. - Step 2: Switch forwards TLP → Completer checks it, sends Ack back → Switch flushes buffer.
- Step 3: Completer generates
CplD TLP→ Switch checks it, sends Ack back → Completer flushes buffer. - Step 4: Switch forwards
CplD TLP→ Requester checks it, sends Ack back → Switch flushes buffer → Requester passes data to core logic.
At every hop (Requester ↔ Switch ↔ Completer), Ack/Nak ensures reliability.