1. ספרייה
  2. כתובות IP
  3. תרגום כתובות

עודכן לפני חודש

כל שיחת וידאו כוללת רגע בלתי אפשרי שאתה אף פעם לא רואה.

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

זהו מעבר NAT. זו הסיבה שתקשורת עמית-לעמית בכלל עובדת.

הבעיה שיוצר NAT

הנתב הביתי שלך מבצע טריק קסם יומיומי. הוא לוקח כתובת IP ציבורית אחת וגורם לה לעבוד עבור כל מכשיר בבית שלך. המחשב הנייד שלך מקבל 192.168.1.100. הטלפון שלך מקבל 192.168.1.101. הטלוויזיה החכמה שלך מקבלת 192.168.1.102. אף אחת מהכתובות הללו לא קיימת מחוץ לבית שלך.

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

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

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

STUN: גילוי הכתובת שלך

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

STUN — Session Traversal Utilities for NAT — עונה על שאלה אחת: "מה הכתובת הציבורית שלי?"

הנה ההחלפה:

  1. האפליקציה שלך שולחת בקשת קישור לשרת STUN באינטרנט הציבורי
  2. שרת ה-STUN בוחן את המנה המגיעה ומציין את כתובת ה-IP ומספר הפורט של המקור
  3. זו לא הכתובת הפרטית שלך — זה מה שהנתב שלך נראה מבחוץ, לאחר תרגום NAT
  4. השרת שולח את המידע הזה בחזרה: "אתה נראה ב-203.0.113.42, פורט 54321"

עכשיו יש לך מידע קריטי. אתה משתף כתובת זו עם העמית שלך דרך ערוץ אחר — בדרך כלל שרת איתות שאתם שניכם יכולים להגיע אליו. העמית שלך עושה אותו דבר. עכשיו שניכם יודעים את הקואורדינטות הציבוריות של השני.

STUN (RFC 8489) הוא פרוטוקול רזה במיוחד. החלפה בודדת, זמן תגובה של מילישניות, כמעט ללא שימוש ברוחב הפס.

אבל הנה מה שה-STUN לא אומר לך: האם הכתובת הזו אכן תעבוד.

מדוע סוג ה-NAT קובע את גורלך

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

Full Cone NAT הוא מתירני. ברגע שהנתב שלך יוצר מיפוי — נניח, פורט פנימי 50000 ממופה לפורט חיצוני 54321 — כל אחד באינטרנט יכול לשלוח מנות לאותו פורט חיצוני ולהגיע אליך. שלחת מנה אחת החוצה; עכשיו כולם יכולים לענות.

Restricted Cone NAT מוסיף תנאי. הנתב שלך מעביר רק מנות מכתובות שפנית אליהן בעבר. אם שלחת מנות לכתובת IP X, אז X יכול לענות. אבל כתובת Y לא יכולה, גם אם היא יודעת את הכתובת הציבורית ומספר הפורט שלך.

Port Restricted Cone NAT מהדק זאת עוד יותר. מנות נכנסות חייבות להגיע מאותה כתובת IP וגם מאותו פורט שפנית אליו במקור.

Symmetric NAT הוא המקום שבו חיבור ישיר לרוב מת. הנתב שלך יוצר מיפוי פורט חיצוני שונה לכל יעד שאתה מתקשר אליו. כשאתה שולח שאילתה לשרת STUN A, הנתב שלך מקצה פורט חיצוני 54321. כשאתה מנסה להגיע לעמית B, הנתב שלך מקצה פורט חיצוני 54322. הכתובת שסיפר לך שרת ה-STUN אינה הכתובת שהעמית שלך צריך להשתמש בה. אין "כתובת ציבורית" אחת עבורך — יש כתובת שונה לכל יעד.

בפועל, רוב הנתבים הביתיים ורשתות הסלולר מממשים וריאנטים של cone NAT. חומות אש ארגוניות ומכשירי אבטחה מממשים לרוב symmetric NAT. זו הסיבה שמשתמשים ארגוניים סובלים לעתים קרובות יותר מבעיות בחיבורי עמית-לעמית.

Hole Punching: תזמון מתואם

Hole punching מנצל את האופן שבו NAT יוצר ומתחזק מיפויי פורטים.

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

כך עובד UDP hole punching:

  1. שני העמיתים פונים לשרת תיאום ומשתפים את כתובותיהם הציבוריות (שהתגלו דרך STUN)
  2. השרת אומר לכל עמית היכן למצוא את השני
  3. שני העמיתים שולחים בו זמנית מנות UDP לכתובות הציבוריות של השני
  4. כשאתה שולח לעמית שלך, ה-NAT שלך יוצר מיפוי יוצא — הוא פורץ פתח
  5. כשמנת העמית שלך מגיעה, הפתח כבר קיים, ולכן הנתב מעביר אותה פנימה
  6. אותו דבר קורה בכיוון ההפוך
  7. חיבור ישיר נוצר

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

