מבחן הפרוטוקול = 15–20 שאלות ב-30–40 דקות. מקבלים מפרט + Packets בHex ושואלים: "מה שגוי?", "חשב Checksum", "צור Packet חוקי". אותה מתודולוגיה כמו שפה מומצאת — 5 שלבים.
מבחן הפרוטוקול = 15–20 שאלות ב-30–40 דקות. מקבלים מפרט + Packets בHex. שואלים: "מה שגוי?", "חשב Checksum", "מה שדה X?", "צור Packet חוקי". אותה מתודולוגיה כמו שפה מומצאת — 5 שלבים.
💡 אנלוגיה — Packet כמעטפה
מכתב שנשלח בדואר: מעטפה (Header) עם כתובת שולח/נמען, תוכן (Payload), חותמת (Checksum). Header = מידע על ה-Packet. Payload = המידע עצמו. Checksum = בדיקת תקינות. Flags = bits שמסמנים מצבים.
5 שלבים לפרוטוקול מומצא
שלב
שם
מה עושים
זמן
1
סקר מהיר
קרא כל המפרט פעם אחת. מה סוגי ה-Packets?
4–5 דקות
2
מיפוי Header
ציר: מה כל byte? מאיזה offset? ערכים אפשריים?
3–4 דקות
3
Checksum
הבן האלגוריתם. תרגל חישוב ידני על הדוגמה.
3 דקות
4
Packet Example
מצא דוגמה. פרסר שדה-שדה. ודא הבנה.
3 דקות
5
שאל ענה
לכל שאלה: מצא בMפרט, חשב, בדוק כל שדה
2–3 דקות
Header Fields שחוזרים בכל פרוטוקול
שדה
תיאור
גודל
Magic/Sync
ערך קבוע שמאמת "זה ה-Packet הנכון"
1–2 byte
Type
סוג ה-Packet: SYN, DATA, ACK, FIN...
1 byte
Sequence Number
מספר רציפות — לסדר Packets
1–4 byte
Payload Length
גודל ה-Payload בbytes
1–2 byte
Flags
Bits בודדים למצבים: URGENT, ACK, SYN...
1–2 byte
Checksum
בדיקת שלמות נתונים
1–2 byte
⚠️ Big-Endian vs Little-Endian
פרוטוקולי רשת = Big-Endian (byte גבוה קודם). הערך 0x1234 ב-2 bytes: Big-Endian = 12 34 · Little-Endian = 34 12. כשמפרט אומר "Length=0x0010" = 16 bytes.
✏תרגול — מבוא פרוטוקולים3 שאלות
תרגול 13.1
מה Magic byte? למה הוא קיים?
✓ תשובה: ג) — Magic = sentinel ידוע. מקבל בודק: Magic=0x5A? כן→ זה StreamLink. לא→ זרוק. מונע עיבוד של data רנדומי כ-Packet.
תרגול 13.2
מה ההבדל בין Checksum שגוי ל-Packet לא חוקי (Invalid)?
✓ תשובה: ג) — Checksum שגוי = נתון תקין שנפגם בשידור. Invalid = הPacket עצמו בנוי לא לפי כללי המפרט. שתי שגיאות שונות!
תרגול 13.3
DataPlex: SYN(Seq=10) → SYN-ACK(Seq=50,Ack=?). מה Ack?
// Handshake Analysis:
P1 SYN: 02 10 00 00 00 00 05 17 (Sum=0x17)
P2 SYN-ACK: 02 20 00 64 00 01 05 8C (Seq=100,Ack=1)
P3 ACK: 02 40 00 01 00 65 05 AD (Seq=1,Ack=101)
// NACK: server שלח על Seq=2 → Client retransmits DATA Seq=2
📡 SecureQ v3.0
Header (10B): Magic(51)|Type|ClientID|SessionID|PayLen|Flags|Seq(2B)|Checksum(2B,SUM%65536)
Auth: INIT→CHALLENGE(token)→RESPONSE(token XOR secret)→GRANTED/DENIED
DATA only after GRANTED. PayLen≤64. SessionID must match.
✏תרגול — DataPlex ו-SecureQ4 שאלות
תרגול 10.1
DataPlex: DATA(Seq=7) → ACK מהReceiver. מה Ack Number?
✓ 8 — Ack = next expected = Seq+1 = 8.
תרגול 10.2 — Window
DataPlex Window=1. מתי יכול לשלוח DATA נוסף?
✓ ג) — Window=1: רק 1 unacked. חייב ACK לפני שהולכים הלאה.
תרגול 10.3 — SecureQ
SecureQ DATA לפני GRANTED. מה קורה?
✓ ב) — R1: DATA only valid in GRANTED state. State Machine מנצח.
תרגול 10.4 — XOR Trick
XOR של [0x12, 0x12, 0x12, 0x12] = ?
✓ 0x00 — 12^12=0, 0^12=12, 12^12=0. זוגות שווים מבטלים!
🎯 דגש למבחן — אלימינציה מהירה בפרוטוקולים
לפני שמתחילים לחשב Checksum ארוך: בדקו קודם את ה־Magic Byte ואת אורך ה־Payload מול ההצהרה ב־Header. ברוב שאלות "מה שגוי?" הפסילה מגיעה כבר משם — וזה חוסך דקות יקרות. רק אם שניהם תקינים, גשו לחישוב ה־Checksum.
// אתגר מעשי
אתגר מעשי — פרוטוקול תקשורת: ביטים ומסגרות
שיא השיעור: לבנות ולתקן מערכות אמיתיות — מפרשים, פרוטוקולים, מכונות. פתרו את החובה ואז את האתגר; ההגשה נבדקת אוטומטית מול מקרי-קצה נסתרים.
T2 · בסיסי200 נק'~15 דק'algorithmic
רגיסטר ביט-פלאגים (Set/Clear/Toggle)
בפרוטוקולים רבים דגלים נשמרים כביטים ברגיסטר יחיד. נתון ערך התחלתי F ורשימת פעולות; כל פעולה היא "SET n" (הדלק את ביט n), "CLR n" (כבה את ביט n), "TOG n" (הפוך את ביט n). החזר את הערך הסופי של F.
def bit_ops(F: int, ops: list[str]) -> int:
for o in ops:
cmd, n = o.split(); n = int(n)
if cmd == 'SET': F |= (1 << n) # הדלק ביט
elif cmd == 'CLR': F &= ~(1 << n) # כבה ביט
elif cmd == 'TOG': F ^= (1 << n) # הפוך ביט
return F
T3 · בינוני400 נק'~30 דק'algorithmic
פרסור מסגרות פרוטוקול + Checksum
פענח זרם בייטים (רשימת מספרים 0–255) של פרוטוקול ממוסגר. כל מסגרת: בייט התחלה 0x7E, ואז LEN, ואז LEN בייטים של מטען (payload), ואז בייט checksum ששווה ל-XOR של כל בתי המטען. סרוק את הזרם: דלג על בייטים עד 0x7E; קרא מסגרת; אם ה-checksum תקין — אסוף את המטען, אחרת דלג עליה; המשך. עצור אם מסגרת נקטעת (אין מספיק בייטים). החזר את רשימת המטענים התקינים (כרשימות).
דוגמאות
parse_frames([0x7E,3,1,2,3,0])→[[1, 2, 3]]
parse_frames([0x7E,2,1,9,0])→[] # xor=8 ≠ 0
הפתרון נשמר מקומית ומשותף עם עמוד „כתיבת קוד”.
פתרון-ייחוס פרסור מסגרות פרוטוקול + Checksum ›
def _xor(payload):
c = 0
for b in payload: c ^= b
return c
def parse_frames(stream: list[int]) -> list[list[int]]:
out = []; i = 0; n = len(stream); START = 0x7E
while i < n:
if stream[i] != START: i += 1; continue # סנכרון על START
if i + 1 >= n: break
ln = stream[i + 1]
if i + 2 + ln + 1 > n: break # מסגרת קטומה
payload = stream[i + 2 : i + 2 + ln]
chk = stream[i + 2 + ln]
if _xor(payload) == chk: out.append(payload) # checksum תקין
i = i + 2 + ln + 1 # קדם מעבר לכל המסגרת
return out
// סיכום
State Machine וסיכום
State Machine = מגדיר מצבים ומעברים חוקיים. השאלה הנפוצה: "מה שגוי ב-Sequence הזה?"