Why do some engineers find learning networking hard or even boring? I have read hundreds of networking explanations, especially those aimed at developers, and nearly all of them start the same way: “Here’s the OSI Model.” It is treated as the first page of every networking guide.
But here’s the problem: the OSI Model is a pure abstraction. It explains what should happen at each step, or Layer, but it does not explain who actually does the work or how your code actually connects to the real world.
The OSI Model is mostly about protocols. For example, Layer 7 is where HTTP and other application protocols operate, the Transport Layer is where TCP and UDP operate, and the Network Layer is where the IP protocol operates.
But do these protocols actually do anything on their own? No, they don’t. They are just rules and standards. Some other entity must implement them to establish connections, send and deliver data, detect errors, and even encrypt data.
This creates a critical gap: who actually does all this work? If the OSI Model and all its Layers are just an abstraction, and Protocols are just rules and standards to be followed, then who is responsible for doing everything?
It’s the Operating System (OS). When your application wants to communicate with another application, it does not ask the OSI Model, and it does not ask TCP to create a connection. Instead, it talks to the OS by saying: “Please open a Socket for me — I need to communicate.” This is the real first step that connects your code to the world.
What is a Socket? As a developer, think of it like an Object. Your application can send Bytes to this Socket using a few System Calls such as
send() and sendto(). The OS then handles the transmission. Similarly, your application can receive Bytes through this Socket using other System Calls such as recv() or read().
In reality, a Socket is a Data Structure inside the OS Kernel. It is an OS-managed Endpoint for communication. It is the interface through which your application interacts with the operating system to communicate over a network.
In order for an application to connect to another application, at least two things need to happen: first, it needs to obtain a Socket; second, it needs to connect to that Socket. The second step is not necessary in some cases, where the application simply starts using the Socket.
In High-Level Frameworks like Node.js or languages like Python, the details of creating a Socket are abstracted away, so you do not have to create one yourself. In Node.js, even connecting to the Socket is abstracted away from the developer.