TCP hole punching קיים אבל שביר. TCP דורש לחיצת יד בשלושה שלבים, כך ששני העמיתים חייבים לבצע "פתיחה בו זמנית" — כל אחד מנסה להתחבר ברגע המדויק הנכון. נתבי NAT רבים לא מטפלים בזה טוב. זו הסיבה ש-WebRTC ורוב מערכות עמית-לעמית מעדיפות UDP.

Hole punching נכשל מול symmetric NAT. הפורט שהעמית שלך מנסה להגיע אליו אינו הפורט שה-NAT שלך הקצה לתקשורת איתו.

TURN: כשחיבור ישיר נכשל

TURN — Traversal Using Relays around NAT — הוא מוצא החירום כשהכל נכשל.

שרת TURN יושב באינטרנט הציבורי ופשוט מעביר מנות:

  1. אתה מתחבר לשרת ה-TURN ומבקש הקצאת ממסר
  2. השרת מקצה לך כתובת ציבורית ופורט על גבי השרת עצמו
  3. אתה משתף כתובת ממסר זו עם העמית שלך דרך איתות
  4. העמית שלך שולח מנות לכתובת הממסר
  5. שרת ה-TURN מעביר אותן אליך
  6. זרימה הפוכה עבור המנות היוצאות שלך

TURN (RFC 8656) עובד בכל תרחיש. גם חומת האש הארגונית המגבילה ביותר, גם symmetric NAT בשני הקצוות. אם אתה יכול ליצור חיבור יוצא לשרת ה-TURN, TURN עובד.

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

אבל זה הכרחי. נתוני תעשייה מצביעים על כך ש-15-30% מחיבורי WebRTC דורשים ממסר TURN, עם שיעורים גבוהים יותר בסביבות ארגוניות שבהן symmetric NAT וחומות אש קפדניות נפוצות. ללא TURN, חיבורים אלה היו פשוט נכשלים.

TURN הוא ההבדל בין "עובד לפעמים" ל"עובד בצורה אמינה".

ICE: ניסיון כל האפשרויות בו זמנית

Interactive Connectivity Establishment הוא המתזמר. ICE (RFC 8445) לא מחליף STUN, TURN או hole punching — הוא משלב אותם לתהליך שיטתי שמנסה כל שיטת חיבור אפשרית בו זמנית ובוחר את הזוכה.

איסוף מועמדים: כל עמית אוסף כל דרך שבה הוא עשוי להיות נגיש:

  • מועמדי מארח: כתובות IP מקומיות בכל ממשק רשת
  • מועמדי רפלקסיה של שרת: כתובות ציבוריות שהתגלו דרך STUN
  • מועמדי ממסר: כתובות שהוקצו משרתי TURN

עמית טיפוסי אוסף 10-20 מועמדים המייצגים נתיבי רשת שונים.

חילופי מועמדים: העמיתים מחליפים מועמדים אלה דרך איתות — בדרך כלל WebSocket לשרת שאליו שניהם יכולים להגיע.

בדיקות קישוריות: ICE בודק את כל שילובי המועמדים בו זמנית. כל עמית שולח בקשות קישור STUN לכל זיווג של מועמדים מקומיים ומרוחקים. הזוג הראשון שמשלים חילופים מוצלחים זוכה.

מערכת עדיפויות: ICE מעדיף נתיבים מהירים וזולים יותר:

  1. מועמדי מארח (רשת מקומית ישירה) — עדיפות גבוהה ביותר
  2. מועמדי רפלקסיה של שרת (אינטרנט ישיר דרך STUN) — עדיפות בינונית
  3. מועמדי ממסר (TURN) — עדיפות נמוכה ביותר

זה מבטיח שחיבורים ישירים יתגלו וישמשו לפני נסיגה לממסר. האפליקציה לא בוחרת — ICE מוצא את הנתיב הטוב ביותר אוטומטית.

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

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

WebRTC: הערימה המלאה

WebRTC — Web Real-Time Communication — מדגים כיצד כל הטכניקות הללו עובדות יחד.

כשאתה מתחיל שיחת WebRTC:

איתות: הדפדפן שלך מתחבר לשרת איתות (בדרך כלל WebSocket) לתיאום עם העמית

איסוף ICE: WebRTC אוסף מועמדים:

  • מגלה כתובות IP מקומיות (מועמדי מארח)
  • פונה לשרתי STUN לקבלת כתובות ציבוריות (מועמדי רפלקסיה של שרת)
  • מקצה כתובות ממסר משרתי TURN (מועמדי ממסר)

חילופי הצעה/תשובה: הדפדפן שלך יוצר הצעת SDP (Session Description Protocol) המכילה יכולות מדיה ומועמדי ICE. זה עובר דרך שרת האיתות לעמית שלך. הם מגיבים עם תשובת SDP המכילה את המועמדים שלהם.

בדיקות קישוריות: שני הדפדפנים בודקים בו זמנית את כל זוגות המועמדים

