לדלג לתוכן

1.6 שכבת התעבורה הרצאה

מבוא

  • שכבת הרשת נתנה לנו את האפשרות לדבר עם כל כתובת ip בעולם מעל הרשת.
  • שכבת התעבורה נותנת לנו 2 דברים:

  • ריבוב (multiplexing) - נותן לנו לשלוח מספר פקטות שונות מרכיבים שונים במחשב, וליצור תקשורת.

  • אמינות בתקשורת - ברוב התקשורות בין מחשבים אנחנו נשלח מספר רב של פקטות אחת לשני, ויכול להיות שאחת מהם תיפול בדרך, ושכבת התעבורה אחראית לטפל במצבים כאלה.

עוד כמה מילים על ריבוב:
כל תוכנה במחשב שמבצעת תקשורת עם כרטיס הרשת מקבלת פורט (port), שזה מספר בין 0-65536 שמייצג את התוכנה שמבצעת את התקשורת. כך שבסוף כאשר שני תוכנות מתקשרות בין מחשבים, אייפי מייצג את המחשב, והפורט מייצג את התוכנה שרצה על המחשב. למשל אתרי אינטרנט בדרך כלל משתמשים בפורט מספר 80. אז כשאנחנו מתחברים למחשב בפורט 80, כנראה הוא מריץ שרת של אתר אינטרנט.

פרוטוקול UDP

- פרוטוקול udp בא לפתור את בעיית הריבוב, בכך שבכל פקטה שאנחנו שולחים, אנחנו שולחים את פורט המקור (source port) שדרכו אנחנו מתקשרים (התוכנה שדרכה אנחנו מדברים) ואנחנו מציינים את פורט היעד (dest port) שאיתו אנחנו רוצים לתקשר. ובכך ברגע שהפקטה מגיעה לצד השני, מערכת ההפעלה יודעת לאן להעביר את הפקטה, לאיזה תוכנה, ובנוסף גם יודעת להגיד לתוכנה מה הוא פורט המקור שלי, כדי שמתי שהתוכנה בצד השני תחזיר לי תשובה היא תדע לאיזה פורט לשלוח את זה.

pc1: src port: 1234, dest port 80 -> pc2
pc2: src port: 80, dest port 1234 -> pc1

  • גם פרוטוקול udp מכיל את אורך הפקטה וchecksum כי איך אפשר שלא.
  • מה קורה כשולחים פקטה למחשב לפורט סגור? המחשב שולח בדרך כלל תשובת icmp של port unreachable. (לפעמים הוא גם לא שולח, ואז זה סתם מבאס)

פרוטוקול TCP

  • פרוטוקול TCP, הוא בא לפתור גם את בעיית הריבוב שפתר udp, (גם עם פורט מקור ופורט יעד) אבל גם את בעיית האמינות שדיברנו עלייה קודם.
  • הדרך שבה tcp מוודא שכל הפקטות באמת מגיעות ליעד היא בדרך הבאה:

תחילת חיבור

  • כל תחילת חיבור בtcp מתחילה בדרך הבאה:
    מחשב א' - המחשב שרוצה להתחיל את החיבור
    מחשב ב' - המחשב שגם רוצה בחיבור

  • מחשב א' מתחיל את החיבור בפקטת syn - שמראה על כך שהוא רוצה להתחיל חיבור.

  • מחשב ב' שולח פקטת ack שמראה על כך שהוא רוצה בחיבור, והוא שולח גם פקטת syn כדי להראות שגם הוא רוצה לדבר בחיבור.
  • מחשב א' מחזיר לו בתשובת ack כדי לסמן שהוא מאשר מחשב ב' גם ידבר בחיבור.

התהליך הזה נקרא three way handshake.
Pasted image 20240706145003.png
- בכך שני מחשבים מסכימים על כך שהם רוצים להתחיל חיבור tcp.

סוף החיבור

  • סוף חיבור בtcp הוא דומה, רק שבמקום syn אנחנו שולחים fin - שמראה על רצון לסיים חיבור
    Pasted image 20240706145138.png

