reliable data transfer
Imagine reading a long shopping list to a friend over a crackly phone line where words sometimes vanish or arrive garbled. How do you guarantee they get the whole list, correctly and in order, despite the bad line? You'd number each item, have them repeat back what they heard, and reread anything they missed or got wrong. Reliable data transfer is exactly this discipline, built so an application sees a perfect channel even though the network underneath loses, corrupts, reorders, and duplicates data.
It is built from a small set of cooperating tools. A checksum detects corrupted data so bad copies are thrown away. Sequence numbers let the receiver put data back in order and spot duplicates or gaps. Acknowledgments let the receiver tell the sender what arrived. A retransmission timer fires when an expected acknowledgment doesn't come back in time, prompting the sender to resend. And rather than sending one piece and waiting for each acknowledgment (slow), a sliding window lets several pieces be outstanding at once (pipelining) for far higher throughput, using schemes like go-back-N or selective repeat to decide what to resend.
Why it matters: this is one of networking's deepest ideas — building a guarantee on top of a medium that offers none, using only end-to-end checks and retransmission. TCP is the Internet's flagship implementation of it. The principle is general: any reliability protocol over a lossy link reinvents these same pieces. An honest note: reliability costs latency. To deliver in order, the receiver must hold back data that arrived after a lost piece until the gap is filled — which is precisely the mechanism behind head-of-line blocking.
Sender ships segments 1, 2, 3, 4. Segment 2 is lost. The receiver, seeing 1 then 3 then 4, withholds 3 and 4 from the application and keeps acknowledging only up to 1. The sender's timer for 2 expires, it resends 2, and only then can 2, 3, 4 be delivered in order.
Numbering, acks, a timer, and a window turn a lossy link reliable.
Reliability is not free. In-order delivery forces the receiver to buffer and wait for gaps to fill, adding delay. That trade-off is why latency-sensitive apps sometimes choose UDP and accept some loss instead.