זרימת מדיה: לאחר ביסוס הקישוריות, שמע ווידאו מוצפנים זורמים ישירות בין העמיתים — או דרך TURN אם נדרש

בתנאים אופטימליים, כל התהליך הזה מסתיים בפחות משנייה. תרחישים מאתגרים הדורשים TURN מתחברים בדרך כלל תוך 2-3 שניות.

WebRTC מתקנן את ערימת מעבר ה-NAT המלאה. זו הסיבה ש-Google Meet, Microsoft Teams, Discord ומאות אפליקציות אחרות יכולות ליצור חיבורי עמית ללא קשר למורכבות הרשת.

מדוע זה חשוב

מעבר NAT אינו סקרנות אקדמית. זו תשתית בסיסית.

ועידות וידאו: זרם וידאו ברזולוציית 1080p צורך 2-4 Mbps. אם כל שיחה הייתה עוברת דרך שרת מרכזי, הספק משלם לקבל את הזרם שלך ולשלוח אותו לעמית שלך — כפול בעלויות רוחב הפס. עם עמית-לעמית דרך מעבר NAT, הזרמים זורמים ישירות בין המשתתפים. הספק לא משלם דבר עבור רוחב הפס הזה. ההשהייה יורדת מ-300-500 מילישניות דרך ממסר ל-100-200 מילישניות ישיר.

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

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

IoT וגישה מרחוק: מכשירי בית חכם ומצלמות אבטחה משתמשים במעבר NAT לחיבורים ישירים מהטלפון שלך לביתך — מבלי לחשוף מכשירים פומבית או לנתב הכל דרך שרתי ענן.

הדפוס: מעבר NAT הופך אפליקציות למהירות, זולות, פרטיות ומדרגיות יותר.

המצב הנוכחי

בשנת 2025, מעבר NAT הוא תשתית בשלה ומתוקנת. ה-RFCs המרכזיים — 8445 ל-ICE, 8489 ל-STUN, 8656 ל-TURN — מגדירים פרוטוקולים תואמים שעובדים על פני דפדפנים, אפליקציות ילידיות ומכשירי IoT.

שיעורי ההצלחה משתנים לפי סביבה. רשתות צרכניות עם cone NAT מגיעות בדרך כלל ל-70-85% חיבורי עמית-לעמית ישירים. סביבות ארגוניות עם symmetric NAT וחומות אש קפדניות רואות שימוש גבוה יותר ב-TURN — לפעמים 30% ומעלה מהחיבורים דורשים ממסר.

אימוץ IPv6 עשוי בסופו של דבר להפחית את השכיחות של NAT — לכל מכשיר תהיה כתובת ניתנת לניתוב ברחבי האינטרנט. אבל פריסת IPv6 נשארת איטית, ו-NAT בדרגת ספק (CGNAT) ברשתות ניידות מוסיף שכבות נוספות של תרגום. מעבר NAT יישאר חיוני לשנים.

מה חשוב

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

STUN מאפשר לך לגלות את הזהות הציבורית שלך. Hole punching מנצל את התנהגות NAT ליצירת נתיבים זמניים. TURN מספק ממסר כשנתיבים ישירים לא קיימים. ICE מתזמר את כל התהליך, מנסה הכל בו זמנית ובוחר את התוצאה הטובה ביותר.

יחד, טכניקות אלה משחזרות את מה ש-NAT לקח.

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

מעבר NAT הוא הדרך שבה קיבלנו בחזרה את האינטרנט עמית-לעמית.

שאלות נפוצות על מעבר NAT

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

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

האם אני צריך להפעיל שרתי STUN ו-TURN משלי?

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

מדוע WebRTC לפעמים עובד מיידית ולפעמים לוקח מספר שניות?

המהירות תלויה בתנאי הרשת. כשלשני העמיתים יש NAT מתירני (cone NAT), hole punching מצליח במהירות ו-ICE מוצא נתיב ישיר בפחות משנייה. כשאחד מהעמיתים או שניהם נמצאים מאחורי symmetric NAT או חומות אש קפדניות, ICE חייב לנסוג לממסר TURN, שלוקח יותר זמן לנהל משא ומתן. החיבורים של 2-3 שניות הם בדרך כלל נסיגות ל-TURN.

האם IPv6 יסלק את הצורך במעבר NAT?

מבחינה תיאורטית, כן. IPv6 מספק מספיק כתובות כדי שלכל מכשיר תהיה כתובת ניתנת לניתוב ברחבי האינטרנט, ומסלק NAT לחלוטין. בפועל, אימוץ IPv6 היה איטי, ורשתות רבות עדיין משתמשות ב-IPv4 עם NAT. גם עם IPv6, חומות אש עדיין עשויות לחסום חיבורים נכנסים, מה שדורש טכניקות מעבר דומות. מעבר NAT יישאר רלוונטי בעתיד הנראה לעין.

מקורות

האם דף זה היה מועיל?

😔
🤨
😃