סירוב בtcp

  • לפעמים כשמחשב שולח לנו syn, ואנחנו רוצים לסרב לו - למשל אם הפורט לא פתוח, או אם באמצע החיבור אנחנו פשוט רוצים להפסיק אותו במידי מבלי לשלוח fin אפשר באמצעות rst
  • פקטת rst בtcp מאפשרת פשוט לשלוח תשובה של סירוב, ואפשר לשלוח אותה בכל שלב בחיבור והוא יפסיק את החיבור מידית - עליו אנחנו לא מקבלים ack.
    Pasted image 20240706145442.png
  • כשאנחנו מקבלים rst כשאנחנו מנסים להתחיל חיבור עם פורט מסויים (syn) אז אנחנו יכולים להניח שכנראה הפורט סגור - אין שום תוכנה שמאזינה על הפורט.

שיחת tcp

  • אז עכשיו שאנחנו יודעים איך שיחות מתחילות בtcp, מסתיימות ואפילו איך לסרב להן, נלמד מה קורה בשיחה עצמה:
    בשליחת מידע:
  • בtcp כל פעם שאנחנו שולחים מידע, אנחנו צריכים להגיד איזה מידע העברנו וכמה העברנו ממנו, זה מתבצע באמצעות השדה seq - מספר שמכיל את המיקום של הבית שאני רוצה להעביר, והשדה lenght שמכיל את כמות הבתים שאני רוצה להעביר.
  • למשל אם אני רוצה להעביר לצד השני 2000 בתים, ב2 פקטות, זה יתבצע כך:
  • בפקטה הראשונה אגיד שהעברתי 1000 בתים - בשדה הlength, ואגיד שהתחלחתי להעביר מבית מספר 1, והלאה - נשמר בשדה הseq.
  • בפקטה השנייה אציין שהעברתי עוד 1000 בתים - בשדה הlength, ואגיד שהתחלתי להעביר מבית מספר 1000, והלאה - נשמר בשדה הseq.
  • בכך הצד השני ידע בכל רגע בחיבור איזה בתים אני מעביר כרגע, (מה המספר שלהם - באמצעות seq) וכמה בתים אני מעביר (הlength).

בקבלת מידע:
- בtcp כל פעם שאנחנו מקבלים מידע, בפקטה הבאה שאנחנו שולחים אנחנו צריכים לציין שקיבלנו את המידע הקודם בהצלחה, ואנחנו עושים זאת באמצעות השדה ack שזה מספר שמכיל את כמות הבתים בפקטה האחרונה שקיבלנו.
וכך הצד השני ידע כמה בתים הועברו אלינו בהצלחה.
- שימו לב שהשדה ack, הוא בשביל לאשר פקטות שהגיעו, והוא לא כמו פקטת ack בtcp שדיברנו עליה קודם בהקשר של יצירת חיבור וניתוק חיבור.

  • בחיבור tcp כשאנחנו שולחים מידע אנחנו כל הזמן שולחים אותו עם השדה seq וlength כדי שהצד השני ידע איזה מידע אנחנו שולחים, וגם באותה פקטה אנחנו שולחים גם ack כדי שהצד השני ידע שהפקטה שהוא שלח קודם התקבלה בהצלחה, ואם לא הוא ידע לשלוח אותה שוב עם seq וlength דומים לפקטה שהוא ניסה לשלוח.
  • כך שהפקטות יכולות להיראות כך:
    Pasted image 20240706151438.png
  • אז האקרים ניצלו את כך שהם יודעים שהפקטות בtcp תמיד מתחילים עם seq=1 וack=1 כדי לגנוב חיבורי tcp של אחרים בכך שהם שולחים פקטות עם seq וack עם מספרים נמוכים כמו 100, ו200 שמאוד סביר שהם יהיו חלק מהחיבור בפקטות שהם מזייפים את הip שלהם מתחזים לip-ים של אנשים אחרים. וכך האקרים הצליחו ממש להעביר מידע זדוני ושקרי בחיבורי tcp של מחשבים. שיטה זו נקראת tcp injection.
  • כדי לתקן את הבעיה, החליטו שבכל חיבור הseq יתחיל ממספר גבוהה ורנדומלי כך שהאקרים לא יוכלו לנחש את הseq שלנו ולגנוב לנו את החיבור. המספר הזה נקרא הISN - קיצור של initial sequence number: אז חיבורי tcp נראים כך:
    Pasted image 20240706152619.png
  • ועכשיו אם האקרים יכולו לגלות את המספרי seq שלנו, הם יוכלו לגנוב את החיבור ולזייף מידע, והאקרים יכולו לעשות זאת רק אם יש להם גישה לתעבורה שעוברת בנינו - כלומר אם הם יושבים על ראוטר בנינו, רכיב רשתי כלשהו או אפילו על המחשבים שלנו הם יוכלו לדעת את הseq ולעשות לנו tcp injection.

  • אמונם בשיחות tcp עם seq וack הצלחנו לאשר את כמות הבתים שכל אחד שלח לשני, אבל לא את הבתים עצמם - זה נעשה באמצעות checksum פשוט.

  • מה קורה אם בזמן בשיחה בין שני המחשבים אחד מהם קורס? איך הצד השני אמור לדעת מכך? באמצעות timeout: זהו מספר שמכיל את כמות השניות שאם הצד השני לא מדבר איתך - החיבור נסגר אוטומטית.

  • יכולים להיות מצבים שבהם הצד לא מדבר איתך בגלל עומסים וכו, והוא לא רוצה שתסגור את החיבור איתו - אז פתרון לכך הן פקטות keep-alive, שהצד השני יכול לשלוח פעם בכמה זמן כדי לוודא שלא תסגור את החיבור ושתמשיך לחכות לתשובה. (כך שהtimeout יתאפס ולא יסגור את החיבור)

