המדריך של ביג' לתכנות רשת
הקודםהבא

2. מהו שקע?

אתם שומעים כל הזמן דיברוים על שקעים (sockets) , ואולי אתם תוהים מה הם בדיוק. טוב, הם זה: דרך לדבר אל תוכניות אחרות בשימוש מתארי קבצים (file descriptors) תקניים של Unix.

מה?

טוב אולי שמעת כמה האקרים של Unix אומרים "לעזזל, כל דבר ב Unix הוא קובץ!" אדםעושות פעולות קלט/פלט שונות , הן עושות זאת ע"י קריאה או כתיבה למתאר קובץ (file descriptor). מתאר קובץ הוא פשוט מספר שלם (integer) שמשויך לקובץ פתוח. אבל, הקובץ הזה יכול להיות חיבור רשת, FIFO , צינור (pipe) , מסוף, קובץ אמיתי על הדיסק הקשיח, או כמעט כל דבר אחר. כל דבר ב Unix הוא קובץ! אז כשאתה מתקשר עם תוכנה אחרת דרך האינטרנט אתה הולך לעשות זאת דרך מתאר קובץ, כדאי שתאמין.

"איפה אני משיג מתאר קובץ עבור תקשורת ברשת, מר חכם בלילה?" זאת בטח השאלה האחרונה במח שלכם עכשיו, אבל אני הולך לענות עליה בכל מקרה: אתה מבצע קריאת המערכת socket() היא מחזירה את מתאר הקובץ, ואתה מתקשר דרכו בעזרת קריאות שקע מיוחדות : send() ו recv() (man send, man recv) .

אבל רגע!" אתה בטח תוהה עכשיו. "אם זה מתאר קובץ , אז למה אני פשוט לא יכול להשתמש בקריאות read() ו write() כדי לתקשר דרך השקע?" התשובה הקצרה היא "אתה יכול!", התשובה הארוכה יותר היא "אתה יכול, אבל send() ו recv() מציעות שליטה גדולה יותר על מעבר נתונים."

מה הלאה? מה תאמר על זה: יש סוגים רבים של שקעים, יש כתובות אינטרנט DARPA (שקעי אינטרנט Internet Sockets), שקעי Unix, כתובות CCITT X.25 (אתה יכול להתעלם מ X.25 בבטחה...) , ובטח עוד רבים אחרים תלוי בסוג Unix שלך. מדריך זה מתעסק רק בסוג אחד - שקעי אינטרנט.

2.1. שני סוגים של שקעי אינטרנט

מה זה? יש שני סוגים של שקעי אינטרנט? כן , בעצן לא יש יותר, אבל אני לא רוצה להפחיד אותכם. אני הולך לדבר פה על שני סוגים.חוץ מהמשפט הזה שאני אומר לכם שקעים גולמיים (תרגום קצת עילג ל "Raw Sockets") הם רבי עוצמה וכדאי לכם לחפש מידע אחריהם.

טוב , מה הם שני הסוגים? אחד הוא "שקעים זורמים" (Stream Sockets) והאחר הוא "שקעי חבילה" (Datagram Sockets) שמעתה והלאה נתיחס אליהם כ "SOCK_STREAM" ו "SOCK_DGRAM",בהתאמה. ,בהתאמה. שקעי חבילה נקראים לעיתים "שקעים חסרי חיבור". (למרות שניתן להשתמש ב connect() איתם , אם אתה ממש רוצה. ראה על connect() , למטה.)

"שקעים זורמים" (Stream Sockets) הם דרך אמינה לחיבור דו כיווני. אם אתה פולט לתוך שקע שני פריטים בסדר "1,2" הם יגיעו בסדר "1,2 " בקצה השני. הם היו נקיים משגיאות, שגיאות שאתה תפגוש הן פרי דמיונך ואנחנו לא נדבר עליהן כאן.

י משתמשי ב"שקעים זורמים" ? אולי שמעת על היישום telnet, כן? הוא משתמש ב"שקעים זורמים". כל התווים שאתה מקיש צריכים להגיע באותו סדר שהקשת אותם, נכון? גם דפדפני Web משתמשים בפורטוקול ה HTTP שמשתמש ב"שקעים זורמים" כדי להגיע על דפי האינטרנט. ואכן אם תעשה telnet לפתחה 80 לכתובת של אתר Web ותרשום "GET /", הוא יזרוק לך בחזרה פלט של HTML!

איך "שקעים זורמים" משיגים כזו איכות העברה? הם משתמשים בפרוטוקול שנקרא "The Transmission Control Protocol",הידוע כ "TCP" (עוד על TCP, ראה RFC-793 למידע מאוד מפורט.) TCP מוודא שהמידע שלך יגיע באותו סדר וללא שגיאות. אולי שמעת על "TCP" קודם כחלק מ "TCP/IP" ,כש "IP" הוא בישביל "Internet Protocol" (ראה RFC-791.) פרוטוקול IP עוסק בעיקר בניתוב המידע באינטרנט, ולא אחראי באופן כללי על שלמות המידע שהוא מעביר.

אוקיי, מה לגבי "שקעי חבילה"? למה הם נקראים חסרי חיבור? מה הקטע שלהם בכל מקרה? למה הם לא אמינים? טוב הנה כמה עובדות: אם אתה שולח חבילת מידע, היא אולי תגיע. היא אולי תגיע שלא בסדר ששלחת, אבל אם היא תגיע, המידע בתוך החבילה יהיה נקיא משגיאות.

