שיעור 21: TCP Sockets — שרת ולקוח
TCP (Transmission Control Protocol) הוא הבסיס של כל תקשורת אמינה ברשת. כשאתם פותחים דפדפן, מריצים עדכון Git, או מחברים שני תהליכי NCCL לאימון מבוזר — ברוב המקרים TCP עומד מאחורי הקלעים. בשיעור הזה נלמד לכתוב שרת TCP ולקוח TCP בשפת C++, תוך שימוש ב-syscalls הבסיסיים: socket(), bind(), listen(), accep
דמיינו שרת TCP כמו מסעדה. תחילה בוחרים מספר שולחן (bind לפורט), אחר כך פותחים את הדלת ומכריזים 'אנחנו פתוחים' (listen), ואז יושבים ומחכים שלקוח ייכנס (accept). הלקוח מגיע (connect), יושב ליד השולחן, מזמין (send), ומקבל את ההזמנה חזרה (recv). TCP מבטיח שכל מנה תגיע בסדר הנכון וללא חסרים — כמו מלצר שמוודא שכל צלחת הגיעה לפני שמגיש את הבאה.
- שקע (socket)
- נקודת קצה לתקשורת ברשת. מיוצג בקוד כ-file descriptor (מספר שלם) שאפשר לכתוב אליו ולקרוא ממנו בדיוק כמו קובץ.
- קישור (bind)
- הקצאת כתובת IP ופורט לשקע. ה-syscall bind() אומר ל-kernel: 'השקע הזה יקבל חיבורים שמגיעים לפורט X'.
- האזנה (listen)
- מעבר השקע למצב פסיבי שבו הוא מוכן לקבל חיבורים נכנסים. הפרמטר backlog קובע כמה חיבורים ממתינים ה-kernel יכול להחזיק בתור.
- קבלת חיבור (accept)
- שליפת חיבור הבא מתור ההמתנה. מחזיר file descriptor חדש ייעודי לאותו לקוח בלבד. השקע המקורי ממשיך להאזין ללקוחות נוספים.
- SO_REUSEADDR
- אפשרות socket שמאפשרת לכרות את הפורט מיד אחרי סגירת השרת, בלי לחכות לסיום מצב TIME_WAIT. חיונית בפיתוח כדי שלא לקבל 'Address already in use' בכל הרצה מחדש.