עוד קצת על tcp

  • אז למדנו כיצד פותחים חיבור (באמצעות דגלי syn וack)
  • איך סוגרים חיבור (באמצעות דגלי fin וack)
  • איך מסיימים חיבור מיידית (דגל rst)
  • איך מבצעים שיחה (באמצעות שדות seq, ack, length, timeout, checksum)

למעשה בtcp קיימים גם עוד מנגונונים שמטרתם למנוע שגיאות, ולבצע המון יעולים - שהם שדה שנקרא window, דגל psh, ודגל urg. אנחנו לא נדבר עליהם בקורס, אבל מוזמנים לקרוא גם עליהם.

בנוסף בפקטת tcp נשמר עוד חולנות מידע ריקים - reserved + options כך שאם בעתיד מישהו ירצה להרחיב את הפרוטוקול יוכלו בקלות.

נסכם:
- דוגמה לחיבור tcp:
Pasted image 20240706154026.png
- דוגמה לפקטת tcp:
Pasted image 20240706154647.png

הבדל בין tcp לudp

  • פרוטוקול tcp ופרוטוקול udp מביאים לנו ריבוב, אך udp לא מספק אמינות וtcp כן מספק. אך בגלל שtcp מספק אמינות הוא דורש להעביר יותר פקטות, וכך מהירות החיבור בתכלס תהיה יותר נמוכה.
  • משתמשים בudp כאשר רוצים לעשות תקשורת בשביל משהו שהאמינות שלו לא חשובה, ויותר חשובה המהירות - כמו משחקי מחשב, זום, דיסקורד, וכו.
  • משתמשים בtcp כאשר רוצים לעשות תקשורת שהאמינות היא קריטית, כמו הורדת קובץ חשוב, גלישה לאתר אינטרנט וכו.

טאפל 5 - five tuple

  • טאפל 5, זה דרך לאפיין חיבור כלשהו בין 2 מחשבים, הוא בנוי מהפורט מקור ו- ip מקור, ופורט יעד וip יעד ופרוטוקול תעבורה (udp או tcp).
  • כדי לראות את כל ה5 טאפלים של המחשב שלנו, הריצו את הפקודה netstat

