הגדרת חיבור TCP
כאשר אנו גולשים באינטרנט, שולחים אימייל או משחקים במשחק מקוון, לעתים קרובות איננו חושבים על חיבור הרשת המורכב מאחוריו. עם זאת, צעדים קטנים לכאורה אלו הם שמבטיחים תקשורת יציבה בינינו לבין השרת. אחד השלבים החשובים ביותר הוא הגדרת חיבור ה-TCP, והליבה של זה היא לחיצת היד התלת כיוונית.
מאמר זה ידון בפירוט בעקרון, בתהליך ובחשיבות של לחיצת היד התלת-כיוונית. שלב אחר שלב, נסביר מדוע יש צורך בלחיצת היד התלת כיוונית, כיצד היא מבטיחה יציבות ואמינות חיבור, ועד כמה היא חשובה להעברת נתונים. עם הבנה מעמיקה יותר של לחיצת היד התלת כיוונית, נקבל הבנה טובה יותר של המנגנונים הבסיסיים של תקשורת רשת וראייה ברורה יותר של מהימנות חיבורי TCP.
תהליך לחיצת יד תלת כיוונית TCP ומעברי מצב
TCP הוא פרוטוקול הובלה מכוון חיבור, הדורש יצירת חיבור לפני העברת נתונים. תהליך יצירת חיבור זה נעשה על ידי לחיצת יד תלת כיוונית.
בואו נסתכל מקרוב על מנות ה-TCP שנשלחות בכל חיבור.
בתחילה, גם הלקוח וגם השרת סגורים. ראשית, השרת מאזין באופן פעיל לפורט ונמצא במצב LISTEN, כלומר יש להפעיל את השרת. לאחר מכן, הלקוח מוכן להתחיל לגשת לדף האינטרנט. הוא צריך ליצור חיבור עם השרת. הפורמט של חבילת החיבור הראשונה הוא כדלקמן:
כאשר לקוח יוזם חיבור, הוא יוצר מספר רצף ראשוני אקראי (client_isn) ומציב אותו בשדה "מספר רצף" של כותרת ה-TCP. במקביל, הלקוח מגדיר את עמדת דגל SYN ל-1 כדי לציין שהחבילה היוצאת היא חבילת SYN. הלקוח מציין שהוא מעוניין ליצור חיבור עם השרת על ידי שליחת חבילת ה-SYN הראשונה לשרת. חבילה זו אינה מכילה נתוני שכבת יישומים (כלומר, נתונים שנשלחו). בשלב זה, סטטוס הלקוח מסומן כ-SYN-SENT.
כאשר שרת מקבל חבילת SYN מלקוח, הוא מאתחל באקראי את המספר הסידורי שלו (server_isn) ולאחר מכן מכניס את המספר הזה בשדה "מספר סידורי" של כותרת ה-TCP. לאחר מכן, השרת מזין client_isn + 1 בשדה "מספר אישור" ומגדיר גם סיביות SYN וגם ACK ל-1. לבסוף, השרת שולח את החבילה ללקוח, שאינה מכילה נתונים של שכבת יישום (ואין נתונים עבור השרת לשלוח). בשלב זה, השרת נמצא במצב SYN-RCVD.
ברגע שהלקוח מקבל את החבילה מהשרת, הוא צריך לבצע את האופטימיזציות הבאות כדי להגיב לחבילת התשובה הסופית: ראשית, הלקוח מגדיר את סיביות ה-ACK של כותרת ה-TCP של חבילת התשובה ל-1; שנית, הלקוח מזין את הערך server_isn + 1 בשדה "אשר מספר תשובה"; לבסוף, הלקוח שולח את החבילה לשרת. חבילה זו יכולה לשאת נתונים מהלקוח לשרת. עם השלמת פעולות אלו, הלקוח יכנס למצב ESTABLISHED.
ברגע שהשרת מקבל את חבילת התשובות מהלקוח, הוא גם עובר למצב ESTABLISHED.
כפי שניתן לראות מהתהליך לעיל, בעת ביצוע לחיצת יד תלת כיוונית, לחיצת היד השלישית רשאית לשאת נתונים, אך שתי לחיצות היד הראשונות אינן. זו שאלה שנשאלת הרבה בראיונות. לאחר השלמת לחיצת היד התלת כיוונית, שני הצדדים נכנסים למצב ESTABLISHED, מה שמציין שהחיבור נוצר בהצלחה, ובשלב זה הלקוח והשרת יכולים להתחיל לשלוח נתונים זה לזה.
למה שלוש לחיצות ידיים? לא פעמיים, ארבע פעמים?
התשובה הנפוצה היא "כי לחיצת היד התלת כיוונית מבטיחה את יכולת הקבלה והשליחה". תשובה זו נכונה, אך היא רק הסיבה פני השטח, אינה מציגה את הסיבה העיקרית. בהמשך, אנתח את הסיבות ללחיצת היד המשולשת משלושה היבטים כדי להעמיק את הבנתנו בנושא זה.
לחיצת היד התלת כיוונית יכולה למנוע ביעילות את האתחול של חיבורים שחוזרים על עצמם היסטורית (הסיבה העיקרית)
לחיצת היד התלת כיוונית מבטיחה ששני הצדדים קיבלו מספר רצף ראשוני אמין.
לחיצת היד התלת-כיוונית מונעת בזבוז משאבים.
סיבה 1: הימנע מהצטרפות כפולות היסטוריות
בקצרה, הסיבה העיקרית ללחיצת היד התלת-כיוונית היא למנוע בלבול שנגרם כתוצאה מאתחול החיבור הכפול הישן. בסביבת רשת מורכבת, שידור מנות הנתונים לא תמיד נשלח למארח היעד בהתאם לזמן שצוין, ומנות נתונים ישנות עשויות להגיע תחילה למארח היעד בגלל עומס ברשת וסיבות אחרות. כדי להימנע מכך, TCP משתמש בלחיצת יד תלת כיוונית כדי ליצור את החיבור.
כאשר לקוח שולח מספר מנות יצירת חיבור SYN ברצף, במצבים כמו עומס ברשת, עלולים להתרחש הדברים הבאים:
1- מנות ה-SYN הישנות מגיעות לשרת לפני מנות ה-SYN האחרונות.
2- השרת יענה על חבילת SYN + ACK ללקוח לאחר קבלת חבילת SYN הישנה.
3- כאשר הלקוח מקבל את חבילת SYN + ACK, הוא קובע שהחיבור הוא חיבור היסטורי (פג תוקף מספר רצף או פסק זמן) בהתאם להקשר שלו, ולאחר מכן שולח את חבילת ה- RST לשרת כדי לבטל את החיבור.
עם חיבור של שתי לחיצות ידיים, אין דרך לקבוע אם החיבור הנוכחי הוא חיבור היסטורי. לחיצת היד התלת-כיוונית מאפשרת ללקוח לקבוע אם החיבור הנוכחי הוא חיבור היסטורי בהתבסס על ההקשר כאשר הוא מוכן לשלוח את החבילה השלישית:
1- אם מדובר בחיבור היסטורי (פג תוקף מספר רצף או פסק זמן), החבילה שנשלחה על ידי לחיצת היד השלישית היא חבילת RST לביטול החיבור ההיסטורי.
2- אם זה לא חיבור היסטורי, החבילה שנשלחה בפעם השלישית היא חבילת ACK, ושני הצדדים המתקשרים מצליחים ליצור את החיבור.
לכן, הסיבה העיקרית לכך ש-TCP משתמש בלחיצת היד התלת כיוונית היא שהיא מאתחלת את החיבור כדי למנוע חיבורים היסטוריים.
סיבה 2: לסנכרן את מספרי הרצף הראשוניים של שני הצדדים
שני הצדדים של פרוטוקול TCP חייבים לשמור על מספר רצף, שהוא גורם מפתח כדי להבטיח שידור אמין. מספרי רצף ממלאים תפקיד חשוב בחיבורי TCP. הם עושים את הפעולות הבאות:
המקלט יכול לבטל נתונים כפולים ולהבטיח את דיוק הנתונים.
המקלט יכול לקבל מנות לפי סדר מספר הרצף כדי להבטיח את שלמות הנתונים.
● מספר הרצף יכול לזהות את חבילת הנתונים שהתקבלה על ידי הצד השני, מה שמאפשר העברת נתונים אמינה.
לכן, עם יצירת חיבור TCP, הלקוח שולח מנות SYN עם מספר הרצף הראשוני ודורש מהשרת להשיב עם חבילת ACK המציינת קליטה מוצלחת של חבילת SYN של הלקוח. לאחר מכן, השרת שולח את חבילת ה-SYN עם מספר הרצף הראשוני ללקוח ומחכה שהלקוח יענה, אחת ולתמיד, כדי להבטיח שמספרי הרצף הראשוניים מסונכרנים בצורה מהימנה.
למרות שלחיצת יד בארבעה כיוונים אפשרית גם לסנכרן בצורה מהימנה את מספרי הרצף הראשוניים של שני הצדדים, ניתן לשלב את הצעד השני והשלישי לשלב אחד, וכתוצאה מכך לחיצת יד תלת כיוונית. עם זאת, שתי לחיצות היד יכולות להבטיח רק שמספר הרצף הראשוני של צד אחד יתקבל בהצלחה על ידי הצד השני, אך אין ערובה לכך שניתן לאשר את מספר הרצף הראשוני של שני הצדדים. לכן, לחיצת היד התלת כיוונית היא הבחירה הטובה ביותר על מנת להבטיח את היציבות והאמינות של חיבורי TCP.
סיבה 3: הימנע מבזבוז משאבים
אם יש רק "לחיצת יד של שניים", כאשר בקשת ה-SYN של הלקוח חסומה ברשת, הלקוח לא יכול לקבל את חבילת ה-ACK שנשלחה על ידי השרת, ולכן ה-SYN יישלח מחדש. עם זאת, מכיוון שאין לחיצת יד שלישית, השרת לא יכול לקבוע אם הלקוח קיבל אישור ACK ליצירת החיבור. לכן, השרת יכול ליצור חיבור באופן יזום רק לאחר קבלת כל בקשת SYN. זה מוביל לדברים הבאים:
בזבוז משאבים: אם בקשת ה-SYN של הלקוח חסומה, וכתוצאה מכך שידור חוזר של מספר מנות SYN, השרת יקים מספר חיבורים לא חוקיים מיותרים לאחר קבלת הבקשה. זה מוביל לבזבוז מיותר של משאבי שרת.
שמירת הודעה: עקב היעדר לחיצת יד שלישית, לשרת אין דרך לדעת אם הלקוח קיבל נכון את אישור ה-ACK ליצירת החיבור. כתוצאה מכך, אם הודעות נתקעות ברשת, הלקוח ימשיך לשלוח בקשות SYN שוב ושוב, מה שיגרום לשרת ליצור כל הזמן חיבורים חדשים. זה יגדיל את העומס והעיכוב ברשת וישפיע לרעה על ביצועי הרשת הכוללים.
לכן, על מנת להבטיח את היציבות והאמינות של חיבור הרשת, TCP משתמש בלחיצת היד התלת כיוונית כדי ליצור את החיבור כדי למנוע את התרחשותן של בעיות אלו.
תַקצִיר
הברוקר מנות רשתיצירת חיבור TCP מתבצעת בלחיצת יד תלת כיוונית. במהלך לחיצת היד התלת כיוונית, הלקוח שולח תחילה חבילה עם דגל SYN לשרת, מה שמציין שהוא רוצה ליצור חיבור. לאחר קבלת הבקשה מהלקוח, השרת משיב ללקוח חבילה עם דגלי SYN ו-ACK, המציין שבקשת החיבור מתקבלת, ושולח מספר רצף ראשוני משלו. לבסוף, הלקוח משיב עם דגל ACK לשרת כדי לציין שהחיבור נוצר בהצלחה. לפיכך, שני הצדדים נמצאים במצב ESTABLISHED ויכולים להתחיל לשלוח נתונים זה לזה.
באופן כללי, תהליך לחיצת היד התלת-כיוונית ליצירת חיבור TCP נועד להבטיח יציבות ואמינות חיבור, למנוע בלבול ובזבוז משאבים על חיבורים היסטוריים ולהבטיח ששני הצדדים מסוגלים לקבל ולשלוח נתונים.
זמן פרסום: ינואר-08-2025