מודל השכבות > שכבת התעבורה > TCP עמוד השער מושגים
פרוטוקול התעבורה TCP

 

הקדמה

מאפייני השירות שמספק TCP

צורת הפעולה של TCP

מבנה סגמנט TCP


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

מאפייני השירות שמספק TCP
לשירות שמספק TCP יש מספר מאפיינים מרכזיים:
  •  זרם (stream) של נתונים:
    TCP מאפשר לאפליקציות להתייחס למידע שהן שולחות ומקבלות כאל זרם רציף של ביטים (ולא כאל חבילות בדידות). TCP מעביר לאפליקצית היעד את אותו זרם של ביטים, באותו סדר שיצא מהאפליקציה השולחת.
  • קישור של "מעגל וירטואלי" (virtual circuit connection):
    בניגוד ל- IP, שפועל בשיטת "שגר ושכח", צורת הפעולה של TCP דומה יותר לשיחת טלפון. לפני שניתן להתחיל בשידור הנתונים, על המחשב היוזם "להתקשר" למחשב היעד, ומחשב היעד חייב "לענות". רק לאחר שנותר הקשר הראשוני בין מודל ה- TCP במחשב היוזם למודול המקביל לו במחשב היעד, ניתן להתחיל לשדר את הנתונים. גם תוך כדי שליחת הנתונים, המודולים ממשיכים "לדבר" ביניהם, כדי לוודא שהנתונים מגיעים כסדרם. כאשר יש נתק בתקשורת מסיבה כלשהי, שני המודולים מודעים לכך, ומדווחים על הניתוק לאפליקציה הרלוונטית. ה"מעגל הוירטואלי" מאפשר לתוכנות האפליקציה להתייחס לקישור שביניהן לבין האפליקציה במחשב היעד כאילו הוא מעגל פיזי המחבר ביניהן.
  • העברה מבוקרת (buffered transfer):
    תוכנת האפליקציה מעבירה ל- TCP נתונים בגדלים שונים. משיקולי יעילות, נתונים אלה נאספים במעין חוצץ (buffer), עד שיש מספיק נתונים למלא חבילה בגודל המתאים לשליחה באינטרנט. גם בצד המקבל ישנו חוצץ, שרק כאשר הוא מתמלא מועברים הנתונים שבו לאפליקציה. אם האפליקציה מוציאה נתונים בבלוקים גדולים מאוד, TCP יכול לבחור לחלק את הנתונים לחבילות קטנות יותר. כיוון שהנתונים עוברים בין האפליקציות בצורה של זרם ביטים, לאפליקציה לא משנה איך הנתונים הללו נאספים לחבילות שמשודרות ברשת. עבור מקרה שבו אפליקציה מעונינת לשלוח נתונים גם אם החוצץ עדיין אינו מלא, TCP מספק את מנגנון הדחיפה (push mechanism), שמאפשר זאת. בצד המקבל, מנגנון הדחיפה מאפשר לאפליקציה לקבל נתונים גם אם לא הצטבר שם חוצץ מלא.
  • זרם בלתי מובנה (unstructured stream):
    TCP אינו מגדיר את מבנה זרם הנתונים שהוא מעביר. אם, למשל, האפליקציה שולחת נתונים של כוח אדם, TCP אינו יודע היכן נגמרים נתוניו של עובד אחד ומתחילים נתוניו של עובד אחר. האפליקציות, ולא TCP, הן אלה שיודעות מהו מבנה הזרם.
  • קישור דו כיווני (דופלקס):
    TCP מספק קישור דו כיווני, כלומר מאפשר שליחת מידע בשני הכיוונים בו זמנית. שליחת מידע בכיוון אחד יכולה להסתיים, ללא תלות בכיוון השני.
