במהלך השנים הקודמות של האינטרנט, פרוטוקול האינטרנט (IP) היה הפרוטוקול היחיד שאנשים השתמשו בו כדי להתחבר לאינטרנט. הבעיה עם IP הייתה שאתה יכול לשלוח הודעה ולהיות לא בטוח אם הנמען יקבל אותה או לא. מסיבה זו הוקם TCP/IP.
TCP/IP מבטיח שכל הנתונים שאתה שולח יגיעו לנמען שלו. זה עושה זאת על ידי מתן חיבור מאובטח ללקוח ולשרת לפני שליחת הנתונים. חיבור מאובטח זה נוצר באמצעות תהליך המכונה לחיצת יד תלת כיוונית, המכונה גם לחיצת יד TCP/IP.
מהי לחיצת יד תלת כיוונית?
לחיצת יד תלת כיוונית (לחיצת יד TCP/IP) היא שלוש האינטראקציות הראשונות בין לקוח לשרת המנסה ליצור חיבור TCP. אינטראקציות ראשוניות אלו חיוניות ביצירת חיבור מאובטח. בשלב זה, גם הלקוח וגם השרת יסכימו על פרמטרים שישתמשו בהם כדי לבדוק ולאמת חבילות נתונים נכנסות ויוצאות. פרמטרים אלו יהיו בצורה של מקטעי TCP.
מהו פלח TCP?
בחיבור TCP/IP, יש לחתוך את כל הנתונים הנשלחים ולבנות אותם על מה שמכונה מקטעי TCP. פלחים אלה מכילים מידע כמו כתובות IP, יציאות, סיביות דגל, מספרי רצף, מספרי אישור והנתונים האופציונליים או המטען.
שלוש האינטראקציות הראשונות (לחיצת יד תלת כיוונית) יכללו רק כותרות מקטע TCP ללא מטען או נתונים מצורפים. הנה דוגמה של קטע TCP
שימו לב שהאיור שלמעלה מיועד ל-TCP בלבד. קטע TCP/IP מלא דורש את שניהם כתובות IP מהשולח והמקבל על גבי מקטע TCP למעלה.
בכל פעם שאתה שולח חבילה לאדם, אתה נדרש על ידי שירות המשלוחים למלא טופס מידע ולאחר מכן לצרף אותו לחבילה לפני המשלוח. באופן דומה, TCP דורש מהשולח לצרף ראש מקטע (טופס מידע) לנתונים (חבילה) לפני שהוא מתחיל לשלוח את המקטע (החבילה) לנמען.
בכל פעם שלקוח מתקשר לשרת, שני הצדדים יצטרכו לעצב את האינטראקציות שלהם בצורה של קטע TCP. קטע TCP כולל ראש מקטע TCP המחובר לנתונים שאתה מנסה לשלוח. השולח יצטרך למלא את המידע שראש הפלח דורש.
עבור לחיצת יד תלת כיוונית, השולח יצטרך למלא את הפרטים הבאים:
- יציאת מקור: מזהה את היציאה של השולח
- נמל היעד: מזהה את היציאה של המקלט
- מספר רצף: מציין את רצף הפלחים
- מספר אישור: מציין שקטע קיבל אישור על ידי הוספת אחד למספר הרצף הנתון
מלבד מילוי שדות ראש הקטע, על השולח לבחור גם ביט דגל. ישנם שישה סיביות דגל בסך הכל, אבל עבור לחיצת יד תלת כיוונית, תזדקק רק לשניים הבאים:
- SYN: נותן מספר רצף. מספר רצף זה ישמש לספירת הרצף של כל הקטעים הנכנסים למשך שאר האינטראקציה.
- ACK: מציין שהמקלט של מספר ה-SYN מקבל את בקשת החיבור על-ידי הוספת אחד (1) למספר ה-SYN שניתן.
עכשיו כשאתה יודע מה זה קטע TCP, בוא נראה איך משתמשים בו בלחיצת יד תלת כיוונית.
איך עובדת לחיצת יד תלת כיוונית
לחיצת יד תלת כיוונית נוצרת כאשר גם הלקוח וגם המארח החליפו מידע ואישרו זה את מספרי הרצף של זה. כפי שהשם מרמז, לחיצת יד תלת כיוונית מתבצעת בשלושה שלבים.
ראשית, הלקוח שולח קטע SYN טהור המציין שהוא רוצה חיבור. שנית, השרת מגיב עם קטע SYN-ACK מה שאומר שהוא אישר את הבקשה ושולח מספר SYN משלו ללקוח לאשר. שלישית, הלקוח שולח קטע ACK לשרת כדי להודיע לו שמספר ה-SYN של השרת אושר וישמש לחיבור נוסף.
לחיצת יד תלת כיוונית תיראה בערך כך:
בואו נפרק את זה ונסתכל על המקטעים כדי שתדע מה בדיוק קורה כאשר לקוח ושרת מחליפים ומאשרים מספרי רצף.
שלב 1: הלקוח שולח פלח SYN
הלקוח שולח חיבור בקשה על ידי שליחת קטע SYN לשרת. הלקוח משתמש בכתובת ה-IP של הלקוח כדי לאתר את השרת ולשלוח את קטע ה-TCP.
כדי להפחית את המורכבות של הקטע, הבה נתעלם מכמה שדות מקטעים ונתרכז בצרכים החשופים לחיבור לחיצת יד תלת כיוונית. זה כולל יציאת מקור, יציאת יעד, מספר רצף, מספר אישור ואיזה סוג של ביט דגל משמש.
ועם זה, קטע SYN/בקשה צריך להיראות כך:
יציאת הלקוח היא מספר אקראי בין 49152 ל-65536. טווח יציאות זה הוא הטווח המוסכם בו מכשירים ציבוריים יכולים להשתמש באופן דינמי כדי להתחבר לאינטרנט. טווחי יציאות של 1024 עד 49151 הם פרטיים. הם יצטרכו להיות רשומים על ידי ישות כדי להשתמש ביציאה בטווח שצוין. מספרי יציאות מתחת ל-1024 הם יציאות השמורות לפונקציות שונות ופרוטוקולי אינטרנט כגון FTP (יציאה 20), SMTP (יציאה 25), DNS (יציאה 53) ו-HTTP (יציאה 80).
בחיים האמיתיים, מספר רצף הוא מספר אקראי. עבור הדוגמה, השתמשנו ב-0000000000 כדי להקל על הדמיה.
שימו לב למספר הרצף ככל שאנו מתקדמים בשלבים. נכון לעכשיו, זה 000000000. כרגע אין מספר אישור כי אין מה לאשר.
שלב 2: תשובות שרת עם מקטע SYN-ACK
ברגע שהשרת יקבל קטע SYN, הוא יגיב על ידי שליחת קטע ACK המכיל את מספר האישור. מספר האישור יהיה מספר הרצף של הלקוח פלוס אחד (1).
תסתכל על יציאת המקור. זה מראה שהקטע הוא מיציאה 20, מה שמציין שהוא הגיע מהשרת כתגובה.
כעת, תסתכל על מספר האישור. זה 0000000001, שהוא מספר הרצף של הלקוח (0000000000) פלוס אחד (1). כך עוקבים אחר קטע. נניח שהלקוח קיבל תגובת מקטע ACK כאשר מספר האישור הוא 0000000002. זה יציין ללקוח שקטע 0000000001 חסר ושהלקוח יצטרך לחכות עד שהוא יגיע כך שלא תחווה אובדן מנות.
כפי שאתה יכול לראות, שני סיביות דגל מופעלים - SYN ו-ACK.
מלבד אישור מספר הרצף של הלקוח, השרת ישלח גם מספר רצף משלו כדי שהלקוח יאשר את מספר הרצף של השרת פלוס אחד (1). בדוגמה שלנו, השתמשנו ב-1111111111 כמספר הרצף של השרת. שוב, בעולם האמיתי, המספר הזה הוא אקראי.
שים לב שמספרי הרצף של הלקוח והשרת אינם חייבים להתאים. כל עוד שני הצדדים מכירים במספר הרצף הייחודי זה לזה, החיבור יהיה אמין.
שלב 3: תשובות לקוח עם מקטע ACK
לבסוף, הלקוח מאשר את מספר הרצף של השרת.
הקטע האחרון הוא קטע ACK מהלקוח.
כפי שאתה יכול הלקוח יאשר את מספר הרצף של השרת על ידי תגובה עם מספר הרצף של השרת (1111111111) פלוס אחד (1), שהוא 1111111112.
הלקוח והשרת לא ישלחו עוד מספר רצף שכן התחלת הרצף כבר אושרה. עם זאת, שני הצדדים יצפו לקטעי אישור המשכיים מספרי רצף פלוס אחד (1) ומספר בתים לאורך כל האינטראקציה. במקרה זה, הלקוח מצפה שלתגובת השרת הבאה תהיה ACK של 0000000002 (אם אין נתונים מצורפים).
לאחר מכן, מתבססת לחיצת היד המשולשת!
הבנה כיצד פועלים חיבורי רשת
כעת, לאחר שלמדת כיצד פועלת לחיצת יד תלת כיוונית, יהיה לך גם קל יותר להבין כיצד TCP עובד לאחר לחיצת היד. הלקוח והשרת יתחילו לשלוח נתונים כאשר לחיצת היד תוקם. הפעם ייעשה שימוש בפורמט הפלח המלא, בתוספת הנתונים האופציונליים או המטען.
הנתונים בדרך כלל מפולחים/חותכים לחתיכות קטנות יותר להעברות קלות יותר. לכל קטע נתונים יש ראש קטע משלו המכיל מספר רצף ומספר אישור. הסיבה למספר רצף היא לדעת את רצף הקטעים כאשר הם בסופו של דבר ירכיבו מחדש. מספרי האישור נמצאים שם כדי לוודא מול השולח שהקטע שלהם התקבל ושהוא תואם את רצף הקטעים הנכנסים.
ספירה של מספר רצף ומאמת אותם באמצעות אישור היא כיצד TCP יכול להעביר בצורה מהימנה נתחי נתונים עצומים ללא מנות נתונים חסרות.
ועם זה, אתה אמור לקבל מושג די טוב על איך TCP עובד.