לדלג לתוכן

6.9 מחסנית הרשת תרגול

תרגיל 1 - מעקב אחרי חבילה בcurl

כשאתם מריצים:

curl http://example.com

תארו את המסע המלא של חבילת הHTTP GET בתוך הקרנל, בכיוון השליחה בלבד (מהתוכנה לכבל):

  1. איזה syscall curl קורא כדי לשלוח את הבקשה?
  2. מה קורה בשכבת הsocket?
  3. מה TCP מוסיף? אילו שדות חשובים בheader?
  4. מה IP מוסיף? איך הקרנל מחליט דרך איזה ממשק לשלוח?
  5. מה Ethernet מוסיף? מאיפה הקרנל יודע את כתובת הMAC של היעד?
  6. מה הדרייבר עושה?
  7. באיזה שלב מתבצע DMA?

תרגיל 2 - בדיקת proc/net/tcp/

  1. פתחו חיבור TCP כלשהו (למשל עם nc או curl) ואז הריצו:

    cat /proc/net/tcp
    

  2. כל שורה מייצגת socket TCP פתוח. השדות בהקסדצימלי. ענו:

  3. השדה local_address הוא כתובת ופורט מקומיים. הכתובת בפורמט הקסדצימלי בlittle-endian. נסו לפענח כתובת אחת.
  4. השדה st הוא הstate של הTCP connection. ערך 0A הוא LISTEN, ערך 01 הוא ESTABLISHED. מצאו socket במצב LISTEN ו-socket במצב ESTABLISHED.
  5. השדה uid מציין את הUID של המשתמש שפתח את הsocket. מצאו sockets ששייכים לroot (uid 0) ו-sockets ששייכים למשתמש שלכם.

  6. השוו את הפלט ל:

    ss -tn
    

    מה הקשר? מאיפה ss מקבל את המידע?


תרגיל 3 - מצבי socket עם ss

  1. הריצו:
    ss -tuln
    
  2. מה המשמעות של כל דגל? (t, u, l, n)
  3. מצאו שירות שמאזין על פורט 22 (SSH). באיזה מצב הsocket שלו?
  4. מצאו שירות שמאזין על כל הכתובות (0.0.0.0 או *). מה ההבדל בין שירות שמאזין על 0.0.0.0 לעומת 127.0.0.1?

  5. פתחו חיבור SSH (או כל חיבור TCP אחר) ואז הריצו:

    ss -tn state established
    

  6. מצאו את החיבור שלכם. מה כתובת המקור והיעד? מה הפורטים?

  7. הריצו:

    ss -s
    

  8. כמה sockets TCP יש סה"כ? כמה מהם ב-ESTABLISHED?
  9. כמה sockets UDP יש?

תרגיל 4 - הבנת sk_buff ומניפולציית headers

שרטטו דיאגרמה שמראה את הsk_buff בכל שלב של שליחת חבילה. הניחו שהתוכנה שולחת את המחרוזת "Hi" (2 בתים).

  1. אחרי שכבת הsocket: שרטטו את המצב ההתחלתי של הבאפר עם הנתונים "Hi". היכן data, tail, head, end?

  2. אחרי שכבת TCP: הראו מה קרה אחרי skb_push של 20 בתים (TCP header). איך data השתנה? מה יש עכשיו באזור שבין data לtail?

  3. אחרי שכבת IP: עוד skb_push של 20 בתים (IP header). שרטטו שוב.

  4. אחרי שכבת Ethernet: עוד skb_push של 14 בתים (Ethernet header). שרטטו את המצב הסופי.

  5. הסבירו: למה headroom חייב להיות מספיק גדול מראש? מה יקרה אם אין מספיק headroom?


תרגיל 5 - מרחבי שמות של רשת - network namespaces

  1. הריצו (דורש root):

    # יצירת namespace חדש
    sudo ip netns add testns
    
    # מה רואים בתוך הnamespace?
    sudo ip netns exec testns ip addr show
    sudo ip netns exec testns ip route show
    

  2. אילו ממשקי רשת קיימים בnamespace החדש?

  3. האם יש טבלת ניתוב? למה?
  4. נסו להריץ sudo ip netns exec testns ping 8.8.8.8. מה קורה ולמה?

  5. הסבירו: כשDocker מריץ container, הוא יוצר network namespace חדש. איך הcontainer יכול לתקשר עם האינטרנט אם הnamespace שלו מבודד?

רמזים:
- מה זה veth pair?
- מה זה bridge?
- איפה NAT נכנס לתמונה?

  1. הריצו:

    # ניקוי
    sudo ip netns del testns
    

  2. הסבירו בקצרה: מלבד network namespace, אילו סוגי namespaces נוספים קיימים בלינוקס? (ציינו לפחות 3)