6.9 מחסנית הרשת תרגול
תרגיל 1 - מעקב אחרי חבילה בcurl¶
כשאתם מריצים:
תארו את המסע המלא של חבילת הHTTP GET בתוך הקרנל, בכיוון השליחה בלבד (מהתוכנה לכבל):
- איזה syscall curl קורא כדי לשלוח את הבקשה?
- מה קורה בשכבת הsocket?
- מה TCP מוסיף? אילו שדות חשובים בheader?
- מה IP מוסיף? איך הקרנל מחליט דרך איזה ממשק לשלוח?
- מה Ethernet מוסיף? מאיפה הקרנל יודע את כתובת הMAC של היעד?
- מה הדרייבר עושה?
- באיזה שלב מתבצע DMA?
תרגיל 2 - בדיקת proc/net/tcp/¶
-
פתחו חיבור TCP כלשהו (למשל עם
ncאוcurl) ואז הריצו:
-
כל שורה מייצגת socket TCP פתוח. השדות בהקסדצימלי. ענו:
- השדה
local_addressהוא כתובת ופורט מקומיים. הכתובת בפורמט הקסדצימלי בlittle-endian. נסו לפענח כתובת אחת. - השדה
stהוא הstate של הTCP connection. ערך0Aהוא LISTEN, ערך01הוא ESTABLISHED. מצאו socket במצב LISTEN ו-socket במצב ESTABLISHED. -
השדה
uidמציין את הUID של המשתמש שפתח את הsocket. מצאו sockets ששייכים לroot (uid 0) ו-sockets ששייכים למשתמש שלכם. -
השוו את הפלט ל:
מה הקשר? מאיפה ss מקבל את המידע?
תרגיל 3 - מצבי socket עם ss¶
- הריצו:
- מה המשמעות של כל דגל? (t, u, l, n)
- מצאו שירות שמאזין על פורט 22 (SSH). באיזה מצב הsocket שלו?
-
מצאו שירות שמאזין על כל הכתובות (0.0.0.0 או *). מה ההבדל בין שירות שמאזין על 0.0.0.0 לעומת 127.0.0.1?
-
פתחו חיבור SSH (או כל חיבור TCP אחר) ואז הריצו:
-
מצאו את החיבור שלכם. מה כתובת המקור והיעד? מה הפורטים?
-
הריצו:
- כמה sockets TCP יש סה"כ? כמה מהם ב-ESTABLISHED?
- כמה sockets UDP יש?
תרגיל 4 - הבנת sk_buff ומניפולציית headers¶
שרטטו דיאגרמה שמראה את הsk_buff בכל שלב של שליחת חבילה. הניחו שהתוכנה שולחת את המחרוזת "Hi" (2 בתים).
-
אחרי שכבת הsocket: שרטטו את המצב ההתחלתי של הבאפר עם הנתונים "Hi". היכן data, tail, head, end?
-
אחרי שכבת TCP: הראו מה קרה אחרי skb_push של 20 בתים (TCP header). איך data השתנה? מה יש עכשיו באזור שבין data לtail?
-
אחרי שכבת IP: עוד skb_push של 20 בתים (IP header). שרטטו שוב.
-
אחרי שכבת Ethernet: עוד skb_push של 14 בתים (Ethernet header). שרטטו את המצב הסופי.
-
הסבירו: למה headroom חייב להיות מספיק גדול מראש? מה יקרה אם אין מספיק headroom?
תרגיל 5 - מרחבי שמות של רשת - network namespaces¶
-
הריצו (דורש root):
-
אילו ממשקי רשת קיימים בnamespace החדש?
- האם יש טבלת ניתוב? למה?
-
נסו להריץ
sudo ip netns exec testns ping 8.8.8.8. מה קורה ולמה? -
הסבירו: כשDocker מריץ container, הוא יוצר network namespace חדש. איך הcontainer יכול לתקשר עם האינטרנט אם הnamespace שלו מבודד?
רמזים:
- מה זה veth pair?
- מה זה bridge?
- איפה NAT נכנס לתמונה?
-
הריצו:
-
הסבירו בקצרה: מלבד network namespace, אילו סוגי namespaces נוספים קיימים בלינוקס? (ציינו לפחות 3)