לדלג לתוכן

11.3 UDP ו raw sockets תרגול

תרגול - UDP ו-raw sockets

תרגול 1 - שרת ולקוח UDP - מילון

  1. כתבו שרת UDP שמחזיק "מילון" - טבלת hash פשוטה שממפה מפתחות (מחרוזות) לערכים (מחרוזות).
  2. השרת מקבל פקודות בפורמט:
  3. SET key value - שומר ערך
  4. GET key - מחזיר ערך (או "NOT FOUND")
  5. DEL key - מוחק ערך
  6. כתבו לקוח UDP שקורא פקודות מ-stdin ושולח אותן לשרת.
  7. השתמשו במערך של pairs כ-hash table פשוט (לינארי):
    struct entry {
        char key[64];
        char value[256];
    };
    struct entry dict[1024];
    int dict_size = 0;
    

רמז: בUDP כל הודעה היא עצמאית, אז אין צורך בmultiplexing - שרת פשוט עם recvfrom/sendto בלולאה.


תרגול 2 - העברת קבצים בUDP

  1. כתבו שרת ולקוח להעברת קבצים על גבי UDP.
  2. הלקוח שולח את הקובץ בחתיכות (chunks) של 1000 בתים. כל חבילה כוללת:
  3. מספר סידורי (4 בתים) - sequence number
  4. אורך הנתונים (4 בתים)
  5. הנתונים עצמם (עד 1000 בתים)
  6. השרת מקבל את החבילות ומרכיב את הקובץ.
  7. לאחר סיום, השרת מדפיס כמה חבילות הגיעו מתוך כמה שנשלחו.

מבנה חבילה:

struct file_packet {
    uint32_t seq_num;
    uint32_t data_len;
    char data[1000];
};

רמז: כיוון שUDP לא אמין, חלק מהחבילות עלולות להגיע שלא בסדר או ללכת לאיבוד. הקובץ שמתקבל עלול להיות חסר. זה בסדר לתרגיל הזה - הנקודה היא לראות את חוסר האמינות של UDP בפועל.


תרגול 3 - כלי ping

  1. כתבו מימוש של ping כמו שראינו בהרצאה.
  2. הוסיפו ספירת סטטיסטיקות: כמה חבילות נשלחו, כמה התקבלו, אחוז אובדן, ממוצע RTT.
  3. הוסיפו תמיכה בפרמטר -c N שקובע כמה pings לשלוח (ברירת מחדל: 4).
  4. בסיום, הדפיסו סיכום:
    --- 8.8.8.8 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss
    rtt min/avg/max = 11.2/12.1/13.5 ms
    

רמז: שמרו את כל ערכי הRTT במערך ובסוף חשבו min, max, ממוצע. צריך sudo כדי להריץ.


תרגול 4 - sniffer פשוט

  1. כתבו תוכנית sniffing שמציגה את כל חבילות הIP שעוברות בממשק הרשת.
  2. לכל חבילה, הדפיסו: כתובת מקור, כתובת יעד, פרוטוקול (TCP/UDP/ICMP/אחר), וגודל.
  3. הוסיפו סינון: אם המשתמש מעביר פורט כארגומנט, הציגו רק חבילות TCP/UDP שמכילות את הפורט הזה (מקור או יעד).
  4. הוסיפו מונה שמדפיס כל 10 שניות סטטיסטיקה: כמה חבילות נתפסו, כמה TCP, כמה UDP, כמה אחר.

דוגמת הרצה:

sudo ./sniffer          # כל התעבורה
sudo ./sniffer 80       # רק תעבורת HTTP (פורט 80)

רמז: השתמשו ב-AF_PACKET + SOCK_RAW + htons(ETH_P_ALL). אל תשכחו לבדוק ש-eth->h_proto == htons(ETH_P_IP) לפני שמפרסרים IP header.