لماذا يجد بعض المهندسين تعلُّم Networking صعبًا أو حتى مملًا؟ لقد قرأت مئات الشروحات حول Networking، وخاصةً تلك الموجّهة للمطورين، وتقريبًا جميعها تبدأ بالطريقة نفسها: «إليك OSI Model». ويتم التعامل معه على أنه الصفحة الأولى في كل دليل لتعلُّم Networking.
لكن هنا تكمن المشكلة: إن OSI Model عبارة عن تجريد (Abstraction) بحت. فهو يشرح ما الذي يجب أن يحدث في كل خطوة، أو Layer، لكنه لا يشرح مَن الذي ينفّذ هذه المهام فعليًا، ولا كيف يتصل الكود الخاص بك بالعالم الحقيقي.
يركّز OSI Model بشكل أساسي على الـProtocols. فعلى سبيل المثال، تعمل HTTP وغيرها من Application Protocols في Layer 7، بينما يعمل TCP وUDP في Transport Layer، ويعمل IP Protocol في Network Layer.
لكن هل تقوم هذه الـProtocols بأي شيء من تلقاء نفسها؟ لا، لا تقوم بذلك. فهي مجرد قواعد ومعايير. ولا بد من وجود جهة أخرى تقوم بتنفيذ هذه القواعد والمعايير من أجل إنشاء الاتصالات، وإرسال البيانات وتسليمها، واكتشاف الأخطاء، وحتى تشفير البيانات.
وهنا تظهر فجوة مهمة: مَن الذي ينفّذ كل هذا العمل فعليًا؟ فإذا كان OSI Model بكل الـLayers الخاصة به مجرد Abstraction، وكانت الـProtocols مجرد قواعد ومعايير يجب اتباعها، فمن المسؤول إذًا عن تنفيذ كل شيء؟
إنه نظام التشغيل (Operating System - OS). عندما يريد تطبيقك التواصل مع تطبيق آخر، فهو لا يطلب ذلك من OSI Model، ولا يطلب من TCP إنشاء اتصال. بدلًا من ذلك، يتحدث مع نظام التشغيل ويقول له: «من فضلك، افتح لي Socket — أحتاج إلى التواصل.» وهذه هي الخطوة الأولى الحقيقية التي تربط كودك بالعالم الخارجي.
ما هو الـSocket؟ كمطور، يمكنك التفكير فيه على أنه Object. يستطيع تطبيقك إرسال Bytes إلى هذا الـSocket باستخدام بعض System Calls مثل
send() وsendto(). بعد ذلك يتولى نظام التشغيل عملية الإرسال (Transmission). وبالمثل، يستطيع تطبيقك استقبال Bytes عبر هذا الـSocket باستخدام System Calls أخرى مثل recv() أو read().
في الواقع، الـSocket هو Data Structure موجود داخل OS Kernel. وهو Endpoint للاتصال تديره نظام التشغيل. ومن خلاله يتفاعل تطبيقك مع نظام التشغيل من أجل التواصل عبر الشبكة.
لكي يتمكن تطبيق من الاتصال بتطبيق آخر، يجب تنفيذ أمرين أساسيين على الأقل: أولًا، الحصول على Socket؛ وثانيًا، الاتصال بهذا الـSocket. لكن الخطوة الثانية ليست ضرورية في بعض الحالات، حيث يبدأ التطبيق ببساطة باستخدام الـSocket.
في High-Level Frameworks مثل Node.js أو لغات البرمجة مثل Python، يتم إخفاء تفاصيل إنشاء الـSocket عنك (Abstracted Away)، لذلك لا تحتاج إلى إنشائه بنفسك. وفي Node.js، حتى عملية الاتصال بالـSocket يتم إخفاؤها عن المطور أيضًا.

