9.6. מנות וניתוב

כתובת IP אומרת למי מיועדת הודעה. המנגנון שבפועל מספק אותה נקרא ניתוב, והוא התהליך של קפיצה-אחר-קפיצה שבו מנה נוסעת מהרשת המקומית של השולח לרשת המקומית של המקבל, אולי רחוקה מאוד.

9.6.1. מנה, בקצרה

מנה היא יחידת העבודה של שכבת ה-IP – מקטע של בתים עם כותרת קטנה ומטען. בכותרת יש שני שדות החשובים לניתוב:

  • כתובת ה-IP של המקור (מהיכן הגיעה המנה).

  • כתובת ה-IP של היעד (לאן היא הולכת).

המטען הוא כל מה ששכבת התעבורה ביקשה משכבת הרשת לספק. כותרת המנה כוללת גם מונה זמן-חיים (time-to-live), סיכום ביקורת על הכותרת וכמה דגלי בקרה. אף אחד מאלה אינו דבר שקוד ה-Python של המצלמה נוגע בו ישירות.

מנות אינן מבטיחות יותר מ“ניסינו“ – הן יכולות לאבד, להשתכפל או להגיע מחוץ לסדר. אמינות וסדר הם בעיות ששכבת התעבורה שמעל פותרת; שכבת הרשת פשוט עושה כמיטב יכולתה להעביר כל מנה לעבר יעדה.

9.6.2. קפיצה אחר קפיצה

המנה עוזבת את המצלמה ומגיעה להתקן הראשון שאינו יושב על המקטע המקומי של המצלמה: שער ברירת המחדל. (העמוד הקודם הזכיר את DHCP מוסר למצלמה את כתובת השער כשהרשת עלתה.) אותו התקן הוא נתב – קופסה שתפקידה לקבל מנות, להסתכל על היעד שלהן ולהעביר אותן הלאה.

A diagram showing five boxes. On the left, a camera labelled "10.0.0.42". Connected to a router labelled "10.0.0.1 / 203.0.113.5". Then a sequence of two unnamed routers in the middle. Then a router labelled "198.51.100.1 / 198.51.100.x". Finally a server labelled "198.51.100.20". An arrow with the label "destination: 198.51.100.20" travels along the chain from left to right.

מנה מהמצלמה אל היעד מדלגת בין נתבים, כל אחד צעד קרוב יותר.

לנתב יש טבלת ניתוב – רשימה של ”עבור יעדים התואמים לתבנית זו, שלח את המנה דרך ממשק זה“. עבור יעדים על אותה רשת כמו המצלמה, הרשומה אומרת ”שלח אותה בחזרה במורד הכבל שממנו הגיעה“. עבור יעדים באינטרנט הרחב, הרשומה אומרת ”שלח אותה לנתב במעלה הזרם“. עבור תבניות יעדים ידועות (VPN ארגוני, רשת של שותף עסקי ספציפי, חיבור לוויני), לנתב עשויה להיות רשומה ספציפית יותר שעוקפת את ברירת המחדל.

הנתב במעלה הזרם עושה את אותו דבר. וכך הבא. וכך הבא. כל קפיצה היא באותה צורה: קבל את המנה, חפש את היעד בטבלה, שלח אותה דרך הממשק הנכון. בסופו של דבר המנה מגיעה לנתב שכן נמצא על אותו מקטע מקומי כמו כתובת ה-IP של היעד. אותו נתב מבצע את הקפיצה האחרונה, היעד מקבל את המנה, והמסע נגמר.

9.6.3. נקודות הקצה אינן יודעות את המסלול

מצלמה ששולחת מנה לשרת מרוחק אינה יודעת כיצד המנה תגיע לשם. היא יודעת רק את כתובת ה-IP של היעד ואת כתובת שער ברירת המחדל שלה. כל מה שביניהם – אילו נתבים, אילו סיבים, אילו כבלים תת-ימיים – הוא משהו שהנתבים לאורך המסלול מחליטים תוך כדי תנועה, בהתבסס על הטבלאות שלהם. הנתבים עצמם יודעים רק את שכניהם המיידיים ואת הכיוון הכללי של יעדים נפוצים; אף התקן בודד באינטרנט אינו מחזיק מפה שלמה שלו.

ביזור זה הוא הסיבה שהרשת ממשיכה לעבוד כאשר מסלולים בודדים נכשלים. כבל מנותק היכן שהוא באמצע הופך לאירוע ניתוב-מחדש בכמה נתבים; נקודות הקצה לעולם אינן שמות לב. זו גם הסיבה שמנה ממצלמה בטוקיו לשרת בדבלין יכולה להצליח מבלי שאף צד ידע אילו מדינות נמצאות ביניהם.

9.6.4. מה המשמעות עבור סקריפט Python

תפקיד המצלמה בשכבת הרשת מסתכם ב:

  • להחזיק כתובת IP.

  • לדעת את כתובת שער ברירת המחדל (DHCP ממלא זאת אוטומטית).

  • למסור מנות יוצאות, ממוענות לכל IP, לאותו שער ולסמוך על שאר המסלול.

סקריפט לעולם אינו בוחר מסלול, לעולם אינו נותן שם לקפיצת ביניים, ולעולם אינו רואה את הנתבים שבאמצע. הוא כותב את כתובת ה-IP של היעד על המנה ושכבת הרשת משתלטת. מנקודת המבט של סקריפט Python כל הניתוב הוא רק תכונה של הרשת שאליה הצטרפה המצלמה – ”השער שולח מנות למקום מועיל עבורי“.

שכבת התעבורה שבאה לאחר מכן מניחה שהניתוב פשוט עובד, ובונה אמינות, סדר ומיעון תוכנית-לתוכנית על גבי זה.