9.8. פורטים¶
כתובת IP אומרת לאיזה מארח מנה מיועדת. מארח מודרני מריץ תוכניות רבות בו-זמנית – דפדפן אינטרנט, לקוח צ’אט, שיחת וידאו, משימת גיבוי – וכל אחת מהן שולחת ומקבלת מנות במקביל. לשכבת ה-IP אין דרך להבחין ביניהן; היא פשוט מוסרת כל מנה שמגיעה אל ”המארח“. משהו חייב להחליט איזו מנה שייכת לאיזו תוכנית.
מספר הפורט הוא התשובה. כל מנה בשכבת התעבורה נושאת שני שדות נוספים מעבר לכותרת ה-IP: פורט מקור ופורט יעד. כל אחד הוא מספר שלם של 16 ביט, כך שיש 65535 מספרי פורט אפשריים לכל מארח. בשילוב עם כתובת ה-IP, הפורט מזהה נקודת קצה ספציפית אחת בתוך מארח – שיחה ספציפית אחת של תוכנית ספציפית אחת.
תוכניות רבות חולקות כתובת IP אחת; פורט היעד מנתב כל מנה שמגיעה אל הנכונה.¶
9.8.1. פורטים מוכרים¶
1024 מספרי הפורט הראשונים שמורים על פי מוסכמה עבור שירותים סטנדרטיים. כמה שהקורא יפגוש:
22 – SSH (פרוטוקול ה-Secure Shell, המשמש להתחברות מרחוק מוצפנת).
53 – DNS, מערכת שמות הדומיינים (מתואר ב-שמות ו-DNS).
80 – HTTP, פרוטוקול ה-Hypertext Transfer – הפרוטוקול הלא-מוצפן של הרשת.
123 – NTP, פרוטוקול ה-Network Time (כיצד התקנים מכווננים את שעוניהם משרת זמן).
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 (ה-User Datagram Protocol – כל מנה עצמאית, ללא ערבויות) ו-TCP (ה-Transmission Control Protocol – זרם מחובר, אמין ומסודר).