הגדרת חיבור TCP
כשאנחנו גולשים באינטרנט, שולחים דוא"ל או משחקים משחק מקוון, לעתים קרובות אנו לא חושבים על חיבור הרשת המורכב שמאחוריו. עם זאת, הצעדים הקטנים לכאורה הם אלה שמבטיחים תקשורת יציבה בינינו לבין השרת. אחד הצעדים החשובים ביותר הוא הגדרת חיבור TCP, והליבה של זה היא לחיצת היד התלת-כיוונית.
מאמר זה ידון בעקרון, בתהליך ובחשיבות של לחיצת היד התלת-כיוונית בפירוט. צעד אחר צעד, נסביר מדוע יש צורך בלחיצת היד התלת-כיוונית, כיצד היא מבטיחה יציבות ואמינות חיבור, וכמה חשוב להעברת נתונים. מתוך הבנה עמוקה יותר של לחיצת היד התלת-כיוונית, נקבל הבנה טובה יותר של המנגנונים הבסיסיים של תקשורת רשת ותצוגה ברורה יותר של האמינות של חיבורי TCP.
תהליך לחיצת יד תלת-כיוונית TCP ומעברי מדינה
TCP הוא פרוטוקול הובלה מונחה חיבור, הדורש הקמת חיבור לפני העברת נתונים. תהליך הקמת חיבור זה נעשה על ידי לחיצת יד תלת-כיוונית.
בואו נסתכל מקרוב על מנות ה- TCP שנשלחות בכל קשר.
בתחילה, גם הלקוח וגם השרת סגורים. ראשית, השרת מקשיב באופן פעיל ביציאה ונמצא במצב האזנה, מה שאומר שיש להתחיל את השרת. בשלב הבא, הלקוח מוכן להתחיל לגשת לדף האינטרנט. הוא צריך ליצור חיבור עם השרת. הפורמט של חבילת החיבור הראשונה הוא כדלקמן:
כאשר לקוח יוזם חיבור, הוא מייצר מספר רצף ראשוני אקראי (client_isn) ומציב אותו בשדה "מספר הרצף" של כותרת TCP. במקביל, הלקוח מגדיר את מיקום דגל ה- SYN ל- 1 כדי לציין שהמנה היוצאת היא חבילת SYN. הלקוח מציין כי הוא מבקש ליצור חיבור עם השרת על ידי שליחת מנות ה- SYN הראשון לשרת. מנות זו אינה מכילה נתוני שכבת יישומים (כלומר נתונים שנשלחו). בשלב זה, סטטוס הלקוח מסומן כ- syn-sent.
כאשר שרת מקבל מנות SYN מלקוח, הוא מאתחל באופן אקראי את המספר הסידורי שלו (Server_ISN) ואז מכניס את המספר הזה לשדה "המספר הסידורי" של כותרת TCP. בשלב הבא, השרת מזין את Client_isn + 1 בשדה "מספר הכרה" ומגדיר גם סיביות Sys וגם ACK ל -1. לבסוף, השרת שולח את המנה ללקוח, שאינו מכיל נתוני שכבת יישומים (וללא נתונים על השרת לשלוח). בשלב זה השרת נמצא במצב Syn-RCVD.
ברגע שהלקוח יקבל את המנה מהשרת, הוא צריך לבצע את האופטימיזציות הבאות כדי להגיב לחבילת התשובה הסופית: ראשית, הלקוח מגדיר את חלק ה- ACK של כותרת TCP של חבילת התשובה ל -1; שנית, הלקוח מזין את הערך Server_isn + 1 בשדה "אשר מספר תשובה"; לבסוף, הלקוח שולח את המנה לשרת. מנות זו יכולה לשאת נתונים מהלקוח לשרת. עם השלמת פעולות אלה, הלקוח ייכנס למדינה שנקבעה.
ברגע שהשרת יקבל את חבילת התשובה מהלקוח, הוא גם עובר למצב שנקבע.
כפי שאתה יכול לראות מהתהליך לעיל, בעת ביצוע לחיצת יד תלת-כיוונית, לחיצת היד השלישית מותרת לשאת נתונים, אך שתי לחיצות היד הראשונות אינן. זו שאלה שנשאלת לעתים קרובות בראיונות. לאחר השלמת לחיצת היד התלת-כיוונית, שני הצדדים נכנסים למצב שנקבע, מה שמצביע על כך שהחיבור הוקם בהצלחה, ובשלב זה הלקוח והשרת יכולים להתחיל לשלוח נתונים זה לזה.
מדוע שלוש לחיצות יד? לא פעמיים, ארבע פעמים?
התשובה הנפוצה היא, "מכיוון שלחיצת היד התלת-כיוונית מבטיחה את היכולת לקבל ולשלוח." תשובה זו נכונה, אך זו רק הסיבה השטחית, אינה מעלה את הסיבה העיקרית. להלן, אנתח את הסיבות ללחיצת היד המשולשת משלושה היבטים כדי להעמיק את ההבנה שלנו בנושא זה.
לחיצת היד התלת-כיוונית יכולה להימנע ביעילות באתחול של קשרים חוזרים היסטוריים (הסיבה העיקרית)
לחיצת היד התלת-כיוונית מבטיחה ששני הצדדים קיבלו מספר רצף ראשוני אמין.
לחיצת היד התלת-כיוונית נמנעת מבזבוז משאבים.
סיבה 1: הימנע מהצטרפות כפולה היסטורית
על קצה המזלג, הסיבה העיקרית ללחיצת היד התלת-כיוונית היא למנוע בלבול שנגרם כתוצאה מאתחול החיבור הכפול הישן. בסביבת רשת מורכבת, העברת מנות נתונים לא תמיד נשלחת למארח היעד בהתאם לזמן שצוין, ומנות נתונים ישנות עשויות להגיע למארח היעד תחילה בגלל עומס רשת וסיבות אחרות. כדי להימנע מכך, TCP משתמשת בלחיצת יד תלת-כיוונית כדי לבסס את החיבור.
כאשר לקוח שולח מנות הקמה מרובות של חיבור SYN ברצף, במצבים כמו גודש ברשת, להלן יתכן: להלן:
1- מנות ה- SYN הישנות מגיעות לשרת לפני מנות ה- SYN האחרונות.
2- השרת ישיב ללקוח מנות Syn + ACK לאחר קבלת מנות ה- SYN הישנות.
3- כאשר הלקוח מקבל את מנות Syn + ACK, הוא קובע כי החיבור הוא חיבור היסטורי (מספר רצף שפג או פסק זמן) על פי ההקשר שלו ואז שולח את המנה הראשונה לשרת כדי להפסיק את החיבור.
עם חיבור דו-ידיים, אין דרך לקבוע אם החיבור הנוכחי הוא קשר היסטורי. לחיצת היד התלת-כיוונית מאפשרת ללקוח לקבוע אם החיבור הנוכחי הוא חיבור היסטורי המבוסס על ההקשר כאשר הוא מוכן לשלוח את המנה השלישית:
1- אם מדובר בחיבור היסטורי (מספר הרצף פג או פסק זמן), המנה שנשלחה על ידי לחיצת היד השלישית היא חבילה ראשונה להפסקת החיבור ההיסטורי.
2- אם זה לא חיבור היסטורי, המנה שנשלחה בפעם השלישית היא חבילת ACK, ושתי הצדדים המתקשרים מבססים בהצלחה את החיבור.
לפיכך, הסיבה העיקרית לכך ש- TCP משתמשת בלחיצת היד התלת-כיוונית היא שהיא מאתחלת את החיבור למניעת קשרים היסטוריים.
סיבה 2: לסנכרן את מספרי הרצפים הראשוניים של שני הצדדים
שני הצדדים של פרוטוקול TCP חייבים לשמור על מספר רצף, שהוא גורם מפתח להבטיח שידור אמין. מספרי רצף ממלאים תפקיד חשוב בחיבורי TCP. הם עושים את הדברים הבאים:
המקלט יכול לבטל נתונים כפולים ולהבטיח את דיוק הנתונים.
המקלט יכול לקבל מנות לפי סדר מספר הרצף כדי להבטיח את שלמות הנתונים.
● מספר הרצף יכול לזהות את חבילת הנתונים שהתקבלה על ידי הצד השני, מה שמאפשר העברת נתונים אמינה.
לכן, עם הקמת חיבור TCP, הלקוח שולח מנות SYN עם מספר הרצף הראשוני ומחייב את השרת לענות עם חבילת ACK המציינת קבלת פנים מוצלחת של מנות ה- SYN של הלקוח. לאחר מכן, השרת שולח את מנות ה- SYN עם מספר הרצף הראשוני ללקוח ומחכה שהלקוח ישיב, אחת ולתמיד, כדי להבטיח שמספרי הרצף הראשוני יסונכרנו באופן אמין.
למרות שלחיצת יד ארבע כיוונית אפשרית גם לסנכרן באופן אמין את מספרי הרצף הראשוניים של שני הצדדים, ניתן לשלב את הצעדים השני והשלישי לשלב אחד, וכתוצאה מכך לחיצת יד תלת-כיוונית. עם זאת, שתי לחיצות היד יכולות רק להבטיח שמספר הרצף הראשוני של צד אחד מתקבל בהצלחה על ידי הצד השני, אך אין שום ערובה לכך שניתן לאשר את מספר הרצף הראשוני של שני הצדדים. לפיכך, לחיצת היד התלת-כיוונית היא הבחירה הטובה ביותר לקחת על מנת להבטיח את היציבות והאמינות של חיבורי TCP.
סיבה 3: הימנע מבזבוז משאבים
אם יש רק "דו-ידיים", כאשר בקשת SYN של הלקוח נחסמת ברשת, הלקוח לא יכול לקבל את מנות ה- ACK שנשלחה על ידי השרת, כך שה- SYN יתמרמר. עם זאת, מכיוון שאין לחיצת יד שלישית, השרת אינו יכול לקבוע אם הלקוח קיבל אישור ACK כדי לבסס את החיבור. לכן השרת יכול לקבוע באופן יזום חיבור לאחר קבלת כל בקשת SYN. זה מוביל לדברים הבאים:
בזבוז משאבים: אם בקשת SYN של הלקוח נחסמת, וכתוצאה מכך העברת חוזרת של מנות SYN מרובות, השרת יקבע חיבורים לא חוקיים מיותרים לאחר קבלת הבקשה. זה מוביל לבזבוז מיותר של משאבי שרת.
שמירת הודעות: בגלל היעדר לחיצת יד שלישית, לשרת אין דרך לדעת אם הלקוח קיבל נכון את אישור ה- ACK כדי לבסס את החיבור. כתוצאה מכך, אם ההודעות נתקעות ברשת, הלקוח ימשיך לשלוח בקשות SYN שוב ושוב, ויגרום לשרת לקבוע כל העת חיבורים חדשים. זה יגדיל את גודש הרשת ועיכוב וישפיע לרעה על ביצועי הרשת הכוללים.
לפיכך, על מנת להבטיח את היציבות והאמינות של חיבור הרשת, TCP משתמשת בלחיצת היד התלת-כיוונית כדי לבסס את החיבור כדי להימנע מההתרחשות של בעיות אלה.
תַקצִיר
THEמתווך מנות רשתהקמת חיבור TCP נעשית בלחיצת יד תלת-כיוונית. במהלך לחיצת היד התלת-כיוונית, הלקוח שולח תחילה חבילה עם דגל SYN לשרת, ומציין שהוא רוצה ליצור חיבור. לאחר קבלת הבקשה מהלקוח, השרת משיב חבילה עם דגלי Syn ו- ACK ללקוח, ומציין כי בקשת החיבור מתקבלת ושולחת מספר רצף ראשוני משלה. לבסוף, הלקוח משיב עם דגל ACK לשרת כדי לציין שהחיבור הוקם בהצלחה. לפיכך, שני הצדדים נמצאים במצב שנקבע ויכולים להתחיל לשלוח נתונים זה לזה.
באופן כללי, תהליך לחיצת היד התלת-כיוונית עבור הקמת חיבור TCP נועד להבטיח יציבות ואמינות של חיבור, להימנע בלבול ובזבוז משאבים על קשרים היסטוריים, ולהבטיח ששני הצדדים יוכלו לקבל ולשלוח נתונים.
זמן הודעה: ינואר -08-2025