The Network Was Built to Distrust Itself

Most people assume the internet works because someone, somewhere, is making sure everything arrives correctly. The truth is nearly the opposite. TCP/IP was designed on the assumption that the network itself cannot be trusted, and every layer of the protocol is built around that suspicion.

The original ARPANET research in the 1960s and 70s was funded partly to explore communication systems that could survive infrastructure failures. The result was a protocol that doesn’t rely on any single path, any single router, or even the assumption that data will arrive in order. What looks like a seamless data transfer is actually a paranoid, redundant, self-correcting negotiation happening thousands of times per second.

Understanding how this works isn’t just academically satisfying. It explains why certain kinds of failures are nearly impossible, why others are surprisingly common, and why the architecture of the internet shapes almost every engineering decision built on top of it.

Packets Don’t Travel Together

When you download a file, that file is not sent as a single stream. TCP breaks it into numbered packets, typically up to 1,500 bytes each on standard Ethernet links (a limit set by the Maximum Transmission Unit, or MTU). Each packet is then handed to IP, which routes it independently across the network.

This is the part most people miss: two consecutive packets from the same file may take completely different physical paths. One might route through Chicago, the other through Dallas. They may arrive out of order. They may arrive with errors. One may not arrive at all.

TCP handles this at the receiving end. The receiver buffers packets as they arrive, uses the sequence numbers to reorder them correctly, and sends acknowledgments back to the sender confirming which packets were received. If an acknowledgment doesn’t arrive within a calculated timeout, the sender retransmits that packet. The file you eventually read is the result of this reassembly process, not a direct copy of what was sent.

The timeout calculation itself is adaptive. TCP continuously measures round-trip time using an algorithm (Jacobson’s algorithm, formalized in RFC 6298) that adjusts retransmission timing based on observed network conditions. A slow or congested link triggers longer timeouts; a fast local network allows aggressive retransmission. The protocol is tuning itself in real time.

Graph showing TCP congestion window growing, dropping sharply at packet loss, then recovering
TCP's congestion window grows until it detects packet loss, then cuts back and probes again. This saw-tooth pattern repeats continuously on nearly every connection.

The Checksum Is Your Error Detector

Getting packets to arrive in order is only half the problem. The network also introduces bit errors: cosmic rays flipping memory bits in routers, electrical noise on fiber connections, or hardware faults anywhere along the path. TCP addresses this with a checksum.

Every TCP segment includes a 16-bit checksum calculated over the header and data before sending. The receiver recalculates the checksum on arrival and compares it to the one in the header. A mismatch means the data was corrupted in transit. The packet is silently discarded, no acknowledgment is sent, and the sender’s timeout triggers a retransmission.

The 16-bit checksum is good enough for most scenarios but not cryptographically strong. It will catch the vast majority of random bit errors but can theoretically miss certain patterns of corruption. For applications where silent data corruption is unacceptable (financial transactions, medical records, software distribution), a higher-level checksum or cryptographic hash is layered on top. TLS, for example, adds its own message authentication codes that are far more collision-resistant than TCP’s built-in checksum.

This is a key architectural principle of TCP/IP: the protocol provides a floor, not a ceiling. Applications that need stronger guarantees add their own.

Congestion Is the Hardest Problem

Error detection and packet reordering are solved problems. Congestion control is not, and it’s where most of the interesting engineering still happens.

If every sender on the internet transmitted as fast as possible, routers would drop packets en masse, retransmissions would flood the network, and throughput would collapse. This actually happened in 1986, when the early internet experienced what became known as congestion collapse: throughput on some links fell to roughly one percent of capacity.

Van Jacobson’s 1988 paper introduced the congestion control algorithms that largely solved this problem. The core insight was that TCP should treat packet loss as a signal of congestion and reduce its transmission rate in response, rather than retransmitting aggressively and making things worse. The “slow start” and “congestion avoidance” mechanisms that resulted are still foundational to how TCP behaves, though they’ve been substantially refined since.

Modern variants like CUBIC (the default in Linux) and BBR (developed at Google and used extensively in their infrastructure) take different approaches to probing for available bandwidth. BBR in particular tries to measure actual bottleneck bandwidth and round-trip propagation time rather than inferring congestion from packet loss alone, which gives it advantages on high-bandwidth, high-latency links like transoceanic cables. The competition between these algorithms is ongoing, and the choice of congestion control can measurably affect throughput in production environments.

This connects to a broader truth about distributed systems: the hardest problems aren’t failures, they’re the states between working and failing. A router that drops 0.1% of packets silently is harder to diagnose and optimize for than one that’s completely down. (The distributed systems version of this problem, where nodes may disagree on what state the world is in, is worth understanding separately, as covered in The Distributed System That Agrees on Nothing.)

Why This Architecture Still Holds After 50 Years

TCP/IP turns 50 in 2024, measured from the publication of RFC 675, and it still moves the overwhelming majority of internet traffic. That longevity is not nostalgia. It reflects a design philosophy that has proven genuinely durable: push complexity to the edges, keep the core simple, and let endpoints negotiate reliability rather than requiring the network to guarantee it.

This end-to-end principle is why the internet can carry voice calls, video, financial transactions, and sensor data from IoT devices using the same underlying infrastructure. Each application layer adds whatever reliability guarantees it needs on top of IP’s best-effort delivery. Some (real-time video) accept packet loss and skip retransmission entirely, using UDP instead of TCP. Others (database replication) add their own application-level checksums on top of TCP’s.

The surprising thing is not that TCP/IP works. It’s that a protocol designed to survive infrastructure failure does so by making failure a first-class assumption rather than an exception. Every feature, from sequence numbers to adaptive timeouts to congestion backoff, exists because the designers assumed the network would misbehave. They were right, and that pessimism is why your file arrives intact.