פקודות שימושיות

  • הורידו את הכלי הבא: https://nmap.org/download.html
  • התוכנה הבאה התקינה לכם על המחשב את הפקודות ncat ו - nmap.
  • הכלי nmap מאפשר לכם לסרוק פורטים בשפתוחים במחשבים בעולם, ולבצע על הפורטים שהכלי מצא כפתוחים כל מיני סריקות - סריקת פורטים בסיסת מתבצעת על ידי שיטה שנקראת syn scan, שבעצם שולחת מלא בקשות syn בכל הפורטים מול מחשב מסויים, וכאשר המחשב מחזיר ack, אנחנו מניחים שהפורט פתוח - וכאשר המחשב מחזיר rst מניחים שהפורט סגור:
    סריקת פורטים עם nmap:
    nmap 45.33.32.156
    

    סריקת פורטים ספציפים:
    nmap 45.33.32.156 -p 22,80
    

    הפעלת מצב verbose - יציג הרבה לוגים בזמן הסריקה:
    nmap 45.33.32.156 -v
    

    סריקות service-ים שמריצים את הפורטים, סריקות גרסאות:
    nmap 45.33.32.156 -v -A
    
  • הבעיה בסריקת פורטים: שהשיטה שציינו למעלה לא סורקת פורטי udp, ובנוסף יכול להיות שיש חומת אש (firewall) על המחשב - חומת אש בצורה הכי בסיסית שלה היא תוכנה שמאפשרת חיבורים רק על פורטים מסויימים מip-ים מסויימים. כך שאנחנו יכולים לקנפג למשל בווינדוס שכל מי שמנסה להתחבר אלינו בפורט כלשהו, אז אנחנו חוסמים אותו - לא עונים לו בכלל, אפילו לא rst ולא ack. כך שסריקת פורטים כמו שציינו למעלה לא תדע אם הפורט פתוח או סגור.

  • הכלי nmap הוא כלי משוגע, ויש לו עוד המון יכולות, כמו סריקת ip-ים פעילים בsubnet מסויים עם סריקות arp, או סריקות icmp ping וגם ברגע שהוא מוצא פורט פתוח על מחשב הוא יודע להגיד המון פעמים מלא מידע על התוכנה שרצה שמאיזנה בפורט. ושווה לכם ללמוד עליו ולהשתמש בו, בקורס זה לא נעבור על הכלי מכיוון שזה לא קורס תקיפת רשתות או משהו בסגנון אלה קורס בסיסי.
    סריקת host-ים בסאבנט מסויים (פועל עם סריקת icmp וסריקת arp)

    nmap -sn 192.168.0.1/24
    

  • הכלי ncat שהורדנו מאפשר לנו להאזין על פורטים מסויימים וליצור תקשורת עם פורטים מסויימים בצורה מאוד נוחה -
    הפקודה הבאה תפתח חיבור האזנה על פורט 4444:

    ncat -lnvp 4444
    

    הפקודה הבאה תתחבר לip והפורט 127.0.0.1:4444
    ncat 127.0.0.1 4444
    

    אם תריצו את שני הפקודות האלו בשני טרמינלים שונים, תראו כי בטרמינל אחד אתם מאזינים על פורט מסויים, ובטרמינל שני התחברתם לפורט הזה בכך ששמתם את הip שלכם - 127.0.0.1 (מזכיר שזה ip מיוחד שמצביע על המחשב שלכםם) וכמובן גם הפורט שבחרנו להאזנה 4444.

  • עכשיו אם תכתבו משהו באחד הטרמינלים ותלחצו על אנטר, המידע יעבור לטרמינל השני.
    Pasted image 20240706155921.png
    Pasted image 20240706155928.png
  • ברוב החיבורים, יש בדרך כלל צד שמאזין - לו אנחנו קוראים שרת. וצד שמתחבר, לו אנחנו קוראים לקוח.
  • במקרה הזה הncat -lnvp 4444 היא תוכנת שרת ו - ncat 127.0.0.1 4444 היא תוכנת לקוח.
  • גם אם נריץ את הפקודה netstat נוכל לראות את החיבור ncat שיצרנו פה.
  • כמו שהצלחנו להתחבר לעצמינו בncat, ויצרנו תקשורת בין שני פרוססים במחשב בtcp, אנחנו יכולים לעשות זאת גם באינטרנט בין מחשבים בעולם.