9.9. UDP – שלח חבילה, קווה לטוב ביותר¶
UDP, ראשי תיבות של User Datagram Protocol, הוא הפשוט מבין שני השירותים שמציעה שכבת התעבורה. כל שליחת UDP היא דאטגרם (datagram) אחד – חתיכת בתים מכילה-עצמה הממוענת ל-IP ולפורט, ומושלכת לרשת בכוחות עצמה. הפרוטוקול מוסר אותה אם הוא יכול; אם אינו יכול, הוא אינו מנסה שוב, אינו מזהיר את השולח, ואינו שומר על סדר כלשהו בין הדאטגרמים.
9.9.1. מה UDP מוסיף ל-IP¶
UDP הוא שכבה דקה מעל IP. הוא מוסיף שלושה דברים למסירת ה-IP הגולמית:
מספרי פורט בשני הקצוות, כך שניתן למסור דאטגרם אל התוכנית הנכונה במארח היעד, ולא רק אל המארח (ראו פורטים).
שדה אורך כדי שהמקבל ידע בדיוק כמה בתים של מטען (payload) לקרוא.
סכום ביקורת קטן (checksum) על הכותרת והמטען, כך שהמקבל יכול לזהות דאטגרם פגום ולהשליך אותו.
זה הכל. כל שאר מה ש-IP עשה או לא עשה, UDP משמר. דאטגרמים אינם נשלחים שוב. הם יכולים להגיע מחוץ לסדר. הם יכולים להשתכפל בשל מוזרויות של הרשת הבסיסית. הם יכולים להיות מושלכים בשקט אם הרשת גדושה, אם החוצץ (buffer) ביעד מלא, או אם אחד הנתבים שבדרך מחליט כך.
כל דאטגרם UDP נשלח באופן עצמאי. אם אחד אובד בדרך, שום דבר אינו מודיע לשולח או למקבל – הפער שקט.¶
9.9.2. מדוע בכלל מישהו ישתמש בו¶
אם UDP כל כך לא אמין, למה בכלל שיהיה קיים? שלוש סיבות.
מהירות ותקורה. שליחת UDP היא חבילה בודדת שיוצאת; ללא לחיצת יד, ללא אישורים, ללא מצב חיבור לתחזק. עלות ההשהיה ורוחב הפס מינימליים.
הודעות עצמאיות. חלק מהתעבורה היא זרם של עדכוני מצב שבו כל הודעה היא תמונת בזק (snapshot) רעננה והודעה ישנה חסרת ערך. מצלמה שמפרסמת ”אני עדיין בחיים, הנה הקריאה הנוכחית שלי“ מדי שנייה אכפת לה ממסירת כל קריאה חדשה, ולא משחזור הקריאות שאבדו.
Multicast. דאטגרם UDP בודד יכול להישלח למקבלים רבים בו-זמנית. (TCP אינו יכול לעשות זאת; כל חיבור TCP הוא בין בדיוק שתי נקודות קצה.) שימושי עבור גילוי שירותים, טלמטריה למאזינים רבים, הזרמת וידאו.
כאשר הרשת טובה והסובלנות של השולח לאובדן גבוהה, UDP הוא התשובה הנכונה. כאשר יש להבטיח מסירה וסדר, UDP זקוק לשכבת אמינות נוספת מעליו, או שעל היישום פשוט להשתמש ב-TCP במקום.
9.9.3. מתי לא להשתמש בו¶
כדאי גם להבהיר את ההפך. UDP הוא הבחירה השגויה כאשר:
כל בית חשוב. נתוני תצורה, עדכוני קוד, עסקאות חתומות – כל מקרה שבו בית חסר הופך את התוצאה לשגויה.
הסדר חשוב. דאטגרם UDP מספר 2 עשוי להגיע לפני דאטגרם מספר 1.
ההודעה גדולה. מטענים גדולים חייבים להיות מפוצלים לדאטגרמים קטנים יותר על ידי היישום; שכבת התעבורה לא תעשה זאת. אם חתיכה אחת כלשהי אובדת, ההודעה כולה אינה שלמה.
אם משהו מאלה תקף, פנו ל-TCP במקום.
9.9.4. דוגמאות קונקרטיות במצלמה¶
דוגמאות מצד המצלמה לתעבורת UDP בשטח:
גילוי. מצלמה משדרת דאטגרם ”מי כאן“ אל הרשת המקומית בעת ההפעלה; התקנים אחרים משיבים.
טלמטריה. פעם בשנייה, המצלמה שולחת דאטגרם קטן עם קריאות החיישן הנוכחיות שלה אל אוסף. אובדן דגימה מזדמנת אינו משנה כי הבאה מגיעה ממילא בעוד שנייה.
סנכרון זמן. NTP, פרוטוקול זמן הרשת, רץ על גבי UDP. ה-client שולח בקשה קטנה, ה-server משיב עם הזמן הנוכחי; אם התשובה אובדת, ה-client פשוט שואל שוב מאוחר יותר.
חיפושי DNS. שאילת הרשת ”לאיזה IP ממופה השם הזה?“ רצה על גבי UDP. (מכוסה ב-שמות ו-DNS.)
ממשק ה-Python לשליחה וקבלה של דאטגרמים נמצא ב-שקעי UDP, לאחר ששאר סיפור שכבת התעבורה במקומו.