بسم الله الرحمن الرحيم
الدرس الأول
مدخل إلى برمجة الشبكات
مرحبا بكم في الدرس الأول. لا تتوقعون في البداية وجود أكواد برمجية, فيجب قبل الخوض في برمجة الشبكات ضمان و لو مستوى معرفي بسيط عمن ستقدم على برمجته.
يمكنك أن تسميها أيضا دورة تبادل البيانات بين الأجهزة. فالبيانات التي يتم تبادلها في عالم الشبكات تمر بعدة مراحل لكي تصل من جهاز لآخر, و لعل أشهر ما قام بتوضيح دورة تبادل البيانات هو التقسيمة المشهورة من قبل منظمة OSI فيما يعرف بالطبقات السبع أو معمارية الـOSI. و تتمثل الطبقات السبع من أسفل لأعلى كالآتي:

و كما نرى في الصورة فإنه تم إختصار الطبقات السبع إلى أربع طبقات في معمارية الـTCP/IP. و لأن معمارية الـTCP/IP هي الممثل الحقيقي لشبكة الأنترنت فسوف نقوم بتفصيلها من أعلى لأسفل كالتالي:
1. طبقة التطبيقات - Application Layer: و فيها نجد فيها معايير إما تكون خاصة بتطبيق معين, مثال ذلك معيار الـSTMP الخاص بالبريد الإلكتروني, و معيار الـDSN الخاص بإعطاء أسم للموقع Domain في مقابل الـIP الخاص للموقع ... إلخ. و إما أن يكون معيارا مساعدا لأحد معايير التطبيق, مثال ذلك معيار الـPOP3 المساعد. و نفهم من ذلك أن تصفح المواقع خدمة مستقلة عن خدمة البريد الألكتروني عن خدمة تحميل الملفات عن خدمة المحادثة, و أن كل ما تراه في متصفحات الأنترنت أمثال الـInternet Explorer ما هي إلا أجتهادات ممن قاموا ببرمجة المتصفح عن طريق إضافة أكثر من معيار "Protocol" لأكثر من خدمة حتى تجد المتصفح فقد أختصاصه و أصبح شاملا لمعظم الخدمات المتبادلة بين الشبكات بما فيها شبكة الأنترنت طبعا.
2. طبقة النقل - Transport Layer: و فيها نجد بعضا من المعايير التي تخص كيفية نقل البيانات. مثل الـTCP التي تهتم بنقل البيانات بشكل صحيح دون الأهتمام بسرعة نقلها, وذلك عكس الـUDP و التي تفضل سرعة نقل البيانات على نقلها بشكل مفيد. بالطبع الأسلوب الذي يتبعه معيار الـUDP له مبرر, و هو الضغط الشديد الذي تواجهه الشبكة في حالة الـBroadcast و الـMulticast.هذا و يتم تعويض التقطيع المحتمل حدوثه في الشبكة عن طريق الـQos.
3. طبقة الأنترنت - Internet Layer: و تحتوي على معايير مثل معيار الـIP و الخاص بتحديد رقم لجهازك عن دخولك في أحد الشبكات. و من أهم ما يميز هذه الطبقة أن الأنترنت طابعا خالصا لها. ذلك أن مسألة وجود الـHardware (كما في طبقة الوصلات) و وجود التطبيقات (كما في طبقة التطبيقات) أمر متوقع حدوثه خارج عالم الشبكات, بينما ينفرد الأنترنت بفكرة وجود الـIP. بل سيجد الناظر أن باقي المعايير في هذه الطبقة تكاد تكون معايير مساعدة لمعيار الـIP, مثال ذلك: معيار الـICMP المتحكم في إظهار رسائل تنبيه عند أكتشاف خطأ في محاولة الوصول لأحد المواقع, أعتقد أن وظيفته تؤكد أنه معيار مساعد للـIP( الجدير بالذكر أن هذا المعيار يلعب دورا كبيرا في برامج مثل الـ(Ping. كذلك نجد أن المعيار IPsec ما هو إلا معيار لتأمين و حماية أرقام الـIPv4 (الـIPv4 هو الـIP المطبق حاليا, حيث يوجد IP جديد يسمى الـIPv6).
4. طبقة الوصلات - Link Layer: و فيها نجد خليطا من المعايير المتعلقة بالمشغل "Hardware" الذي يتم توصيل الشبكة من خلاله و بين بعض المعايير الأخرى المساعدة لوصل الطبقات الثلات الأخرى إلى المشغل بشكل مفهوم و مناسب للجهاز الآخر, مثال ذلك: معيار الـARP الذي يقوم بتحليل أسم الموقع الناتج عن معيار الـDNS إلى الـIP المقابل له. أيضا نجد الـMac Address و هو الـSerial Number الخاص بكارت الشبكة أو ما يعرف بالرقم الفيزيائي, و الذي تتمثل أهميته في إضافته إلى رقم الـIP لمنع تضارب أرقام الـIP الأخرى في الشبكة لا سيما عند الأتحاد مع شبكة الأنترنت.
من أكثر الأخطاء الشائعة التي يقع فيها مبرمجي الشبكات بل و حتى العاملين على تركيب الشبكات إطلاق لفظ معيار "Protocol" على معمارية الـTCP/IP. فكرة المعمارية يمكن تلخيصها في وجود جدول يتكون من عدة طبقات توضح خط سير عمل الشبكة, فالمعمارية تشمل العديد و العديد من المعايير "Protocols" يتم الأختيار من بينها تبعا لنوع الخدمة المراد الحصول عليها و نوعية الشبكات التي ستحصل على هذه الخدمة. باختصار شديد, الـTCP/IP هو أحد معماريات الأنترنت التي أشتقت أسمها من أهم المعايير التي تحويها ألا و هي الـTCP و الـIP.
و لعل سر تسمية هذه المعمارية جاء من خلال فكرة أبسط أنواع الأتصال و المتمثل في جهازين أحدهما يعطي الخدمات (ألا و هو الخادم "Server") بينما يقوم الأخر بتلقي الخدمة (ألا و هو العميل- "Client"). و بالنظر إلى معني كلا من الـTCP و IP و الذي سبق شرحه يمكن القول أن الـTCP/IP هو: {ضمان جودة الأتصال بغض النظر عن سرعة وصول المعلومة مع التعرف على الأجهزة من خلال رقم الـIP لكل جهاز سواء أكان الجهاز يلعب دور الخادم "Server" أو العميل "Client"}.
و في النهاية أحب أن أعترف بوجود القصور الشديد في مقالتي, و لما لا أقصر؟ فشرح جميع المعايير التي بداخل معمارية الـTCP/IP يمكن أن يصنع لنا كتابا أو ملحقا ضخما يتجاوز حدود المقالة:) لذا أحب أن أحيلكم إلى موقع مثل الويكيبيديا (النسخة الأنجليزية) حيث تجدون الشرح لكل معيار من معايير الأنترنت باستفاضة. فقط قوموا بالبحث داخل موقع الويكيبيديا باستخدام الجملة TCP/IP Model أو الأسم الرسمي المقابل لها و هو (جناح معايير الأنترنت) "Internet Protocol Suit". الجدير أن صورة المعمارية التي بالأعلى تحتوي على أسماء أشهر المعايير التي يمكن البحث حولها.
توجد للشبكات عدة تصنيفات, و السبب في وجود هذه التصنيفات المختلفة يرجع إلى الزاوية التي ننظر منها للشبكات. و الطرائق المتبعة في التصنيف لا تنتهي, لكني سأتعرض لأهم التصنيفات التى تمثل قاعدة أساسية عند محاولة برمجة الشبكات:
الأول - Unicast: و ذلك في حالة وجود جهازين متخاطبين فقط, كأن يقوم إثنان بعمل محادثة Chat مع بعضهما.
الثاني - Multicast: و ذلك في حالة وجود عدة أجهزة تجمعها طبيعة معينة, كأن يتم التخاطب بين أجهزة موظفي أحد الشركات.
الثالث - Broadcast: و ذلك في حالة التخاطب مع أي جهاز دون تحديد مجموعة من الأجهزة بعينها, و لعل أبسط مثال ذلك هو التخاطب مع أحد المواقع التي تقدم أحد خدماتها على شبكة الأنترنت.
و لا خلاف تقريبا حول تعامل هذه الأنواع الثلاث مع معايير معمارية الـ TCP/IP سوى أن الـUnicast تقوم باستخدام الـTCP بينما يقوم الـMulticast و الـBroadcast باستخدام الـUDP.
الأول - Local Area Network (LAN): و هي الشبكات التي لا تتخطى منطقة جغرافية في حدود البناية الواحدة كالبرج السكنى الواحد أو المدرسة مثلا. و نظرا لبساطتها فهي لا تحتاج سوى الأسلاك المزدوجة الملتفة "Twisted pair", و إن كان ذلك لا يمنع طبعا من أستخدام أسلاك أكثر نعقيدا مثل الألياف البصرية "Fiber Optic" أو حتى التوصيل اللاسلكي "Wireless".
الثاني - Metropolitan Area Network (MAN): و هي الشبكات التى يمكن أن تقوم بتغطية عدة بنايات لتشمل مدينة بأكملها و لكن لا يتخطى طابعها الجغرافي النطاق المحلي. و تستخدم هذه الشبكات الألياف البصرية "Fiber Optic", إذ يمتد طولها إلى مساحات تتراوح من 20 إلى 100 كيلو متر. يمكن أيضا أستخدام شبكات لاسلكية "Wireless" و إن كان طولها لا يتخطى بضعة كيلومترات و تحتاج بالطبع إلى محطات تقوية أعلى أسطح البنايات. الجدير بالذكر أن البعض من متخصصي الشبكات يهملون الحديث عن شبكات الـMAN, و لا عجب في ذلك أن عرفنا أن شبكات الـMAN ما هي في الحقيقة إلا شبكات WAN مصغرة تأخذ الطابع المحلي, لذلك تجد مبرمج الشبكات يساوي في التعامل بين شبكات الـMan و شبكات الـWAN.
الثالث - Wide Area Network (WAN): و هي الشبكات التي يمكن أن تمتد لعدة دول بل و للعالم أجمع. و تعد شبكة الأنترنت خير مثال عليها. و لا عجب في ذلك إذا عرفنا أن محطة التقوية الواحدة أو وحدة الأتصال و المعروفة باسم العمود الفقري "Backbones" تصل قوة الإرسال منها إلى 2.5 جيجا بت في الثانية الواحدة.
تلعب الأجهزة على الشبكات إما دور الخادم أو العميل, و إعتمادا على هذا التصنيف تنقسم الشبكات إلى:
الأول - شبكات الند للند "Peer to Peer": و يعرف أيضا باسم شبكات الـWorkgroup. و لا يوجد جهاز محدد يلعب دور الخادم على الشبكة, و إنما يلعب كل الأجهزة دور الخادم و العميل في نفس الوقت. و لا يمكن أن يزيد عدد الأجهزة في هذه الشبكة عن عشرة أجهزة, و من الطبيعي ألا يصلح هذا النظام لخطط تطوير الشبكات المستقبلية.
الثاني - شبكات العميل/الخادم "Client/Server": و يعرف أيضا باسم شبكات الـDomain. و فيه يوجد جهاز واحد على الأقل يلعب دور الخادم "Server" بشكل رئيسي, بينما تلعب باقي الأجهزة دور العميل.
و في النهاية أحب التأكيد على بعض النقاط:
1. بغض النظر عن هاتان التقسيمتان السابق ذكرهما, لا يوجد فرق بين أي جهاز في أيا من نوعي الشبكات السابق ذكرهما, فكل جهاز يمكن أن يلعب دور العميل و دور الخادم. كل ما هنالك أن الجهاز الخادم في شبكات (العميل/الخادم) نادرا ما يلعب دور العميل, كما أن وجود الجهاز الخادم في شبكة (العميل/الخادم) "Client/Server" ما هو إلا أمر ضرورى لوجود جهاز يلعب الدور الرئيسي في الشبكة. ذكرتموني بأحد مقاهي الأنترنت التي عندما كنت أدخلها أجد صاحبها مغلق الجهاز الخادم "Server" دائما إلا عند حاجنه لكتابة بعض الأوراق :)
2. في عالم البرمجة لا يتم الأعتراف بشئ محدد أسمه الخادم أو العميل. فكل جهاز أو برنامج يتلقى خدمة فهو عميل "Client", و كل جهاز أو برنامج يقوم بتقديم خدمات فهو عميل, و الأمر متروك في أغلب الأحوال لإتجاهات المبرمج و ما تنعقد عليه نيته :)
3. يجب عليك فهم هذه التصنيفات الثلاث و محاولة الربط بينها لأنه في فهمها جيدا وحسن الربط بينها يبين مدى قدرتك على برمجة شبكات مثالية :) ليس هذه هي النهاية, فما زال بحر الشبكات واسع يدعوك للأخذ منه!
قبل التعرض للمتزامنات كأحد الحلول البرمجية ينبغي توضيح أولا حقيقة التزامن. و التزامن في علم اللغة هو وجود شيئان يعملان في نفس الوقت. و من هذا المنطلق التفسيري نجد مثلا فكرة الأتصال المتزامن و المتمثل في سماع أصوات المتحدثين في نفس وقت التحدث كما يحدث في برامج المحادثة "Chat" التي توفر ذلك, أو كبرامج الفيديو كونفرانس التي تقوم ببث الصوت و الصورة في نفس الوقت لعقد الأجتماعات و المؤتمرات, و كذلك الأمر عند بث أحد القنوات الفضائية عن طريق الأنترنت. بينما يوجد الأتصال غير المتزامن , و هو بالطبع من نصيب البرامج و الملفات المتاحة على الشبكات. و في الأتصال المتزامن نستخدم طريقة النهر "Stream" و التي تعني سير البيانات في الأسلاك بشكل متصل. بعكس طريقة الحزم "Packet" و التي يتم أستخدامها في نقل الملفات. و في طريقة الحزم "Packet" يمكن تقسيم الملفات و نقلها عن طريق عدة منافذ "Ports" مما يقوم بتسريع نقل البيانات, و هذا ما يحدث فعلا في البرامج التي تقوم بتسريع "Accelerate" تحميل الملفات من على الأنترنت. كذلك نجد التحكم في كيفية تشغيل أحد البرامج المتصلة بالشبكات يخضع لفكرة التزامن و المتزامنات.
المتزامنات هي حلول أو حيل برمجية تم إبتكارها من أجل خدمة نظم التشغيل بوجه عام, ثم بدأت تلعب دور أكبر و أخطر عندما زادت شعبية الأنترنت من خلال خدماتها المتعددة. و قبل أن نتعرض لأهم أنواع المتزامنات, لابد من الإشارة إلى من كانت لها الفضل في وجودها, ألا و هي المسارات المتعددة "Multithreading".
المسارات المتعددة "Multithread": كان المتعاملين مع أجهزة الحاسب تحت نظام الـDos يضطرون للتعامل مع برنامج آخر إغلاق البرنامج السابق تشغيله. مثال, إن قمت بتشغيل ملف موسيقي عن طريق الـDos و تريد الأنتقال للكتابة كان عليك أولا إغلاق ملف الموسيقي لتستطيع الأنتقال للكتابة. كذلك كان عند إعطاء البرنامج في الـDos عدة متعليمات فإنه كان ينفذها الواحدة تلو الأخرى, و هو ما يعرف بالمعالجة المتوالية. ثم فوجئنا بنظام التشغيل ذات البيئة الرسومية أمثال الـWindows الذي يمكنك من سماع الموسيقى و تحميل الملفات من على الأنترنت, و ذلك كله أثناء قيامك ببعض الأعمال الأخرى على الحاسب,أي أننا أصبحنا أمام معالجة متوازية, كيف حدث ذلك؟!
الأصل في المعالج "Processor" أنه لا يستطيع القيام بأكثر من عملية معالجة في نفس الوقت, هذا و يتم الربط بين البيانات التي ستتم معالجتها و بين المعالج ذاته عن طريق أتخاذ مسار "Thread". معنى هذا أن المعالج "Processor" لا يستطيع التعامل سوى مع مسار واحد, و لكن المبرمجون قاموا بكسر هذه القاعدة بشكل نسبي عن طريق فكرة المسارات المتعددة "Multithreading". و تتلخص فكرة المسارات المتعددة في وضع كل كائن نريد معالجته داخل مسار "Thread", بعدها يقوم المعالج بتلقي هذه المسارات و معالجة كل المسارات في نفس الوقت و لكن بشكل متبادل. و لتوضيح فكرة المعالجة بشكل متبادل نأخذ مثال: سنفترض أن لدينا ثلاث مسارات الأول يحتوي على صورة و الثاني يحتوي على ملف مكتوب و الثالث على ملف صوتي. فسوف تتم معالجة جزء من الصورة ثم معالجة جزء من الملف المكتوب ثم معالجة جزء من ملف الصوت, ثم العودة مرة أخرى لمعالجة جزء من الصورة, و هكذا حتى تتم معالجة كل الملفات بشكل كامل. و نظرا للسرعة الشديدة للمعالجات في إتمام المعالجة بشكل متبادل, فإنه من الصعب ملاحظة مثل هذا الأمر(بالطبع إلا عند فتح عدد كبير من البرامج). و مع ذلك فإنه تظل هذه الطريقة نوعا من التزامن المزيف, و يظل الأصل في المعالجة المتوازية هو معالجة كل ملف عن طريق معالج مستقل كي نتمتع بمعالجة متوازية حقيقية.
و نظرا لأن عالم الأنترنت أصبح متعدد الخدمات و المميزات, فقد تم وضع تقنية المسارات كأحد الأوامر التابعة لمكتبات الشبكات, و ليس غريبا إن سمعت أحدا أنه يقول قد صمم مكتبة برمجية متخصصة في تقنية المسارات. و لكن مهلا, وجود تقنية المسارات المتعددة "Multithread" دون وجود من يتحكم فيها و يحسن توجيهها يجعل من وجود أكثر من مسار فكرة فاشلة و عديمة الجدوى. لذا كان لابد من وجود شئ يجعلها أكثر نفعا و أهمية و هو ما عدث عند ظهور فكرة المتزامنات "Synchronous". و من أشهر أنواع المتزامنات: الـMutex أو الإقصاء المتبادل و الـSemaphore و الـEvent و الـCritica Section.