"שקעי חבילה" משתמשים בפרוטוקול IP לצורך ניתוב, אבל הם לא משתמשים ב TCP, הם משתמשים ב "User Datagram Protocol" או UDP (ראה RFC-768.)

למה הם חסרי חיבור? טוב, בעיקר זה מגלל שאתה לא צריך לתחזק חיבור פתוח כמו שצריך ב"שקעים זורמים" . אתה רק בונה את החבילה, ושולח אותה עם פרוטוקול IP שבו מצוי כתובת היעד שלה. ולא צריך חיבור. הם משומשים באופן כללי העברות של חבילה אחר חבילה. בישומים כמו : tftp, bootp, וכו.

רגע!, "איך התוכנות האלה בכלל עובדות,אם חבילות מידע יכולות להאבד בדרך?!", טוב, ידידי האנושי, לכל אחת מהן יש פרוטוקול משלה, על ה UDP. לדוגמא הפרוטוקול של tftp, אומר שלכל חבילה שנלשחת. המקבל צריך לשלוח חבילה שאומר ,"קיבלתי!' (חבילת "ACK"). אם השולח של החבילה המקורית לא מקבל תגובה בתוך,נאמר 5 שניות הוא שולח את החבילה שוב, עד שהוא יקבל סוף סוף את ה ACK. דרך זו לאישור קבלה היא חשובה מאוד כאשר משתמשים SOCK_DGRAM בישומים.

2.2. שטויות ברמה בסיסית, ותיאוריה על הרשת

מכיוון שהרגע הזכרתי שכבות של פרוטוקולים, הגיע הזמן לדבר על איך רשתות באמת עובדות, ולהראות דוגמא איך חבילות של SOCK_DGRAM נבנות. באופן מעשי אתם כנראה יכולים לדלק על חלק זה. אבל זה רקע טוב בכל מקרה.

איור 1. כימוס מידע.

[Encapsulated Protocols Diagram]

הי ילדים, הגיע הזמן ללמוד על כימוס מידע! זה מאוד חשוב! זה כל כך חשוב שאתם אולי תלמדו את זה, אם תקחו קורס לרשתות כאן בשיקגו ;-). הבסיס הוא: חבילת מידע נולדת, עוטפים אותה (מכומסת -מלשון כמוסה) עם כותרת בראשה (ולפעמים גם בתחתיתה), ע"י הפרוטוקול הראשון, (נאמר פרוטוקול ה TFTP), אז כל הדבר הזה (עם הכותרות של TFTP) מכומס שוב ע"י הפרוטוקול הבא, (נאמר, UDP), ואז שוב ע"י הפרוטוקול הבא (IP) , ושוב ע"י הפרוטוקול הסופי על שכבת החומרה (נאמר Ethernet).

כשמחשב אחר מקבל את חבילת המידע, החומרה מסירה את כותרת ה Ethernet, גרעין המערכת מסיר את הכותרות של IP ו UDP, התוכנה של TFTP, מסירה את הכותרת של TFTP, ואז יש לה לבסוף את המידע שהועבר.

עכשיו סוף סוף אני יכול לדבר על המודל הלא מפורסם של שכבות הרשת. מודל רשת זה מתאר מערכת של פעולות רשת, שיש בה יתרונות רבים על פני מולים אחרים. לדוגמא, אתה יכול לכתוב תכונה שמשתמשת בשקעים בדיוק אותו דבר, בלי התחשבות על איך המידע מועבר פיזית (טורי, Ethernet, AUI, או כל דבר אחר) בגלל שתוכניות ברמות יותר נמוכות יתעסקו עם זה בישבילך. הטופולוגיה והחומרה של הרשת הם שקופים למתכנת שקעים.

ללא השתאות אציג את השכבות של המודל. זכרו את זה למבחנים בנושא רשתות:

השכבה הפיזית היא החומרה (חיבור טורי, Ethernet). שכבת היישום היא הרחוקה מהשכבה הפיזית,ככל שתוכלו לדמיין -- בה המשתמשים מתקשרים עם הרשת.

המודל הזה כל כך כללי, שאתם תוכלו להשתמש בו כמדריך לתיקון מכוניות אם באמת תרצו. מודל שיותר מתאים Unix יכול להיות:

בזמן זה, אתם כנראה רואים איך שכבות אלה מתאימות לכימוס של המידע המקורי.

רואים כמה עבודה זו לבנות חבילת מידע פשוטה? ואתם עוד צריכים להקליד את כל הכותרות בעצמכם בעזרת "cat"! סתם צוחק. כל מה שאתם צריכים לעשות בישביל "שקעים זורמים" הוא לשלוח (עם קריאת המערכת send()) את המידע. כל מה שאתם צריכים לעשות עבור "שקעי חבילה" זה לכמס את המידע בשיטה לבחירתכם ולשלוח (בעזרת הקריאה sendto()) . גרעין המערכת (kernel) בונה את שכבת התעבורה ושכבת האינטרנט על חבילת המידע בישבילכם. והחומרה דואגת לשכבת הגישה לרשת. אה, טכנולוגיה מודרנית...

כך נגמרת הסקירה הקצרה לגבי התיאוריה על הרשת. אה שכחתי להגיד לכם כל מה שרציתי להגיד על ניתוב: כלום! כן אני לא הולך לדבר כלל על ניתוב. הנתב מסתכל בכותרת ה IP , מתייעץ עם טבלת הניתוב, בלה בלה בלה. קראו את ה IP RFC אם באמת אכפת לכם. אם אף פעם לא תלמדו על זה, טוב, אתם תחיו.


הקודםביתהבא
מבוא מבנים (structs) וניהול נתונים