בלוג

שרתי STUN ו-TURN: מה שיחת וידאו צריכה כדי להתחבר

· Andrij Tkachenko · דקת קריאה אחת

שני חלונות אפליקציה בשיחת וידאו, הדרך הישירה ביניהם נחסמת בחומת אש, והם מתחברים דרך מגדל ממסר שמעליה

שיחת וידאו בדפדפן נראית כמו משהו שאמור להיות פשוט. WebRTC שולח קול ווידאו ישירות ממכשיר אחד לשני, בלי שרת באמצע. ואז אתם בודקים אותה מחוץ לרשת שלכם, וחלק מהשיחות מצלצלות, נענות, ונשארות בלי קול ועם מסך שחור. ברוב המקרים הקוד תקין. מה שחסר הוא שרת STUN, שרת TURN, או שניהם.

הפוסט הזה מסביר מה כל אחד מהם עושה, למה שיחה צריכה אותם, מה נדרש כדי להריץ שרת TURN משלכם, ומה עושים עם השיחות שאפילו ממסר לא מצליח לחבר.

למה שני מכשירים לא יכולים פשוט להתחבר

כמעט לאף מכשיר באינטרנט אין כתובת ציבורית משלו. מחשב נייד בבית נמצא מאחורי נתב, טלפון נמצא מאחורי הספק הסלולרי שלו, ומחשב במשרד נמצא מאחורי חומת אש. כל אחד מהם מכיר רק את הכתובת הפרטית שלו, כמו 192.168.1.23, שלא אומרת דבר לצד השני של השיחה.

לפני ששיחה יכולה להתחיל, כל מכשיר צריך לגלות איך אפשר להגיע לשני, והשניים צריכים לנסות את הדרכים האלה עד שאחת מהן עובדת. WebRTC עושה את זה בעזרת ICE, שאוסף כתובות מועמדות לכל מכשיר ובודק אותן בזוגות. חלק מהמועמדות האלה מגיעות מ-STUN ומ-TURN.

מה שרת STUN עושה

שרת STUN עונה על שאלה אחת: "מה הכתובת שלי, כפי שאתה רואה אותה?" מכשיר שולח אליו בקשה קטנה, והשרת עונה עם הכתובת הציבורית והפורט שמהם הגיעה הבקשה. המכשיר מוסיף את הכתובת הזו למועמדות שלו, הצד השני מנסה אותה, וברוב הרשתות הביתיות השיחה מתחברת ישירות.

STUN זול. הוא רואה כמה חבילות קטנות בתחילת השיחה ושום דבר אחר כך, כך ששרת STUN אחד יכול לשרת המון שיחות, ויש שרתים ציבוריים שכל אחד יכול להשתמש בהם. כשיש דרך ישירה, STUN הוא כל מה ששיחה צריכה.

מה שרת TURN עושה

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

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

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

להריץ שרת TURN משלכם

שרתי TURN בקוד פתוח קיימים ועובדים היטב, וצוותים רבים מתחילים מהם. מה זה דורש:

  • שרת עם כתובת ציבורית והרבה רוחב פס, קרוב למשתמשים שלכם. ממסר ביבשת אחרת מוסיף השהיה שאנשים שומעים.
  • הפורטים הנכונים. הפורט הרגיל הוא 3478 ב-UDP וב-TCP. ברשתות שמאפשרות רק תעבורת ווב, הממסר צריך לענות גם בפורט 443 עם TLS, כלומר תעודה לשם שלו, שמחודשת בזמן.
  • פרטי גישה עם תוקף מוגבל. שרת TURN לעולם לא אמור לקבל שם משתמש וסיסמה קבועים שיושבים בדף שלכם, שם כל אחד יכול להעתיק אותם. הדרך המקובלת היא סוד משותף לאפליקציה שלכם ולממסר: השרת שלכם יוצר לכל שיחה שם משתמש וסיסמה שמפסיקים לעבוד אחרי זמן מה.
  • יותר מאחד, ככל שאתם גדלים. ממסר אחד הוא נקודה אחת שבה כל שיחה יכולה להיכשל. משתמשים באזורים אחרים רוצים ממסר קרוב אליהם, וכל אחד מהם צריך ניטור, עדכונים ומקום לגדול.
  • בדיקה מרשתות אמיתיות. ממסר שעובד מהמשרד שלכם עלול להיכשל מטלפון ברשת סלולרית או ממחשב נייד ב-Wi-Fi של מלון. בדקו מהרשתות שהמשתמשים שלכם נמצאים בהן.

שום דבר מזה אינו קשה, אבל זה שירות שצריך להמשיך להפעיל כל עוד יש באפליקציה שלכם שיחות.

כשאפילו TURN לא מצליח לחבר שיחה

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

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

איך WordPlus Cloud מחבר שיחות

WordPlus Cloud מפעיל את שלוש הדרכים, כך ששיחה בין שני אנשים תמיד מתחברת, בכל רשת:

  1. ישירות, בין שני המכשירים, ברוב הרשתות. הדרך המהירה ביותר.
  2. דרך הממסרים שלנו, כשחומת אש חוסמת את הדרך הישירה. הם עונים בפורטים של הווב, 443 ו-80, וגם ב-3478, כך ששיחה עוברת בכל מקום שאתרים עוברים. כל אדם בכל שיחה מקבל פרטי גישה משלו לממסרים, שתוקפם פג אחרי כמה שעות, כך שאף אחד לא יכול להשתמש בממסרים מחוץ לשיחות שלכם.
  3. דרך שרתי המדיה שלנו, כשאפילו הממסרים לא יכולים להעביר את השיחה. היא עוברת לשם וממשיכה, בלי לנתק.

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

זה עובד באותה דרך ב-Better Messages ב-WordPress ובאפליקציות שלכם ב-Next.js, ב-Laravel, ב-Django ובסטאקים אחרים, עם ערכות ה-SDK שלנו. העמוד שיחות וידאו ושיחות קבוצתיות לאפליקציה שלכם מראה מה ערכות ה-SDK נותנות לכם, ו-איך שיחות עובדות בתיעוד שלנו מראה את הקוד.