9.20. خلاصة¶
لقد سرتَ عبر الطبقات التي تعبرها رسالة الشبكة في طريقها من الكاميرا إلى بقية العالم:
الدافع -- توجد الشبكات لأن التوصيل المباشر من نقطة إلى نقطة يتوقف عن التوسّع في اللحظة التي يحتاج فيها أكثر من جهازين إلى التواصل، أو عندما لا يكون الطرف المقابل على السلك نفسه، أو عندما تتشارك برامج عديدة الوصلة نفسها في آنٍ واحد. والحل هو الوسائط المشتركة، والعناوين المنطقية، والتوجيه.
النموذج الطبقي -- خمس طبقات، كل منها تحل مشكلة واحدة وتقدم واجهة نظيفة للطبقة التالية. تتولى الطبقتان الفيزيائية وطبقة الوصلة البتات والإطارات بين الجيران المباشرين، وتتولى طبقة الشبكة العنونة والتوجيه عبر الإنترنت، وتتولى طبقة النقل التسليم من برنامج إلى برنامج، وتبني بروتوكولات التطبيقات على كل ذلك.
الطبقات السفلى -- Ethernet و Wi-Fi بوصفهما تقنيتي وصلة عمليتين؛ وعناوين MAC تحدد العتاد على مقطع محلي. وتكشف وحدة
networkالخاصة بالكاميرا مقبضاً واحداً يستحق المعرفة: أي شبكة Wi-Fi ينبغي الانضمام إليها. وبعد ذلك، كل ما هو أدنى يحدث تلقائياً.طبقة الشبكة (IP) -- تحدد عناوين IPv4 و IPv6 المضيفين بصرف النظر عن الكابل الموصولين به. وتنقل الموجّهات الحزم قفزاً بين المقاطع المحلية حتى تصل. ونطاقات العناوين الخاصة و NAT هما السبب في أن الشبكات المنزلية والمكتبية لها مساحة عناوين داخلية خاصة بها وعنوان عام واحد مشترك عند الحافة؛ فحركة المرور الصادرة تعمل بحرية، أما الواردة فتحتاج إلى مساعدة.
طبقة النقل -- تحدد المنافذ البرامج داخل المضيف؛ والزوج الكامل
(IP, port)يحدد مقبساً واحداً بعينه. إن UDP طبقة رقيقة ترسل مخطط بيانات واحداً مكتفياً بذاته في كل مرة بلا أي ضمانات -- سريع، ورخيص، وهو الأداة الصحيحة عندما يكون الفقدان مقبولاً. أما TCP فهو تدفق بايتات موجّه نحو الاتصال، موثوق، ومرتب -- وهو حصان العمل لمعظم حركة مرور الإنترنت، يُدفَع ثمنه بجولة واحدة من زمن استجابة المصافحة.واجهة Python البرمجية -- إن
socket.socketهي الصنف الواحد لكلا البروتوكولين. فـsendto()/recvfrom()لـ UDP؛ وأنماط الاتصال أو الإصغاء بالإضافة إلىsend()/recv()لـ TCP. وتتزاوج المقابس بسلاسة معasyncio: فـasyncio.open_connection()وasyncio.start_server()تمنحان كل اتصال TCP زوجاً من القارئ/الكاتب، بحيث تتشارك محادثات متزامنة عديدة حلقة أحداث واحدة دون استخدام الخيوط.الأسماء والوقت -- تحوّل
socket.getaddrinfo()اسماً مثلexample.comإلى عنوان IP جاهز لتسليمه إلى مقبس. وتضبطnetwork.hostname()اسم الكاميرا الخاص بها، الذي تسجّله الموجّهات في DNS المحلي الخاص بها والذي يجيب عنه مستجيب mDNS المدمج في الكاميرا بوصفه<name>.local. أماntptime.settime()فهي الفكرة نفسها "ابحث عن شيء على الشبكة" مطبّقة على وقت الساعة الجدارية، حيث تضبط الساعة الداخلية على التوقيت العالمي المنسق UTC من خادم NTP عام.التشفير -- تغلّف
sslالمقبس داخل TLS. ولا تأتي الكاميرا مزوّدة بمخزن لسلطات الشهادات، لذا تحصل جاهزاً للاستخدام على التشفير فقط -- فلم تعد المحادثة نصاً صريحاً، لكن الكاميرا لا تتحقق ممن أجاب. وللمصادقة الحقيقية -- التحقق من خوادم HTTPS العامة، أو تشغيل الكاميرا بوصفها خادم TLS، أو TLS المتبادل -- يُغطّى سير العمل القائم على الشهادات في العمل مع شهادات TLS. ويستخدم DTLS (أي TLS فوق UDP) الوحدة نفسها بالطريقة نفسها.بروتوكول تطبيق حقيقي -- MQTT بوصفه المثال العملي على كل طبقة دونه موصولة معاً. فبايت واحد للنوع والرايات، وحقل طول متبقٍّ متغير الطول، وموضوع بترميز UTF-8 مسبوق بطوله، ثم الحمولة، كلها تسافر عبر TCP (واختيارياً داخل TLS) إلى وسيط يوزّع الرسالة على كل مشترك في الموضوع. ويغلّف عميل
mqttالمرفق التنسيق السلكي في واجهة برمجية منconnect/publish/subscribeصغيرة بما يكفي لقراءتها في جلسة واحدة.
هذا كافٍ لكتابة تطبيقات كاميرا تتواصل مع آلات أخرى، وتنشر البيانات إلى خدمات بعيدة، وتقبل اتصالات من عملاء على الشبكة المحلية، وتفعل كل ذلك بالتزامن مع بقية عمل الكاميرا.
9.20.1. استخدام هذا المرجع لاحقاً¶
عامِل فصول الشبكات بوصفها مادة مرجعية؛ فالعودة إليها لمعرفة الشكل الدقيق لمُصغٍ UDP أو نمط TLS-مع-asyncio هو الاستخدام المقصود منها. وتسرد صفحات المرجع network --- تهيئة الشبكة و socket --- وحدة المقابس (socket) و ssl --- وحدة SSL/TLS و ntptime --- عميل NTP بسيط كل دالة وراية وثابت في مكان واحد عندما يكون السؤال هو فقط "ما الاسم الدقيق لهذا الاستدعاء".
9.20.2. إلى أين تذهب من هنا¶
خوادم الويب هي الموضوع الرئيسي التالي. فمع عمل المقابس وتوفّر TLS، تكون الطبقة الطبيعية التالية للأعلى هي البروتوكولات التي تُبنى عليهما: HTTP لتقديم المحتوى وواجهات API، و WebSockets لإبقاء الاتصالات مفتوحة في الاتجاهين، وأطر العمل الصغيرة التي تخفي الكود النمطي المتكرر. وكل ما في هذا القسم يُحمل قُدُماً -- فخادم الويب، في نهاية المطاف، ليس سوى خادم TCP يتحدث HTTP على المقابس التي يقبلها، وغالباً مع TLS يغلّف كل شيء.