11.3 UDP ו raw sockets תרגול
תרגול - UDP ו-raw sockets¶
תרגול 1 - שרת ולקוח UDP - מילון¶
- כתבו שרת UDP שמחזיק "מילון" - טבלת hash פשוטה שממפה מפתחות (מחרוזות) לערכים (מחרוזות).
- השרת מקבל פקודות בפורמט:
SET key value- שומר ערךGET key- מחזיר ערך (או "NOT FOUND")DEL key- מוחק ערך- כתבו לקוח UDP שקורא פקודות מ-stdin ושולח אותן לשרת.
- השתמשו במערך של pairs כ-hash table פשוט (לינארי):
רמז: בUDP כל הודעה היא עצמאית, אז אין צורך בmultiplexing - שרת פשוט עם
recvfrom/sendtoבלולאה.
תרגול 2 - העברת קבצים בUDP¶
- כתבו שרת ולקוח להעברת קבצים על גבי UDP.
- הלקוח שולח את הקובץ בחתיכות (chunks) של 1000 בתים. כל חבילה כוללת:
- מספר סידורי (4 בתים) - sequence number
- אורך הנתונים (4 בתים)
- הנתונים עצמם (עד 1000 בתים)
- השרת מקבל את החבילות ומרכיב את הקובץ.
- לאחר סיום, השרת מדפיס כמה חבילות הגיעו מתוך כמה שנשלחו.
מבנה חבילה:
רמז: כיוון שUDP לא אמין, חלק מהחבילות עלולות להגיע שלא בסדר או ללכת לאיבוד. הקובץ שמתקבל עלול להיות חסר. זה בסדר לתרגיל הזה - הנקודה היא לראות את חוסר האמינות של UDP בפועל.
תרגול 3 - כלי ping¶
- כתבו מימוש של
pingכמו שראינו בהרצאה. - הוסיפו ספירת סטטיסטיקות: כמה חבילות נשלחו, כמה התקבלו, אחוז אובדן, ממוצע RTT.
- הוסיפו תמיכה בפרמטר
-c Nשקובע כמה pings לשלוח (ברירת מחדל: 4). - בסיום, הדפיסו סיכום:
רמז: שמרו את כל ערכי הRTT במערך ובסוף חשבו min, max, ממוצע. צריך sudo כדי להריץ.
תרגול 4 - sniffer פשוט¶
- כתבו תוכנית sniffing שמציגה את כל חבילות הIP שעוברות בממשק הרשת.
- לכל חבילה, הדפיסו: כתובת מקור, כתובת יעד, פרוטוקול (TCP/UDP/ICMP/אחר), וגודל.
- הוסיפו סינון: אם המשתמש מעביר פורט כארגומנט, הציגו רק חבילות TCP/UDP שמכילות את הפורט הזה (מקור או יעד).
- הוסיפו מונה שמדפיס כל 10 שניות סטטיסטיקה: כמה חבילות נתפסו, כמה TCP, כמה UDP, כמה אחר.
דוגמת הרצה:
רמז: השתמשו ב-
AF_PACKET+SOCK_RAW+htons(ETH_P_ALL). אל תשכחו לבדוק ש-eth->h_proto == htons(ETH_P_IP)לפני שמפרסרים IP header.