צורת הפעולה של TCP
TCP מספק שירות מהימן: הנתונים מגיעים מהאפליקציה השולחת לאפליקציה המקבלת ללא שיבושים. כיוון שהשירות שמתחת ל-TCP (כלומר, IP) אינו מהימן, TCP צריך להבטיח את המהימנות בעצמו. המנגנון שמאפשר זאת הוא מנגנון של אישור קבלה ושליחה מחדש (positive acknowledgemeny with retransmission). כאשר מחשב היעד מקבל נתונים מהמחשב השולח, הוא שולח חזרה אישור (acknowledgement, ןבקיצור ack). כאשר המחשב השולח לא מקבל אישור עבור חבילה מסוימת תוך פרק זמן קבוע מראש, הוא שולח אותה מחדש.
מנגנון זה עלול לגרום לכך שחבילות ישלחו מספר פעמים - אם האישור עבור חבילה מסוימת נשלח לאחר שהיא כבר נשלחה מחדש ע"י המחשב השולח. כדי למנוע שכפול נתונים, לכל חבילה של TCP יש מספר מזהה, והמחשב המקבל זוכר את המספרים של החבילות שהתקבלו - ואם חבילה שכבר הגיעה מגיעה שוב, TCP לא יעביר את הנתונים פעמיים.
TCP שולח נתונים בשיטה הנקראת "sliding window" ("החלון הנע"). במקום לשלוח חבילה, לחכות לקבל אישור ורק אז לשלוח את החבילה הבאה, TCP שולח כמות מסוימת של חבילות, הנקבעת לפי גודלו של החלון הנע, בלי לחכות לאישור קבלה עבור כל אחת. לאחר שנשלחה הכמות הזו, רק כשיתקבל אישור על קבלת החבילה הראשונה שנשלחה, תוכל להישלח עוד חבילה. ככל שהחלון גדול יותר, עד לגודל המקסימלי שהרשת מסוגלת להעביר, יש פחות בזבוז זמן, והרשת מנוצלת באופן יעיל יותר.
TCP גם מספק flow control, או "שליטה בזרימה", כדי למנוע מצב בו מחשב היעד מקבל נתונים בקצב מהיר מדי, ואינו מצליח לטפל בהם, או לחילופין, מצב בו מחשב היעד מקבל נתונים בקצב איטי מדי ולא יעיל מספיק. כאשר המחשב המקבל שולח את אישור הקבלה, הוא שולח יחד איתו גם "window advertisement" - ערך המציין עוד כמה בתים של מידע הוא מוכן לקבל. אם הערך גדול יותר משהיה עד כה, המחשב השולח מגדיל את החלון הנע שלו, ושולח יותר חבילות ללא לחכות לאישור; אם הערך קטן יותר, המחשב השולח מקטין את החלון הנע שלו. מנגנון השליטה בזרימה הוא הכרחי באינטרנט, שמורכבת מרשתות וממחשבים בעלי קיבולות ויכולות שונות.
כמו ב- UDP , גם ב- TCP יש פורטים (ports). אבל, בניגוד ל-UDP, שמקבל חבילות ומעביר אותן לאפליקציות אליהן הם מיועדות לפי מספר הפורט המצוין בהן, הפורטים ב- TCP משמשים להגדיר את ה"מעגל הוירטואלי" המבוסס על כתובת המקור, פורט המקור, כתובת היעד ופורט היעד. מודול TCP אחד על מחשב אחד יכול להיות מעורב בכמה מעגלים וירטואליים כאלה בבת אחת, וכמה מעגלים וירטואליים יכולים לכלול את אותו פורט עצמו. כך, אפליקציה אחת יכולה לתקשר עם כמה מחשבים מרוחקים במקביל, בלי שתצטרך לספק מספר פורט נפרד עבור כל קישור.

מבנה סגמנט TCP
0....... 8....... 16...... 24......
(32 ביטים)
פורט המקור
פורט היעד
מספר סידורי
מספר אישור
א.פתיח
שמור
דגלים
גודל חלון
TCP checksum
מצביע לנתונים דחופים
אופציות
נתונים