9.20. סיכום¶
עברתם על השכבות שהודעת רשת חוצה בדרכה מהמצלמה אל שאר העולם:
המוטיבציה – רשתות קיימות כי חיווט נקודה-לנקודה מפסיק להתאים ברגע שיותר מכמה התקנים צריכים לתקשר, או כשהצד שכנגד אינו על אותו חוט, או כשתוכניות רבות חולקות את אותו קישור בו-זמנית. התשובה היא מדיה משותפת, כתובות לוגיות וניתוב.
המודל השכבתי – חמש שכבות, כל אחת פותרת בעיה אחת ומציעה ממשק נקי לשכבה הבאה. השכבות הפיזית והקישורית מטפלות בביטים ובפריימים בין שכנים ישירים, שכבת הרשת מטפלת בכתובות ובניתוב לרוחב האינטרנט, שכבת התעבורה מטפלת במסירה מתוכנית לתוכנית, ופרוטוקולי יישום בונים על כל זה.
השכבות התחתונות – Ethernet ו-Wi-Fi כטכנולוגיות קישור מעשיות; כתובות MAC מזהות חומרה בקטע מקומי. מודול ה-
networkשל המצלמה חושף כפתור אחד ששווה להכיר: לאיזו רשת Wi-Fi להצטרף. לאחר מכן, כל מה שמתחת הוא אוטומטי.שכבת הרשת (IP) – כתובות IPv4 ו-IPv6 מזהות מארחים באופן בלתי תלוי באיזה כבל הם מחוברים. נתבים מקפיצים חבילות בין קטעים מקומיים עד שהן מגיעות. טווחי כתובות פרטיות ו-NAT הם הסיבה שלרשתות ביתיות ומשרדיות יש מרחב כתובות פנימי משלהן וכתובת ציבורית משותפת אחת בקצה; תעבורה יוצאת עובדת בחופשיות, נכנסת זקוקה לעזרה.
שכבת התעבורה – פורטים מזהים תוכניות בתוך מארח; הזוג המלא
(IP, port)מזהה שקע ספציפי אחד. UDP הוא שכבה דקה ששולחת דאטגרם מכיל-עצמו אחד בכל פעם ללא ערבויות – מהיר, זול, והכלי הנכון כשאובדן מקובל. TCP הוא זרם בתים מוכוון-חיבור, אמין וממוין – סוס העבודה עבור רוב תעבורת האינטרנט, ששולמים עליו במחיר של הלוך-ושוב אחד של השהיית לחיצת יד.ממשק ה-Python –
socket.socketהיא המחלקה היחידה עבור שני הפרוטוקולים.sendto()/recvfrom()עבור UDP; תבניות ה-connect-או-listen בתוספתsend()/recv()עבור TCP. שקעים משתלבים בנקיון עםasyncio:asyncio.open_connection()ו-asyncio.start_server()נותנים לכל חיבור TCP זוג קורא/כותב, כך שהרבה שיחות בו-זמניות חולקות לולאת אירועים אחת ללא threading.שמות וזמן –
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 כדוגמה מעובדת של כל שכבה שמתחתיו מחוברות יחד. בית type-and-flags באורך בית אחד, שדה remaining-length באורך משתנה, נושא UTF-8 עם קידומת אורך, והמטען, כולם נעים על גבי TCP (ואופציונלית בתוך TLS) אל ברוקר שמפזר את ההודעה לכל מנוי על הנושא. ה-client
mqttהמצורף עוטף את פורמט החוט בממשקconnect/publish/subscribeקטן מספיק כדי לקרוא בישיבה אחת.
זה מספיק כדי לכתוב יישומי מצלמה שמשוחחים עם מכונות אחרות, מפרסמים נתונים לשירותים מרוחקים, מקבלים חיבורים מ-clientים ברשת המקומית, ועושים את כל זה בו-זמנית עם שאר עבודת המצלמה.
9.20.1. שימוש בעיון זה בהמשך¶
התייחסו לפרקי הרשת כחומר עיון; חזרה לכאן עבור הצורה המדויקת של מאזין UDP או תבנית TLS-עם-asyncio היא השימוש המכוון. עמודי העיון network — הגדרת רשת, socket — מודול socket, ssl — מודול SSL/TLS, ו-ntptime — לקוח NTP פשוט מפרטים כל מתודה, דגל וקבוע במקום אחד כשהשאלה היא רק ”מהו השם המדויק של הקריאה הזו“.
9.20.2. לאן ממשיכים מכאן¶
שרתי אינטרנט הם הנושא העיקרי הבא. כששקעים עובדים ו-TLS זמין, השכבה הטבעית הבאה היא הפרוטוקולים שבונים עליהם: HTTP להגשת תוכן וממשקי API, WebSockets לשמירה על חיבורים פתוחים לשני הכיוונים, והמסגרות הקטנות שמסתירות את הקוד החוזר. כל מה שמהמקטע הזה ממשיך הלאה – שרת אינטרנט הוא, אחרי הכל, רק שרת TCP שמדבר HTTP על השקעים שהוא מקבל, לעיתים קרובות עם TLS שעוטף את הכל.