Every network call you've ever made — a fetch(), an SSH session, a video call — reduces to the same shape: your data gets broken into packets, addressed, routed hop by hop, and reassembled. This is that shape, without the OSI-model trivia.
4 min read
Your laptop and a server in another country need to exchange data, but there's no single wire connecting them — there's a chain of routers, switches, and cables owned by dozens of different companies. Networking is the set of agreed-upon rules (protocols) that let that chain work at all, regardless of whose equipment is in the middle.
The core trick: instead of sending your data as one giant stream, it gets broken into small chunks called packets, each independently addressed and routed. This is why networks can share bandwidth between millions of users at once — no single transfer monopolizes a link for its whole duration, since packets from many different conversations interleave on the same wire.
Real networking stacks are usually taught as a strict 7-layer OSI model. In practice, almost everything you'll touch as a software engineer lives in four practical layers, each handing off to the one below it:
Each layer only knows about its own job. HTTP doesn't know or care whether it's running over Wi-Fi or fiber; IP doesn't know or care whether the payload is a web page or a video frame. This separation is what lets you swap out any one layer — move from Wi-Fi to Ethernet, from HTTP/1.1 to HTTP/2 — without rewriting the layers around it.
Say your browser sends GET https://api.example.com/users:
The server's stack does the exact same thing in reverse: link layer receives the raw signal, network layer confirms the IP is really meant for this machine, transport layer reassembles the packets in order, application layer finally hands your code a complete HTTP request.
No single router knows the full path from your laptop to a server on another continent. Instead, each router only knows: "for this destination range, send it to that next router" — a routing table with a next hop, not a full route. A packet gets forwarded hop by hop, each router making a local decision, until it arrives. This is also why network problems are often intermittent or partial — one router along a path can be slow or down while every other hop is fine, and traffic often reroutes around it automatically.
# `traceroute` (or `tracert` on Windows) makes this literal: it sends packets
# with an increasing "hop limit" and prints who replies at each hop
$ traceroute api.example.com
1 192.168.1.1 1.2 ms <- your home router
2 10.20.0.1 8.1 ms <- your ISP's first router
3 93.184.216.1 14.7 ms <- somewhere in your ISP's backbone
4 ...
9 93.184.216.34 31.0 ms <- api.example.com, arrivedNearly every "why is this slow" or "why is this failing intermittently" production question is actually a question about which layer broke:
Knowing which layer a symptom belongs to is the single fastest way to stop guessing and start debugging in the right place — a skill the rest of this domain builds toward directly.
Check your understanding
A quick comprehension check — not tracked, not graded, just for you.
1. Why is data broken into packets instead of sent as one continuous stream?
2. What does it mean that each networking layer 'only knows about its own job'?
3. Why does no single router know the complete path a packet will take to its destination?
Networking Fundamentals