9.8. المنافذ¶
يحدد عنوان IP لأي مضيف تتجه الحزمة. ويشغّل المضيف الحديث برامج كثيرة في آن واحد -- متصفح ويب، وعميل دردشة، ومكالمة فيديو، ومهمة نسخ احتياطي -- وكل منها يرسل ويستقبل الحزم بالتوازي. ولا تملك طبقة IP أي وسيلة للتمييز بينها؛ بل تسلّم كل حزمة واردة إلى "المضيف" فحسب. لا بد إذن من شيء يقرر أي حزمة تخص أي برنامج.
رقم المنفذ هو الإجابة. فكل حزمة على طبقة النقل تحمل حقلين إضافيين إلى جانب ترويسة IP: منفذ مصدر و منفذ وجهة. وكل منهما عدد صحيح بطول 16 بت، أي أن هناك 65535 رقم منفذ ممكناً لكل مضيف. ومجتمعاً مع عنوان IP، يحدد المنفذ نقطة نهاية واحدة محددة داخل المضيف -- محادثة محددة لبرنامج محدد واحد.
تتشارك برامج كثيرة عنوان IP واحداً؛ ويوجّه منفذ الوجهة كل حزمة واردة إلى البرنامج الصحيح.¶
9.8.1. المنافذ المعروفة جيداً¶
أرقام المنافذ الأولى الـ 1024 محجوزة بحكم العُرف للخدمات المعيارية. وبعضها سيصادفه القارئ:
22 -- SSH (بروتوكول الصدفة الآمنة Secure Shell، المستخدم لتسجيل الدخول البعيد المشفّر).
53 -- DNS، نظام أسماء النطاقات (يتناوله الأسماء وDNS).
80 -- HTTP، بروتوكول نقل النص التشعبي -- البروتوكول غير المشفّر للويب.
123 -- NTP، بروتوكول وقت الشبكة (كيف تضبط الأجهزة ساعاتها من خادم وقت).
443 -- HTTPS، أي HTTP المنقول عبر TLS (أمان طبقة النقل Transport Layer Security، الغلاف المعياري للتشفير لبروتوكولات الإنترنت) -- البروتوكول الذي يقف خلف كل صفحة ويب تُظهر أيقونة قفل في المتصفح.
العُرف هو ما يجعل من الممكن للمتصفح أن يتصل بـ http://example.com دون تحديد منفذ -- فهو يفترض 80 لأنه المنفذ المعروف جيداً لـ HTTP. والكاميرا التي تتصل بخادم ويب تفعل الشيء نفسه.
فوق 1024، تكون أرقام المنافذ غير مقيّدة ويمكن لأي برنامج المطالبة بأحدها. فخوادم قواعد البيانات (5432 لـ PostgreSQL، و 3306 لـ MySQL)، وخوادم التطبيقات، والبروتوكولات المخصصة، تعيش جميعها في مكان ما ضمن النطاق الأعلى.
9.8.2. المنافذ العابرة¶
تستمع الخوادم على منفذ معروف. ويستخدم العملاء منفذاً مختلفاً على طرفهم، يُختار حديثاً لكل اتصال صادر.
عندما تتصل الكاميرا بخادم ويب على المنفذ 443، تكون المحادثة بين
camera IP : <some-port> <--> server IP : 443
إن <some-port> هو منفذ عابر -- تختار MicroPython رقماً غير مستخدم من نطاق عالٍ، وتستخدمه طوال مدة الاتصال، ثم تحرره بعد ذلك. ولا يحتاج البرنامج النصي إلى الاهتمام بأي رقم اختير؛ فطبقة المقبس تتولى ذلك.
9.8.3. الاستماع مقابل التحدث¶
تعتمد المهمة التي يؤديها المنفذ على أي جانب من المحادثة هو فيه. وهناك حالتان متمايزتان:
ينتمي المنفذ المستمِع إلى برنامج يريد استقبال اتصالات غير مطلوبة. يخبر البرنامج MicroPython "أي حزم واردة موجّهة إليّ على المنفذ 80 هي لي"، ثم ينتظر. الخوادم تفعل ذلك.
ينتمي المنفذ المتصِل إلى برنامج يريد بدء محادثة. يختار البرنامج (أو يطلب من MicroPython أن تختار) منفذاً عابراً، ويرسل حزمة بهذا المنفذ كمنفذ مصدر ومنفذ الخادم المعروف جيداً كوجهة، ويستخدم زوج المنافذ نفسه لبقية المحادثة.
يمكن لبرنامج واحد أن يفعل كليهما في آن واحد، محتفظاً بمنافذ مختلفة لكل دور. فقد تستمع الكاميرا على المنفذ 8000 لاتصالات HTTP الواردة من واجهة مستخدم للتهيئة وكذلك تحتفظ باتصال HTTPS صادر إلى خادم بعيد على المنفذ 443. ولا يتداخل الدوران -- إذ تُعرَّف كل محادثة بالرباعية الكاملة (src IP, src port, dst IP, dst port)، ولا تتشارك محادثتان الرباعية نفسها.
9.8.4. ما الذي تفتحه المنافذ¶
بوجود المنافذ، تستطيع طبقة النقل أخيراً حل مشكلة التوصيل من برنامج إلى برنامج. فالحزمة تحمل الآن معلومات كافية ليتم توجيهها لا إلى المضيف الصحيح فحسب (عنوان IP) بل إلى المقبس الصحيح داخل ذلك المضيف (رقم المنفذ).
تغطي الصفحتان التاليتان النكهتين اللتين تقدمهما طبقة النقل فوق ذلك العنونة: UDP (بروتوكول مخطط بيانات المستخدم -- كل حزمة مستقلة، بلا ضمانات) و TCP (بروتوكول التحكم بالإرسال -- دفق متصل وموثوق ومرتّب).