Professional Documents
Culture Documents
סיכום רשתות
סיכום רשתות
האינטרנט הינה רשת מחשבים המחברת מיליארדים של מכשירים מגוונים אחד עם השני.
בעבר היינו מתייחסים למכשירים האלו כמחשבים בלבד .אך זה כלל לא המצב בעידן של היום.
כשמערכת קצה שולחת מידע למערכת אחרת ,היא מבצעת חלוקה ( )segmentationשל המידע ומוסיפה
headersלכל חלק .התוצאה הסופית של זה נקראת פקטה (.)packet
בהגעה אל היעד הפקטה ״מתפרקת״ ומתקבל המידע הרצוי.
packet switchהוא אמצעי שלוקח פקטה מחיבור תקשורת נכנס ומעבירה אותה לחיבור תקשורת יוצא .שני
הסוגים המוכרים של ״ממתגי מנה״ הם link layer switchו . routerהראשון יותר נפוץ ב Access
Networkוהשני יותר נפוץ ב Core Network
כל מערכת קצה ניגשת לאינטרנט באמצעות ISPשכל אחד כזה מהווה רשת של packet switchesו
.communication links
האופן שבו המידע עובר ברשת נקבע באמצעות פרוטוקולים שהחשובים שבהם הם TCP/IPוהם מהוות
מעין מוסכמה שבאמצעותה מחלקים את המידע העובר בתווך כלשהו ואילו headersמוסיפים.
ממשק זה נקרא Socketsוהוא מהווה אוסף חוקרים שתוכנה שולחת חייבת ללכת לפיה כדי שתוכל לשלוח
מידע באמצעות האינטרנט .כל תוכנה שמשתמשת ברשת חייבת לעבוד עם ממשק ה socketsובהתאם
למכשיר עליו התוכנה יושבת ,הממשק יכול לבקש דברים שונים.
פרוטוקול
נסתכל על הדיאגרמה הבאה כדי להבין מהו פרוטוקול
כשבן אדם א׳ מבקש מבן אדם ב׳ את השעה זוהי מוסכמה שקודם כל צריכה להיות מעין ״ברכת איחול״
קודם לכן ולאחר מכן שאלה ותשובה .התגובה של בן אדם א׳ תלויה בחינוך ובתרבות שהוא חי בה .אם כן ,
פרוטוקול הוא בעצם מוסכמה ששני הצדדים צריכים להסכים עליה כדי שתוכל להתבצע ה״שיחה״ .דוגמה
נוספת יכולה להיות מורה שעוצר את השיעור בכתה תחת האמרה ״יש שאלות?״ ותלמיד יכול לשאול שאלה
על ידי הרמה של היד ואישור המורה לאחר שזיהה את התלמיד ולאפשר לו לשאול את השאלה ,תלמיד
שלא היה מרים את היד לא היה מקבל אישור מהמורה לשאול שאלה ,גם אם בכוונתו לשאול.
פרוטוקול תקשורת דומה במהותו לדוגמאות הנ״ל רק שהתקשורת נעשית בין רכיבי תוכנה או חומרה של
מכשירים כלשהם.
ארכיטקטורת שכבות
המורכבות של האינטרנט מחייבת אותנו לבנות ארכיטקטורת שכבות כך שכל שכבה אחראית על תפקיד
מסוים ומידע מסוים.
באנלוגיה לחיים האזרחיים ,נסתכל על מערכת שכבות שמתארת את העלייה שלנו לטיסה
בדומה ,בעולם הרשתות ,פקטה יוצאת ממחשב מקור למחשב יעד .כמו כן נשים לב לסימטריה שבמערכת
העלייה לטיסה( ,על כל קנייה של כרטיס יש זיכוי ,על כל העלאה של מזוודה יש משיכה של המזוודה
בסוף) .וניתן לחלק את זה לשכבות כפי שנראה בתמונה השנייה .כל שכבה נותנת סוג כלשהו של שירות
לשכבה הבאה.
אם כן ,ארכיטקטורת שכבות מאפשרת לנו לחלק מערכות מורכבות לפי שכבות פשוטות יותר ובכך לתת
מעין מודולריות וגמישות לכל חלק ,כל עוד כל שכבה מבצעת את הפעולה שהיא צריכה אין זה משנה איך
היא מבצעת אותו.
Protocol layering
נחבר אם כן את המונחים של פרוטוקול ושל ארכיטקטורת שכבות עליהם דיברנו קודם.
המימושים של הפרוטוקולי תקשורת מסודרים בשכבות .כל פרוטוקול שייך לאחת השכבות כמו שכל פעולה
במערכת הטיסה הנ״ל שייכת לשכבה.
כל שכבה נותנת servicesלשכבה שמעליה באמצעות פעולות מסוימות שהיא עושה בעצמה ובאמצעות
המידע שהיא קיבלה מהשכבות שקדמו לה.
פרוטוקול בשכבה כלשהי יכול להיות ממומש בתוכנה ,בחומרה או בשילוב של השניים .למשל פרוטוקולים
של שכבת האפליקצייה כמו HTTPאו SMTPממומשות ברובן בשכבה האפליקצייה במערכות הקצה וכך
גם פרוטוקולים של שכבת התעבורה .בשכבה הפיזית לעומת זאת ,יש מימוש חומרתי ברמת הכרטיס רשת.
ישנם מספר ארכיטקטורות שכבות לאינטרנט שהראשית בינהם היא מודל 5השכבות הנ״ל.
Note
לארכיטקטורת שכבות יש יתרונות רבים אך היא אינה מושלמת בעצמה ,למשל ישנם מצבים שבהם
יש כפילויות של מימושים בין השכבות כלומר אותה פונקציונליות מסוימת נמצאת בשתי שכבות
סמוכות .כמו כן ההפרדה מעולם לא תהיה מלאה לחלוטין שכן כל שכבה צריכה מידע משכבה
ספציפית
Application Layer
שכבת האפליצייה היא המקום שבו שוכנים יישומי רשת והפרוטוקולים של שכבת היישומים שלהם .שכבת
היישום של האינטרנט כוללת פרוטוקולים רבים ,כמו פרוטוקול ( HTTPהמספק בקשה והעברה של מסמכי
אינטרנט)( SMTP ,המספק העברת הודעות דואר אלקטרוני) ו( FTP-המספק העברת קבצים בין שניים
מערכות קצה) .פונקציות רשת מסוימות ,כמו תרגום של שמות ידידותיים לאדם עבור מערכות קצה אינטרנט
כמו www.ietf.orgלכתובת רשת של 32סיביות ,נעשות גם הן בעזרת פרוטוקול של שכבת האפליקצייה,
כלומר ,מערכת שמות הדומיין (.)DNS
פרוטוקול זה מופץ על פני מספר מערכות קצה ,כאשר האפליקציה במערכת קצה אחת משתמשת
בפרוטוקול כדי להחליף חבילות מידע עם האפליקציה במערכת קצה אחרת .נתייחס לחבילת המידע הזו
בשכבת היישום כ .message/data
Transport Layer
שכבת התעבורה של האינטרנט מעבירה הודעות שכבת אפליקציה בין נקודות קצה של יישומים .באינטרנט,
ישנם שני פרוטוקולי תעבורה TCP ,ו ,UDP-שכל אחד מהם יכול להעביר הודעות שכבת יישומיםTCP .
מספקת שירות מונחה חיבור ליישומים שלה .שירות זה כולל אספקהמובטחת של הודעות משכבת
האפליקצייה ליעד ובקרת זרימה (כלומר ,התאמת מהירות שולח/מקבל) TCP .גם מפרק הודעות ארוכות
למקטעים קצרים יותר ומספק מנגנון בקרת גודש ,כך שמקור מצער את קצב השידור שלו כאשר הרשת
עמוסה .פרוטוקול UDPמספק שירות connectionlessליישומים שלו .זהו שירות ללא סלסולים שאינו
מספק אמינות ,ללא בקרת זרימה וללא בקרת גודש .המידע העובר בשכבה הזו הוא segment
Network Layer
שכבת הרשת של האינטרנט אחראית להעברת מנות שכבת רשת הידועות כ Datagrams-ממארחאחד
למשנהו .פרוטוקול שכבת התעבורה באינטרנט ( TCPאו )UDPבמארח מקור מעביר קטע שכבת תחבורה
וכתובת יעד לשכבת הרשת ,בדיוק כפי שהיית נותן לשירות הדואר מכתב עם כתובת יעד .שכבת הרשת
מספקת לאחר מכן את השירות של מסירת הקטע לשכבת התחבורה במארח היעד.
שכבת הרשת של האינטרנט כוללת את פרוטוקול ה IP-המהולל ,המגדיר את השדות ב Datagram-וכן
כיצד פועלות מערכות הקצה והנתבים בשדות אלו .יש רק פרוטוקול IPאחד ,וכל רכיבי האינטרנט שיש להם
שכבת רשת חייבים להפעיל את פרוטוקול ה .IP-שכבת הרשת של האינטרנט מכילה גם פרוטוקולי ניתוב
הקובעים את המסלולים ש datagramsעוברות בין מקורות ויעדים .לאינטרנט יש פרוטוקולי ניתוב רבים.
האינטרנט הוא רשת של רשתות ,ובתוך רשת ,מנהל הרשת יכול להפעיל כל פרוטוקול ניתוב רצוי .למרות
ששכבת הרשת מכילה גם את פרוטוקול ה IP-וגם פרוטוקולי ניתוב רבים ,היא מכונה לעתים קרובות פשוט
שכבת ה ,IP-המשקפת את העובדה ש IP-הוא הדבק שמחבר את האינטרנט יחד.
Link Layer
שכבת הרשת של האינטרנט מנתבת datagramsדרך סדרה של ראוטרים בין המקור ליעד .כדי להעביר
פקטה מצומת אחד ( hostאו ראוטר) לצומת הבא במסלול ,שכבת הרשת מסתמכת על שירותי שכבת
הקישור .בפרט ,בכל צומת ,שכבת הרשת מעבירה את ה Datagram-למטה אל שכבת הקישור ,אשר
מעבירה את ה Datagram-לצומת הבא לאורך המסלול .בצומת הבא זה ,שכבת הקישור מעבירה את
הנתונים גרמה למעלה לשכבת הרשת.
השירותים שמספקת שכבת הקישור תלויים בפרוטוקול הקישור הספציפי המופעל על הקישור .לדוגמה ,כמה
פרוטוקולים של שכבת קישור מספקים מסירה אמינה ,מצומת שידור ,דרך קישור אחד ,ועד לצומת קבלה.
שימו לב ששירות משלוחים אמין זה שונה משירות המשלוחים האמין של ,TCPהמספק משלוח אמין
ממערכת קצה אחת לאחרת .דוגמאות לפרוטוקולים של שכבת קישור כוללות Ethernet, WiFiופרוטוקול
DOCSISשל רשת הגישה לכבלים .מכיוון שגרמות נתונים בדרך כלל צריכות לעבור מספר קישורים כדי
לנסוע ממקור ליעד ,ייתכן ש Datagram-יטופל על ידי פרוטוקולים שונים של שכבת קישור בקישורים שונים
לאורך המסלול שלה .לדוגמה ,דאטהגרם עשוי להיות מטופל על ידי Ethernetבקישור אחד ועל ידי PPP
בקישור הבא .שכבת הרשת תקבל שירות שונה מכל אחד מהפרוטוקולים השונים של שכבת הקישור.
נתייחס למנות שכבת הקישור כאל .frames
Physical Layer
בעוד שהתפקיד של שכבת הקישור הוא להעביר פריימים שלמים מאלמנט רשת אחד לאלמנט רשת סמוך,
תפקידה של השכבה הפיזית הוא להעביר את הביטים בתוך ה frameמצומת אחד למשנהו .הפרוטוקולים
בשכבה זו שוב תלויים בקישור ועוד יותר תלויים באמצעי השידור בפועל של הקישור (לדוגמה ,חוט נחושת
מעוות זוג ,סיבים אופטיים במצב יחיד) .לדוגמה ,ל Ethernet -יש הרבה פרוטוקולים של שכבה פיזית :אחד
עבור חוטי נחושת מעוותים ,אחר עבור כבל קואקסיאלי ,אחר עבור סיבים ,וכן הלאה .בכל מקרה ,קצת
מועבר על פני הקישור בדרך אחרת.
Encapsulation
M התמונה ממחישה את הרעיון החשוב של אנקפסולציה ברשת .במארח השולח ,הודעת שכבת יישום
מועברת לשכבת התחבורה .במקרה הפשוט ביותר ,שכבת התעבורה לוקחת את ההודעה ומצרפת מידע
נוסף H tשישמש את שכבת התעבורה בצד המקלט .הודעת שכבת היישום ומידע הכותרת של שכבת
התעבורה מהווים יחד את מקטע שכבת התעבורה .קטע שכבת ההובלה מכסה אפוא את הודעת שכבת
היישום .המידע הנוסף עשוי לכלול מידע המאפשר לשכבת התחבורה בצד המקלט להעביר את ההודעה עד
ליישום המתאים ,וביטים לזיהוי שגיאות המאפשרים למקלט לקבוע אם סיביות בהודעה שונו במסלול .לאחר
מכן ,שכבת התחבורה מעבירה את הקטע לשכבת הרשת ,אשר מוסיפה מידע על כותרת רשת ( Hnבאיור
)1.24כגון כתובות מקור וכתובות קצה של מערכת היעד ,ויוצרת נתונים גרמה של שכבת רשת .לאחר מכן,
הדאטהגרם מועבר לשכבת הקישור ,אשר תוסיף מידע כותרת של שכבת קישור משלה ותיצור מסגרת של
שכבת קישור .לפיכך ,אנו רואים שבכל שכבה ,לחבילה יש שני סוגים של שדות :שדות כותרת ושדה
.payloadה payloadהוא בדרך כלל חבילה מהשכבה שלמעלה.
Switch
switchפועל בשכבת הלינק (שכבה )2ולעיתים בשכבת הרשת (שכבה )3של OSIולכן תומך בכל
פרוטוקול פקטות .רשתות LANשמשתמשות Switchכדי להצטרף למקטעים נקראות .Switched LAN
רכיב זה הוא רכיב שמנתב את הפקטות בין מקטעי ה LANרק ליעד המתאים.
ה Switchעושה זאת באמצעות Switch tableשבו מוצמד לכל פורט כתובת MACשל המכשיר שמחובר
אליה.
הבחנה
Hubו Switchesמאפשרים להעביר מידע בטווח של .LANהם לא מאפשרים להוציא מידע מחוץ
לרשת המקומית ,כיוון שאין להם את היכולת לקרוא כתובות IP
Switch Table
כאשר ה Switchמקבל , Frameה Frameמכיל ב Headersשלו את ה Source MACואת ה .Dest Mac
ראשית הוא יודע לשייך את ה Source MACלפורט שממנו הגיע ה ,Frameהוא מיד שומר זאת בטבלה
(הטבלה משמשת ב Cacheולכן המידע לא נשמר באופן תמידי) .כעת מצב הטבלה הוא
כאשר ה Switchלא יודע מיהו ה( Dest Macאם הוא יודע כלומר זה שמור לו בטבלה הוא מיד מעביר את
ה frameליעד) ,הוא שולח את ה frameלכל הנקודות חיבור חוץ מ IN=1שזה הפורט של מי ששלח את
ה ,Frameבשיטה שנקראת .Broadcastingרק המחשב שאמור לקבל את ההודעה מגיב בחזרה בFrame
תגובה .כאשר מתקבל ה Frameהזה ב ,Switchהוא בודק את ה Source MACשוב פעם ומעדכן שוב את
הטבלה .כעת הטבלה נראת ככה:
IN MAC
1 A
2 B
Router
ראוטר הוא מחובר לפחות לשתי רשתות ,או שתי LANsאו ) .WANs (Wide Area Networkאו LANאל
מול ה ). ISP (Internet Service Provider
הראוטר מנתב את מידע מרשת אחת לאחרת בהתאם לכתובת ה IPשלהם.
הראוטר מקבל מפקטה את כתובת ה IPוהוא קובע האם זה מיועד לרשת שלו או שזה מיועד לרשת אחרת.
בעצם הראוטר מהווה Gatewayשל הרשת המקומית.
ההבדלים
MAC
כתובת MACהיא כתובת המורכבת משישה צירופים של זוגות אותיות ( )A-Fומספרים ,המופרדים בינהם.
את ההפרדה אפשר לייצג במגוון דרכים ,לדוגמה:
פרוטוקול ARPרלוונטי רק ב שכבת הקו ,כלומר רק ברשת המקומית .לכן יש צורך של המחשב לדעת מי
נמצא איתו ברשת המקומית .הזיהוי הזה מתבצע באמצעות הצמדה של כתובת MACלכתובת IPשל
המחשבים שנמצאים איתו באותה רשת.
ב) לאחר התגובה של מחשב Aממחשב , Bהוא שומר את המידע ב ARP tableשנמצא אצלו (לכל
מחשב ברשת המקומית יש טבלה משלו) שמכיל את העמודות . IP,MAC,Portפעם הבאה הוא יוודא
בטבלה האם כתובת ה MACשמורה בהינתן ה Dest IPוככה יוותר על תהליך ה.Broadcast
פקטת ARP
כאשר בקשת ARPנשלחת לכל הישויות ברשת המקומית ,במטרה למפות בין כתובת לוגית לכתובת פיזית,
בתגובה ,המחשב שכתובת ה IPבבקשה שייכת לו ,מחזירת את כתובת ה MACשלו .בגלל שפקטת ARP
עוברת רק בשכבת הקו ,אז גם הבקשות וגם התגובות של פקטות כאלה נעטפות רק ב headerאחד
כשמחשב רוצה לשלוח מידע למחשב אחר ברשת הוא קודם כל שואל את עצמו ,״האם אני צריך
לשלוח את המידע למחשב ברשת המקומית שלי ,הוא עושה זאת באמצעות השוואת הקידומת של
כתובת ה IPשלו לכתובת ה IPשל היעד ,ככה הוא יודע האם היעד שייך לרשת המקומית (למחשבים
ברשת מקומית יש את אותה הקידומת) .אם הוא מבין שהוא צריך להעביר את המידע ברשת
המקומית הוא משתמש ב ARPכדי לקבל מידע על MACהיעד .אם היעד נמצא מחוץ לרשת יש
צורך בשכבת הערוץ כדי לעבור בין התחנות ולשם כך יש צורך להעביר את המידע בין הראוטרים
הסמוכים ולכן המחשב גם יכול להשתמש ב ARPכדי להשיג את הכתובת MACשל הראוטר
ולהעביר את המידע אליה (במקרה הפשוט יש ראוטר אחד ברשת מקומית ולכן אפשר גם להעביר את
המידע ל.)default gateway
שכבת התעבורה
שכבת התעבורה אחראית להעביר מידע מ Processל Processמרוחק .כחלק מכך ,יש לה שתי מטרות
עיקריות:
א) ריבוב מספר אפליקציות על אותה ה .end systemכלומר היכולת להשתמש בכמה שירותים של אותה
מערכת קצה (כלומר עבודה מול כתובת IPבודדת) ולהשתמש בכמה שירותים שונים של הישות ,כך שהיא
תדע להבדיל איזה זרם שייך לאיזה שירות שהיא מספקת.
אנחנו כבר יודעים איך שכבת התעבורה מאפשרת עבודה מול כמה שירותים של אותה מערכת .Ports
Portהוא מספר בטווח ] . [0, 65535על מנת שתוכנה אחת תוכל להתחבר לתוכנה מרוחקת ,עליה לדעת
על איזה Portהתוכנית מאזינה .לכן ישנם מספר פורטים מוכרים .אלו הם הפורטים ] [0, 1023וכמוסכמה
הם אמורים להיות תפוסים ,למשל פורט 80שייך לפרוטוקול . http
Connection Oriented
על מנת לתקשר עם מישהו בפרוטוקול מסוג זה ,ראשית יש להקים את הקישור (ב Socketsעושים את זה
באמצעות ) acceptלפני שמקבלים מידע .אפשר להקביל את זה לטלפון שבו צריך להתקשר למישהו
ספציפי ואי אפשר לדבר לטלפון ושמישהו יענה .פרוטוקולים כאלה מבטיחים אמינות בשליחת המידע כלומר,
שכל המידע שנשלח יגיע אל המקבל בסדר שבו הוא נשלח .
Connection Less
בפרוטוקול זה אין הבטחה שחבילה שנשלחת תגיע ליעדה והיא לא מכירה את החבילות האחרות שנשלחות
בקשורות לאותו ה .dataלכן גם אין הבטחה שהחבילות יגיעו בסדר הנכון .המסקנה מכך היא שאין צורך
להרים ולסגור חיבור כל שצריך לעשות הוא לשלוח את החבילה.
על פניו נראה שאין שום יתרון להשתמש ב Connection Lessאבל ,יש יתרון פשוט .מהירות נוכל
לממש התנהגות שלנו שתאבטח את UDPבשכבת האפליקצייה ולקבל חלק מההתנהגות הדרושה
וכך גם לצמצם את התקורה כי אנחנו מתאימים את הפרוטוקול למוצר הספציפי שלנו .זהו עקרון שדי
חוזר על עצמו בתכנות שככל שמכלילים יותר התנהגות מסוימת ככה התקורה עבורה גבוהה יותר
UDP VS TCP
הפרוטוקולים הכי נפוצים בשכבת התעבורה הם UDPו TCPוכל מהם הוא סוג אחר של חיבור עם
יתרונות וחסרונות משלו .לפני שנדבר על כל אחד בנפרד נשווה בינהם עם הפרמטרים החשובים:
UDP
פרוטוקול שאינו מבוסס קישור .לכן הוא אינו מבטיח הגעה של המידע כלל והגעה בסדר הנכון בפרט.
ב headerשל פקטת UDPיש בסך הכל את השדות הבאים:
ד -Checksum .ציינו שבעיות ברשת יכולות לגרום לחבילות לא להגיע בכלל ,או לרצף של חבילות להגיע
ברצף הלא נכון .בעיות ברשת יכולות לגרום גם לשגיאות בחבילה עצמה -כלומר שהחבילה תגיע עם תוכן
שונה ממה שהיא נשלחה .במצב שכזה נרצה שהשרת ידע שארעה שגיאה ולא יתייחס לפקטה התקולה.
Checksum
טכניקה שמאפשרת לקבוע את אמינות המידע המתקבל ומאפשר לזהות האם קרתה שגיאה (לא מזהה
את השגיאה עצמה).
השולח משתמש באלגוריתם כדי לחשב את ה Checksumשל המידע .כאשר המקבל תופס את המידע ,הוא
מחשב את ה checksumבעצמו באותו האלגוריתם ומשווה עם ה checksumשעבר .אם יש התאמה אז אין
שגיאות
במקרה של UDPהמידע מחולק לחתיכות של 16ביט .החתיכות האלה מחוברות יחדיו ,אם יש carry
מוסיפים אותו ל .sumלאחר מכן מפעילים one's complementעל הסכום ( notעל הביטים) וזה ה
.checksum
0110011001100000
0101010101010101
1000111100001100
0110011001100000
+
0101010101010101
− − − − − − − − −−
1011101110110101
+
1000111100001100
− − − − − − − − −−
0100101011000001
0100101011000001 + 1 = 0100101011000010
בצד המקבל נעשה את אותו חישוב של הסכימה ,לבסוף נסכום עם ה checksumשהעברנו ואם הסכום יוצא
שכל הביטים הם 1סימן שהמידע אמין .אם אחד הביטים הוא 0סימן שישנו שיבוש במידע.
Warning
ברגע שהשגיאה היא יותר מ bitאחד יש מצב שה checksumיצא אותו דבר למרות שהייתה שגיאה.
כמו כן יכול להיות שגיאה ב checksumעצמו..
TCP
פרוטוקול שכבת התעבורה הנפוץ ביותר לחיבורים מבוססי קישור.
כאשר בשכבת האפליקציה נרצה להעביר מידע באמצעות ,tcpאנחנו לא יכולים פשוט לשלוח חבילה אל
תוכנה מרוחקת .ראשית עלינו ליצור קישור עם התוכנה המרוחקת ועתה כל חבילה שנשלח תהיה חלק
מאותו קישור.
TCPתוכנן ועוצב לרוץ מעל שכבת רשת שאינה אמינה .כלומר ,הנחת הבסיס היא שבשכבת הרשת
חבילות יכולות ללכת לאיבוד או להגיע בסדר לא נכון.
כיצד ניתן לוודא שהמידע מגיע אל היעד? וכיצד ניתן לוודא שהוא מגיע
בסדר הנכון?
על מנת לעשות זאת TCP ,מנצל את העובדה שהוא פרוטוקול מבוסס קישור .מכיוון שכל החבילות
(בשכבת התעבורה )segmentהן חלק מקישור ,אנו יכולים לבצוע דברים רבים.
ראשית ,אנו יכולים לתת מספר סידורים לחבילות שלנו .נאמר שבשכבת האפליקציה רצינו לשלוח את
המידע " "Hello Cool Networkוהחלוקה לחבילות הוא חבילה פר מילה.
בצד שרת חבילות יכולות ליפות ונניח שחבילה 2נפלה בדרך .בשיטה שלנו השרת יבין שחסרה לו חתיכה
מספר .2
ניתן להשתמש במספרי החבילות כדי לוודא שחבילה אכן הגיעה ליעדה .כך למשל ,ניתן להחליט שעל כל
חבילה שהגיעה ,השרת שולח אישור ללקוח .חבילה כזו נקראת בדרך כלל ACKומשמעותה ״קיבלתי את
החבילה״ .הלקוח יצפה לקבל ACKעל כל חבילה אותה הוא שולח.
בצד לקוח ,אם לא התקבלה חבילת ACKמהשרת לאחר זמן מסוים ,כנראה שהחבילה שהוא שלח ״נפלה״
ובמקרה כזה היא תשלח שוב
באופן הזה הצלחנו להבטיח שהחבילות אכן הגיעו ליעדן .השימוש במספר סידורי לכל חבילה מאפשר לנו
להתמודד עם הבעיה של סדר הגעת החבילות.
המימוש ב TCP
ה headersב TCPמכיל את אותם השדות של UDPושדות נוספים ,ההבדל הוא שבמקום lengthיש
head-lengthשמייצג רק את הגודל של ה.header
באמצעות ה checksumאפשר לגלות שגיאות ,אך אם נגלה שגיאה ב UDPהוא פשוט יזניח את הפקטה,
כאן צריך להשתמש במנגנון ה ACKכדי לאשר שאכן המידע הגיע תקין או NAKכדי להודיע שהמידע
הגיע לא תקין .בגלל שגם ACK/NAKיכול להשתבש בגלל שגיאות אנחנו נכניס אותו כ header TCP
מלא בתשובה ונניח שה checksumיכול לתפוס את זה( .זה במקום לשלוח פשוט .)ACK bit
הפרוטוקול TCPלא נותן מספר סידורי לכל חבילה ,אלא לכל .byteכזכור ,אנחנו מעבירים מצד לצד רצף
של בתים .לכל אחד מהבתים ברצף יש מספר סידורי משלו .בכל חבילה שנשלח ,יהיה המספר הסידורי
שמציין את הבית הנוכחי בחבילה.
כאשר התו האחרון הוא הרווח 100, 101, 102, 103, 104, 105 המחרוזת H elloתוקבל למספרים הסידוריים
שכן המחרוזת הנ״ל היא חלק ממשפט שלם.
החבילה השנייה התחילה עם המספר הסידורי .106המשמעות של כך היא שהבית הראשון שבה כלומר
התו cהוא בעל המספר הסידורי .106כלומר המשך התקשורת ייראה כך :
נשים לב שמדובר בתקשורת בין הלקוח לשרת בדוגמה ,אך באותו אופן זה יכול להיות בין שרת
ללקוח.
נסתכל על דוגמה שבה ה clientרוצה לשלוח שתי הודעות מופרדות הראשונה היא Helloוהשנייה היא
.World
ה clientשולח את ההודעה הראשונה לשרת ומחכה ל . ackרק אחרי שהוא מקבל את ה ackהוא יעביר את
ההודעה הבאה.
המנגנון הזה נקרא Stop & Waitכלומר אם התקבל nakנשלח שוב את הפקטה שעבורה התקבל .nak
נשים לב שהשרת שולח כ responseאת ה tcp headerבלי .data
בצורה זו קל מאוד לבצע מעקב אחרי התקשורת .מכיוון שה ACKמכיל את המספר הסידורי הבא ,הרי
שזה יהיה המספר הסידורי שיישלח בחבילת המידע הבאה .כך בדוגמה זו ,רצף החבילות יראה כך:
בנוסף ,כאשר נשלח ACKב ,TCPהכוונה היא שכל המידע שהגיע עד לבית שמצוין ב ACKהגיע באופן
תקין .כך לדוגמה ,במקרה לעיל השרת יכול היה לא לשלוח ACKעבור החבילה שכללה את המידע Hello
אלא רק לאחר קבלת החבילה שכללה את המידע .coolבמקרה זה ,ערך ה ACKצריך להיות המספר
הסידורי הבא .110 -
לאחר שליחת החבילות שלו ,הלקוח מחכה לזמן מסוים לקבלת ה .ACKאם ה ACKלא הגיע עד לתום
הזמן .הוא שולח אותן מחדש.
TCP Segmentation
כפי שהסברנו TCP ,מחלק את המידע לפי .bytesבפועל הוא מבצע סגמנצייה שגודל של כל סגמנט הוא
.MSSזה הגודל המקסימלי של מידע עבור שכבת האפליקציה שיכול להיות בתוך פקטה ,כך ש כאשר
מוסיפים את כל ה headersהדרושים האורך הכולל הוא לכל היותר MTUשזה אומר maximum-
,transmission unitבערך 1500בתים.
בדוגמה אפשר לראות ששלחנו בשכבת האפליקציה 7000בתים של מידע .כמובן שלשכבת האפליקציה לא
אכפת מגודל המידע .בשכבת התעבורה tcpמחלק את המידע ל 7חתיכות של 1000בתים .נשים לב ש
UDPהיה מאציל את הדרישה הזאת לחלוקה עבור שכבת הרשת .אם כן TCP ,מחזיר באפר ששומר את
המידע ומחלק אותו ל segmentsשאת כל אלה עוטף ב headersומעביר לשכבת הרשת.
כאשר שכבת האפליקציה שולחת 3פעמים , dataהפרוטוקול , TCPמשתמש באותו הבאפר כדי לחלק
את ה dataבבאפר הזה ,יכול להיות מצב ש segmentאחד מקבל חלקים משני סוגי dataאחרים
שנשלחו.
הרציונל הוא שהמידע נשמר ב bufferעד שמתקבל בחזרה ACKואז אפשר לשחרר את הזכרון ולהשתמש
בו למשהו אחר.
לשם כך ,משתמשים ב headersשהסברנו עליהם למעלה.seq num, ack num .
נתבונן על דוגמה מפורטת יותר מההסבר הנ״ל על echo tcp serverונסביר אותה
ראשית נשים לב שבפועל כל אפליקצייה שמתקשרת באמצעות TCPמחזירה Send bufferו Receive
.bufferהראשון הוא המידע שנשלח ואיזה מידע קיבל כבר .ACKהשני הוא עבור מידע שהתקבל ואיזה
מהם דווח עליו .ACK
B כאשר Aשולח את התו Cהוא מדווח גם את המספרים seq=42וגם .ack=79הוא בעצם אומר ל
שהוא עכשיו מדווח על הבית עם המספר הסידורי 42וגם הוא מדווח ל Bשהוא כבר דיווח ackעד הבית
ה.79
ברגע ש Bמקבל את התו ,הוא שומר אותו receive bufferוכעת מדווח ackעל הביט ה 43כמו כן הוא
שולח לו בחזרה את התו כי זה שרת אקו ומוסיף אותו ב send bufferאבל המספר הסידורי של Cב באפר
הזה הוא 79ולכן ,seq = 79כלומר הוא מדווח שהוא שולח את הבית עם המספר הסידורי .79
ניתן בעצם להבין את הסנכרון שיש פה בין ACKלבין , seqהם בעצם נועדו לתת דיווח מהצורה
״מהו המזהה הבא של הבית הראשון שאני אמור לקבל ממך״ .
Info
נשים לב שבסוף נשלח רק מידע של שכבת התעבורה בלי dataכי אין עוד dataלשלוח.
Packet timeout
כפי שאמרנו יכול להיות מצב שחבילה הלכה לאיבוד .כדי לזהות מצב כזה יש צורך במנגנון מבוסס timer
כדי לקבוע שאם פקטה לא הגיעה בזמן הזה יש לשלוח אותה שוב.
לשם כך tcpרוצה לקבוע זמן שגבוה מ ) RTT(Round Trip Timeאבל זה זמן שמשתנה מפקטה
לפקטה.
כצירי זמן של כל אחד מהמכשירים. A, B נסתכל על
ב .השהיית התפשטות ,כמה זמן לכל לביט בודד להתפשט על גבי הערוץ ,לעבור את המרחק ממחשב א׳
למחשב ב׳ .אפשר להסתכל על ביט בודד בגלל שההתפשטות נעשת בצורה מקבילית .החישוב של זה
יעשה בעקבות כך ,לפי זמן ההתפשטות של הביט האחרון .כלומר פשוט נמדוד כמה זמן לקח לביט האחרון
להיקלט במחשב השני.
ג .השהיית השידור של ה( ACKבשרטוט זה בנקודה קטנה בגלל שזה זמן יחסית קטן ביחד לביטי המידע)
סה״כ:
RT T = dt + dp
יש צורך לבצע שערוך של ה RTTכדי לדעת לאמוד את זמן ה .timeoutשכן על כל פקטה צריך לבצע
שערוך ל RTTהנ״ל לפני שהמידע על ה RTTהתקבל בפועל .נסמן SampleRT Tכ RT Tהאחרון
שנדגמה .נרצה לבצע ממוצע של מספר דגימות כאלה ולבצע שערוך.
נגדיר :
בעצם מדובר פה במעין ממוצע משוקלל ,שככל ש αיותר נמוך ככה נותנים יותר משקל להערכות הקודמות.
בדרך כלל . α = 0.125כמובן ש (1 − α) ⋅ EstimatedRT Tמייצג את ההערכה הקודמת כפול המשקל
שנותנים לה.
ֿ
ההשפעה של SampleRTTיורדת מדגימה לדגימה ,כלומר הנוסחה הזאת לאט לאט משפרת באופן
אקספוננציאלי את ה .EstimatedRTTהרשת היא תנודתית מאוד ולכן ה smoothingהזה הוא מאוד
חשוב .בגרף ניתן לראות שאין תנודתיות כזאת ב EstimatedRTTוזה טוב לנו כי זה אומר שאנחנו
שומרים על הממוצע המשוקלל בערך מדגימה לדגימה.
בגלל שהסטיות האלה גדולות מאוד נרצה לצמצם את ההפרשים האלה באמצעות חישוב הסטייה/שונות של
הממוצע שלנו .הנוסחה תייצג את הסטייה בין המדידה להערכה בכל פעם.
ההפרש מייצג את ההפרש הנוכחי והסטייה בנוסחה היא הסטייה הקודמת שנמדדה .ככל שהרשת יציבה
יותר ככה הסטייה נמוכה יותר ואם הרשת אינה יציבה אז נשתמש בסטייה כדי לתקן את ה timeoutכפי
שתיכף נראה .בד״כ . β = 0.25
בשיטת Store and forwardיש מצב של חוסר יעילות בגלל .under utilization
הפתרון של זה הוא להשתמש pipeliningשמאפשר לנו לשלוח מספר חבילות במקביל .זאת שיטה מאוד
נפוצה שנפוצה מאוד במבנה מחשב ובאופטימיזציה שאילות במסדי נתונים .השיטה מאפשרת באמצעות
חלוקה של החבילה מראש לחבילות קטנות יותר ,לחסוך זמן רב כי הראוטר לא יצטרך לחכות לכל החבילה
הגדולה אלא רק לחלק קטן שלה .מה שיאפשר לשלוח את החבילה ב״מקביל״.
חשוב לשים לב שהראוטרים עצמם עדיין עובדים בשיטת ,Store and Forwardאבל העובדה
שאנחנו מחלקים את הפקטות לפקטות קטנות יותר היא זאת שמאפשר את המקביליות
Pipeline
לאחר שהחבילה הראשונה הגיעה אל הראוטר ,חבילות אחרות נשלחות בשני הערוצים במקביל.
המשמעות היא שלא צריך לספור את הזמן ההתפשטות והשידור בין השרת לראוטר ובין הראוטר לשרת
בנפרד שכן ,אלו מתרחשים במקביל בשיטת .pipeline
בתמונה הנ״ל ,זמן השידור של חבילה 2בין השרת לנתב מתרחש במקביל לזמן ההתפשטות של חבילה 1
בין בשרת לנתב .זמן השידור של חבילה 1בין הנתב ללקוח מתרחש במקביל לשידור של חבילות בערוץ בין
השרת לנתב וכו׳ .זאת בניגוד לשיטה של store and forwardשבה היינו חייבים להמתין לביט האחרון
שיגיע לראוטר .
המימוש:
נגדיר windowלהיות מספר החבילות שאפשר לשלוח לפני שמקבלים ACKעל אחת מהן.
ברגע שמקבלים ACKעל החבילה הראשונה אפשר לשלוח את החבילה הראשונה בשלישייה הבאה.
Warning
הפתרון הזה מייצר לנו בעיה חדשה ,כעת אם חבילה נופלת ולא מגיעה ,יש צורך גם לעדכן איזה
חבילה נפלה בדרך (בניגוד ל hold and waitשתמיד ידענו איזה חבילה הלכה לאיבוד בגלל שתמיד
יש אחת בתנועה ויש עליה .)timeout
ננסה לפתור את הבעיה אך ראשית נבין קצת יותר טוב את מנגנון ה :Slide Window
על כל פקטה בבאפר (בין אם זה ה send bufferובין אם זה ה )receive bufferנשמור את אחד מהstates
הבאים
א .האם היא ACKed
ב .האם היא נשלחה ועדיין לא קיבלה .ACK
ג .האם היא ניתנת לשליחה
ד .לא ניתנת לשליחה כרגע.
הפרמטרים הללו נקבעים לפי ה window sizeוהבאפרים עליהם דיברנו מקודם .ברגע שפקטה אחת מגיעה
ומדווח עליה ACKהחלון יזוז ימינה:
GBN
אחת השיטות לטיפול בבעיה ,היא שיטת .Go Back Nבשיטה זאת אנחנו עובדים כפי שתיארנו למעלה.
בשיטה זאת נניח שהחלון הוא בגודל Nאם אחת הפקטות הלכה לאיבוד ,נניח הפקטה ה , iאז כשהפקטה
ה i + 1תתקבל בצד המקבל ,הוא יזניח אותה וישלח ACKעל הפקטה האחרונה שאנחנו יודעים שהגיעה
לפי הסדר .במצב זה מקבלים duplicate ACKוה windowלא יזוז..
המשמעות של זה היא שעד שה timeoutעל החבילה ה iיתקבל נצטרך להזניח את כל החבילות הבאות
בחלון כלומר Nחבילות ורק אחרי שה timeoutיקרה נשלח את הפקטה iשוב ונתחיל את הרצף מהתחלה.
Selective Repeat
מרוקנים את המערך.
Warning
חשוב לשמור על יחס של קטן ממש בין ה window sizeל seq numbersשכן ,כיוון שה seqהוא
מספר סופי וחסום בגודל של 32בתים ,אם ה dataשאנחנו נרצה לשלוח גדול מזה ,יהיה wrap
aroundשל ה .seq numberלמשל ,אם ] seq = [0, 3וה dataהוא בגודל 6בתים ,אז הסדר של
המזהים של הבתים יהיה מהצורה . 0, 1, 2, 3, 0, 1, 2במצב זה ,אם ה windowגדול מדי יכול להווצר
מצב שבו המידע התקבל בצד המקבל אבל ה ACKלא הגיע לשולח ובמצב זה הוא ישלח בית
שהתקבל עם אותו seq numberכמו הבית החדש שהצד המקבל ממתין לו .הפתרון של זה הוא
לשמור על size(window) ≤ max(seqN umbers)/2
TCP Headers
כפי שניתן לראות ,במהלך הרמת הקישור נשלחות שלוש חבילות ,בכל אחת מהן גם יש שימוש ב ackו
.seq
SYN
בשלב הראשון ,הלקוח שולח לשרת חבילה שמטרתה להתחיל את הקמת הקישור .על ידי הדלקת הheader
: SYNהלקוח מעיד על כוונתו לפתוח קישור .ה seqהמצורף נקרא ISN- initial sequence numberוהוא
נבחר באופן רנדומלי כדי למנוע התנגשויות של חיבורים ,אם כל החיבורים היו מתחילים אם מזהה 0למשל,
אז אם חיבור כלשהו ייפול תוך כדי שפקטה עם מספר סידורי כלשהו תהיה בדרך היא עלולה להגיע לחיבור
אחר שיוקם תוך כדי וגם הוא יהיה עם המזהה .0כדי למנוע מקרים כאלו מתקבל מספר רנדומלי כ.ISN
SYN+ACK
בשלב זה ,אם השרת הסכים לקישור הראשוני הוא עונה בחבילה בה דלוקים שני הדגלים SYN :ו .ACK
הדגל SYNדלוק כי זאת חבילה שמובילה על הקמת הקישור .הדגל ACKדלוק מכיוון שהשרת מודיע
ללקוח שהוא קיבל את החבילה הקודמת שהוא שלח ,שהיא חבילת ה .SYN
ה seqשל החבילה של השרת יהיה ISNשל התקשורת בינו לבין הלקוח וגם הוא ייבחר באופן אקראי .זאת
כמובן שתקשורת היא דו כיוונית ונעשת בשני Streamsשל מידע ,רצף בתים ללקוח ורצף בתים לשרת.
לסיום על השרת לציין את מספר ה ACKכדי להודיע ללקוח שהוא קיבל את החבילה שלו ,כפי שהוא עושה
גם במצב רגיל .כלומר הערך של ה ACKיהיה לפי הבית הבא שהשרת מצפה לקבל מהלקוח שבמקרה
הזה הוא ( 1כי זה מה שהתקבל מהדגל )SYNבתוספת הערך הראשוני של seqנסמנו xולכן
. ACK = x + 1
ACK
על מנת שהחיבור יוקם בהצלחה הלקוח צריך לדווח לשרת שהחבילה SYN+ACKהתקבלה בהצלחה
וששני הצדדים מסונכרנים על המספרים הסידוריים הראשוניים אחד של השני.
כדי לבצע זאת ,הלקוח שולח חבילה כשדגל ה ACKדולק ,ומספר ה ACKמציין את הבית הבא שהוא
מצפה לקבל מהשרת .כלומר המספר הסידורי ( 1 +בידיוק כמו מקודם) .הפעם הדגל SYNכבוי ,שכן זו
כבר לא החבילה הראשונה שנשלחת מהלקוח לשרת בקישור הנוכחי .כמו כן ה seqשל החבילה הנשלחת
יהיה הערך שהיה ב ackבחבילה שהתקבלה מהשרת..
סך הכל אם נתאר את כל התהליך מהתחלה עד לסיום זה יראה כמו בדיאגרמה הבאה:
ישלח דלוק עם seq number F IN כאשר נרצה לסגור את החיבור באמצעות socket.closeהדגל
רלוונטי לפי הפעולות שהתבצעו קודם לכן.
TCP Retransmission
ישנם כל מיני מקרי קצה ש TCPצריך להתמודד איתם כדי שיתאפשר לשלוח את המידע לפי הסדר .כך
למשל יכול להיות מצב שהמידע ממחשב א׳ יגיע למחשב ב׳ אבל ה ACKעבור המידע זה יפול בדרך ונקבל
.Timeoutבמצב זה אנחנו יודעים שמחשב א׳ שולח שוב את המידע בציפייה לקבל את ה ACKלמרות
שמחשב ב׳ כבר קיבל אותו ודיווח (כאן נכנס לתמונה ה SEQשמאפשר לצד המקבל לדעת שהוא לא קיבל
מידע חדש).
נשים לב שאם נפל ה ACKולפני שהתקבל TIMEOUTעל החבילה כבר נשלח ACKעל החבילה הבאה
(כי עובדים בשיטת )Pipelineאז בגלל שה ACKהוא מצטבר המחשב השולח ידע שהוא לא צריך לשלוח
את החבילה שוב ויכול לשלוח את החבילה הבאה.
תרחיש נוסף שיכול לקרות הוא שהשערוך Timeoutהיה נמוך מדי ולכן יתקבל timeoutעל חבילה לפני
שה ACKעליה נשלח .במצב זה שוב פעם נשלח את החבילה פעם נוספת ,אבל ,בגלל ש ACKכפי
שאמרנו הוא ערך מצטבר ולא פר חבילה אנחנו פשוט נשלח את ה ACKעם הערך הרלוונטי שוב.
נשים לב שהצד השולח שומר את ה ACKשהוא קיבל עד לרגע הנוכחי במשתנה .SendBase
ACK Events
TCPשואף לשלוח כמה שיותר חבילות מידע ולצמצם את חבילות ה . ACKבמצב זה TCPמשתמש
בכמה מנגנונים לפי המאורעות השונים שנמצאים בצד המקבל של המידע.
למשל:
א) אם המידע מגיע כמו שצריך לצד השולח TCPמשתמש במנגנון של delayעל .ACKכלומר הוא מחכה
ורק אם במהלך הדיליי לא התקבל שום חבילה חדשה הוא שולח את אותו .ACK
ב) במידה והגיעה חבילה חדשה בזמן הזה הוא מגיע לאירוע 2בטבלה למטה ושולח את ה ACKהמצטבר
עבור שניהם.
ג) אם יש מצב שבו מגיע מידע עם seqשלא תואם את המספר seqשהצד המקבל מצפה לו הוא ישלח
ACKנוסף (לא מצטבר) עבור הפקטה הרלוונטית האחרונה שנשלחה לפי הסדר.
ד) המאורע האחרון שמצוין בטבלה הוא כאשר מגיעה חבילה שסוגרת איזשהו חור שנוצר בין ה seqשל
החבילות השונות שהתקבלו .במצב זה שולחים ACKעל המספר הכי נמוך שממנו יש חור ואם אין כזה
שולחים ACKעל מספר הבתים שהתקבלו עד כה.
TCP Fast Retransmit
זה מנגנון שנועד להעריך שחבילה הלכה לאיבוד לפני שהתקבל עליה .Timeoutהמנגנון משתמש בטכניקת
ה duplicate ACKשציינו מקודם .במצב שבו מגיעות יותר מ 3חבילות שהן out of orderבגלל חבילה
ספציפית אז TCPמיד ישלח אותה שוב ולא יחכה ל .timeoutכפי שאמרנו אנחנו שולחים ackכפול
ומצפים לקבל את החבילה אבל חבילות אחרות מתקבלות והיא עדיין לא מגיעה.
TCP Flow Control
עד כה התייחסנו ל windowכגודל סטטי שלא יכול להשתנות.
החלונות השונים ש TCPמנהל ,בפועל הם דינמיים וגודלם משתנה בהתאם לתקשורת.
זה אומר שההפרש בין המצביעים הוא בידיוק כגודל הפנוי של הבאפר.
Congestion Control
חלון בקרת הרשת נועד לטפל במצבים שבהם יש עומס על הרשת בכמות המידע ובמהירות שבו הוא נשלח.
מצב כזה שלא יטופל עלול לגרום לנפילת פקטות ולזמני שהייה ארוכים כדי לצאת מהתור של הראוטר
slow start
כאשר החיבור מתחיל ,נגדיר באופן מעריכי את קצב שליחת הפקטות עד שנקבל מאורע של איבוד מידע.
AIMD
Additive Increase Multiplicative Decreaseהוא מנגנון למניעת עומס כאשר עובדים בשיטה הקודמת.
השיטה הזאת עובדת בהגדלה ליניארית של ב .cwndכלומר במקום להגדיל ב 1את החלון כל ACK
שמתקבל מה שיגרום לכך שבכל RTTנגדיר את החלון בגודל אקספוננציאלי ביחס להגדלה הקודמת.
הפעם מגדילים ב 1לכל RTTבלבד .למשל אם ה RTTהוא 1msאז כל פרק זמן זה נגדיל את החלון ב1
את המנגנון הזה עושים עד שמזהים איבוד מידע .ברגע שמזהים אבדה מקטינים בחצי את ה .cwnd
המעבר בין slow startל AIMDנעשה באמצעות פרמטר שנקרא:
.SST- Slow Start Thresholdכאשר כמות הפקטות שאפשר לשלוח ברגע נתון מגיעה לערך של הSST
נעבור ל .AIMD
ב) אם האובדן הוא כתוצאה מ Timeoutההתנהגות היה כמו בסעיף א .אם האובדן הוא במצב של ACK
כפול אז נקטין גם את ה cwndוגם את ה sstלהיות חצי מ .cwndוממשיכים לעבור ב .AIMDבגדרת
TCP Renoעובדים בשיטה הזו.
Fast Recovery
המנגנון הזה נועד למנוע מצב שאין חבילות באוויר כי מחכים ליותר מדי ACKכפולים.
מצב זה יכול לקרות אם החבילה הראשונה מבין כל החבילות שיכלנו לשלוח בהתאם ל cwndהלכה לאיבוד.
זה אומר שעל כל החבילות הבאות אנחנו אמורים לקבל ACKכפול על החבילה הזאת .כפי שאמרנו
בחבילה השלישית אנחנו מקטינים את החלון בחצי וכעת צריך לחכות ל ACKהמצטבר על כל החבילות כדי
להמשיך לשלוח חבילות חדשות Fast Recovery .מונע את זה בשיטה פשוטה :על כל ACKכפול הוא
מגדיל את ה cwndבאחד .כלומר אם התקבלו ACK 3כפולים אנחנו נקטין את החלון בחצי כפי שאמרנו
ונוסיף לו .3על כל ACKכפול נוסף נגדיר ב 1את החלון .הרעיון פה הוא שאנחנו כבר יודעים שנקבל ACK
כפולים למרות ששלחנו כבר את החבילה ברגע שהגיעו רק 3ושאין צורך לחכות לכולם כדי להמשיך לשלוח
סגמנטים חדשים.
דוגמאות
תחת ההנחה שאין fast recoveryנרצה למצוא את פרקי הזמן שבהם TCPנמצא ב slow startוב
congestion avoidance
נשים לב שיש שני צירי xשאחד מהם זה הסיבובי שליחה והשני זה ה( cwnd sizeמציג בצורה מדויקת את
ציר ה )y
קל לראות זאת פשוט מחפשים היכן הגידול הוא מעריכי והיכן הגידול הוא ליניארי .לפי ציר הזמן זה בעצם
מ 1 − 6ומ 23 − 26מדובר ב ssוב 6 − 16וגם 17 − 22מדובר ב .caכמו כן אפשר לראות שהאובדן
בסיבוב 16מתרחש בגלל ack 3כפולים והאובדן בסיבוב 23קרה בגלל .timeout
נתונים נוספים שאפשר להוציא מהגרף הוא שערך ה ttsההתחלתי הוא , 32בסיבוב מספר 18ערכו הוא
21והחל מסיבוב 23ערכו הוא .13
השהיות
אחת הדרכים להשוות בין פרוטוקולים של שכבת התעבורה היא מדידה של זמנים כאשר מריצים את אותם
התרחישים בשני הפרוטוקולים ומדידת הזמן שעבר בכל פרוטוקול.
לשם כך ,צריך להגדיר איך מחשבים זמנים בפרוטוקול תקשורת וננסה להבין מה ״מעכב״ חבילה בדרך אל
היעד.
מתקיים:
dכאשר Lזה כמות הביטים ו Rזה קצב השידור בשנייה. = )aהשהיית השידור היא
tran
L
R
s
-כמה זמן לוקח לביט בודד לעבור מרחק של dמטרים בקצב התפשטות של sמטרים בשנייה.
d )cהיא השהיית התור q
-כמה זמן חבילה ממתינה בתור לפני שהיא משודרת הלאה .נשים לב שהשהייה זו היא פונקציה של קצב
השידור של הנתב אל הערוץ וכמות החבילות בתור.
dהיא השהיית העיבוד )d proc
תזכורת
1B = 8b
3
1KB = 10 B
6
1M B = 10 B
9
1GB = 10 B
שאלה 1
לקוח הממוקם בניו יורק ניגש לשרת הממוקם בלונדון כדי להוריד קובץ .נתון שהמרחק מהלקוח לשרת הוא
, 2500KMקצב ההתפשטות הוא , 250, 000km/sקצב השידור הוא 8M bpsוגודל הקובץ הוא .1M B
כמה זמן יקח להעביר את הקובץ מהשרת ללקוח ,בהנחה שאין עוד תעבורה ורשת ואין השהיית עיבוד
.d כלומר = d = 0 proc q
,עם הנתונים שחישבנו נוכל לקבל אותם : dE2E = dt + dp אם כן ,מתקיים ש
6
= dp
d
s
=
2500
250,000
= 0.01sec כמו כן מתקיים ש = dt
L
R
=
1M B
8M bs
=
8⋅10 b
6
8⋅10 b
= 1sec
.dנשים לב שחשוב להמיר את היחידות מידה כפי שעשינו ,כי סך הכל נקבל = 0.01 + 1 = 1.01s
E2E
בדוגמה שלנו מדובר ב byte per secondאל מול .bits per seconds
נניח כי הראוטר עובד בשיטת store and forwardכלומר רק כאשר הביט האחרון מגיע לראוטר הוא שולח
אותו ללקוח.
ברגע שמבינים כיצד הנוסחה השתנתה העבודה היא בידיוק כמו בשאלה הקודמת ,הצבה בנוסחה וחישוב
d 5000km
= dpropS→R = = 0.02sec
km
s 250, 000
s
6
L 1M B 8 ⋅ 10 b
= dtransR→C = = = 10sec
kb 3 b
R 800 800 ⋅ 10
s s
. dכאשר:E2E
במצב זה מתקיים = d + d + d
1 2 3
d )aסך כל ההשהיות שלוקח לחבילה הראשונה עד שהיא מגיעה לערוץ האיטי ביותר. 1
נסתכל על הדוגמה למעלה שבה רוצים להעביר פקטה בשיטת pipelineשמחלקת את הפקטות ל 4פקטות
קטנות.
להגיע לראוטר בשידור 0.5secבשלב הראשון אפשר לראות שאנחנו שולחים את הפקטות ולכל אחת לוקח
ובהתפשטות של 1secכלומר הביט האחרון של פקטה יוצא אחרי שניה אחת.
נשים לב שבשידור השלישי יהיה לנו צוואר בקבוק שכן ,זמן השידור שם איטי יותר ולכן פקטות אחרות
יצטרכו לחכות ברגע שהן מגיעות עד שהן יוכלו לצאת.
נשים לב שהיכן שהשהיית השידור איטית ביותר ,הזמן של כל השידורים האחרים נכלל בתוכו
בשלב האחרון אפשר לראות שלמרות שהרמה שם מהירה יותר מהקודמת עדיין קצת השידור הוא כמו של
קצב השידור האיטי ביותר .לכן ברמה האחרונה הדבר היחיד שקובע זה הזמן שלקח לפקטה האחרונה
להגיע.
שאלה 3
נחשב כמה זמן לקח לחבילה הראשונה עד שהגיעה לערוץ האיטי ביותר,
נקבל ש
4 6
8⋅10 5⋅10 −2
= dt + dp 6
+ 8
= 3 ⋅ 10 sec
8⋅10 2.5⋅10
4
8⋅10
5
= 10sec כעת ,נחשב כמה זמן לוקח לשדר את כל החבילות בערוץ הכי איטי
לסיום ,נחשב את ההתפשטות של חבילה בודדת בערוץ האיטי
5
2.5⋅10 −3
= dp 8
= 10 sec
2.5⋅10
10sec .נשים לב שלא חסכנו הרבה זמן בגלל הערוץ האיטי שהוסיף לנו 10.031 נסכום ונקבל
Info
לכאורה כדאי פשוט לשלוח את המידע בחבילות בגודל של ביט בודד כי אנחנו נדרשים לחכות פחות
עבור הפקטה הראשונה ,כלומר ככל שיש יותר פקטות קטנות נראה כי הקנס על התעבורה עד לטווח
האיטי קטנה משמעותית
אבל זה לא באמת המצב ,מהסיבה השפוטה שלכל פקטה ששולחים מתווספים headersוהמחיר של
זה יכול להיות כבד בהתאם לגודל ה .headerלמשל אם חילקנו ל 100חבילות בפועל אנחנו מחשבים
את זמן השידור של 101חבילות כי מסתכלים על זמן השידור של החבילה הראשונה עד שהיא מגיעה
לערוץ האיטי ביותר ואז מסתכלים על כל החבילות בערוץ האיטי ביותר .אם נגדיר שלכל חבילה כזאת
יש גם headerבגודל 40Bנקבל שכאשר נוסיף את זמן השידור של התחיליות עצמן בנוסף למה
⋅ 1אם מוסיפים את ה 40מילישניות האלה שחישבנו נקבל = 40.04ms :
40B 40B
⋅ + 100 6 5
8⋅10 bps 8⋅10 bps
10000 נקבל 10.07104זמן שלא משנה בצורה חסרת תקדים את הזמן הקודם .אבל אם נחלק ל
חבילות נקבל שהתקורה על העברת התחיליות הוא 4.00004sשזה זמן משמעותי מאוד ונקבל זמן
גדול בהרבה (באזור .)14
השהיית תור
צריכה לחכות שכל החבילות שלפניה ישודרו כלומר: A החבילה שהגיעה מ
3
3.5 ⋅ 10 B
= dq = 0.028sec
6
10 bps
כלומר אנחנו יודעים בקלות לחשב השהיית תור לפקטה מסוימת ,רק צריך לחשב את זמן השידור של
הפקטות שנמצאות לפניה בתור.
נרצה להבין כמה זמן לוקח עד ששני הקבצים מגיעים וגם מהו גודל התור המינימלי כדי שלא יאבדו חבילות.
10M b
10KB
ראשית נבין מהו המספר המינימלי של חבילות שיש לשלוח:
= 1250
נשים לב שמשך הזמן הכולל הוא החל מתחילת שידור החבילה הראשונה (שני המחשבים מתחילים באותו
זמן) ועד שהחבילה האחרונה מגיעה ל .Dהזמן שלוקח לשדר חבילה אחת :
3
L 1KB 8⋅10 b
= dt = = 7
= 0.0008sec
R 10M bps 10 bps
סך הכל אנחנו נשדר מ Cל Dבידיוק 2501חבילות כי יש את התקורה של החבילה הראשונה שאמורה
להגיע לנתב לפני שהוא מתחיל לשדר .כמו כן יש לקחת בחשבון את 2השהיות ההתפשטות גם של
החבילה הראשונה עד שהיא מגיע לנתב וגם של החבילה האחרונה עד שהיא מגיע ל .Dסך הכל
−3
dE2E = 2501dt + 2dp = 2501 ⋅ 0.0008 + 2 ⋅ 10 = 2.0028s
Packet Fragmentation
כאשר חבילה מגיעה לרכיב תקשורת והיא גדולה מדי עבור הערוץ שאנחנו צריכים להעביר אותו אליה,
אנחנו מבצעים פרגמנטציה .כלומר ,מחלקים את החבילה לתתי חבילות בכדי שיוכלו לעבור בערוץ הצר
יותר .נשים לב ,פרגמנטציה יכולה להתבצע הרבה פעמים לאורך המסלול אבל הרכבה מתבצעת אך ורק
אצל הצד המקבל.
TCPמנסה להמנע מפרגמנטציה על ידי סגמנטציה .עם זאת UDP ,למשל ,חשוף לפרגמנטציה.
יש לנו datagramבשכבת הרשת בגודל 4000בתים ,אם נוריד את ה headerזה יוצא 3980בתים .ה
MTUהוא 1500בתים ואם נוריד את ה ip headerזה אומר שבפרגמנטצייה נוכל להעביר כל פעם מידע
בגודל .1480
ההרכבה של הפרגמנטים נעשים לפי ה offsetבשכבת הרשת במכשיר היעד הסופי ,רק אם כולם הגיעו זה
זה בונה את המידע ומעביר את זה לשכבת התעבורה.
נסביר את הדגלים:
- fragFlagדגל שקובע שיש עוד פרגמנטים אחריי לפי סדר החלוקה ולא סדר ההגעה.
הפעולה הזאת מבוצעת ב ,Network Layerהפרגמנטציה נעשית בעקבות datagram sizeשגדול יותר מה
MTUשל הערוץ שבו המידע אמור לעבור .שכבת התעבורה מנסה לטפל בזה (לפחות אם משתמשים ב
,)TCPלכן חשוב להכיר את התהליך הזה כבר בשכבה הזו.
ניתן לראות בתמונה שבעצם מתבצע שכפול של כלל ה headersלתתי הפקטת .כמו כן ניתן לראות שיש
payloadשמתווסף ל headersכתוצאה מהחלוקה הזאת .למשל offsetשל המידע fragflagשקובע האם יש
עוד פרגמנטים בדרך.
TCPמנסה להמנע מפרגמנטציה לאורך המסלול באמצעות Path MTU Discoveryשעובד בצורה הבאה:
א) שולחים חבילה ,ע״פ מגבלות הגודל הידועות ,כאשר הדגל Dont fragmentדולק.
ב) כאשר החבילה תגיע לערוץ בו ה MTUקטן מהחבילה ,במקום פרגמנטציה ,תשלח בחזרה הודעת
הודעת שגיאה בעזרת הפרוטוקול ICMPשאומרת שהחבילה גדולה מדי ,ומה צריך להיות גודל החבילה
המקס׳.
ג) השולח יעדכן בהתאם את גודל ה MSSוה MTUוישלח בהתאם.
ד) במידה וגודל זה עדיין גדול מדי לערוצים אחרים במסלול ,חוזרים חלילה.
דוגמה:
הערוץ האיטי הוא בין שני הנתבים ולכן ערוץ זה הוא זה שמכתיב את הקצב בו החבילות יתקבלו אצל
המקבל.
בגלל שהביט do not fragכבוי אז המידע יעבור פרגמנטייה בערוץ בין שני הנתבים .הראוטר האמצעי
מקבל 1530Bאבל ה MTUשלו הוא .530B
לכן הוא לוקח את את ה 1530מחסיר מהם 20של header IPוקיבלנו .1510בגלל שה MTUהוא 530
נגדיר פרגמנט בגודל 510ונוסיף לו 20בתים של תחילית IPכדי לקבל את הפרגמנט הראשון .גם את
הפרגמנט הבא נעשה באותה צורה וכעת עבור הפרגמנט האחרון נשאר לנו 490בתים של מידע 20 +
בתים של תחילים שכבת הרשת ( )ipנקבל 510בתים.
כעת לשאלה השנייה ,נניח שההסתברות לכך שהנתב השני זורק כל חבילה שמגיעה היא .p
ההסתברות שהדגימה הראשונה תגיע בהצלחה ליישום של בוב היא ההסתברות שכל שלושת הפרגמנטים
יגיעו לבוב ויורכבו בהצלחה בשכבת האפליקציה .כלומר אסור לאף פרגמנט ליפול בדרך ולכן ההסתברות
). (1 − p 3
R
? RT T נרצה להבין את היחס בין גודל החלון שמשדרים וקצב השידור לבין RTTכלומר:
הזאת בעצם מהווה את זמן השידור של חלון אחד).
אז סיימנו לשדר לפני שהגיע ackולכן אנחנו מחכים ולא משדרים עד שיגיע W ⋅L
R
< RT T )aאם מתקיים
ה . ack
ניתן לראות שכאשר מצב זה מתקיים ישנו זמן מת (המשולש באדום) עד שניתן לשלוח את החלון הבא.
אזי ה ackעל החבילה הראשונה מגיע תוך כדי שידור החלון ,ולכן כאשר )bאם מתקיים > RT T
W ⋅L
R
אנחנו מסיימים לשדר את החלון הראשון ניתן מיד להתחיל לשדר את החלון השני באופן רצוף ללא בזבוז
זמן מת.
כאשר היחס גדול יותר ניתן לראות שמתקבל ackעל החבילה הראשונה לפני שסיימנו לשדר.
כלומר ,החל מאיזה חלון ה RTTכבר לא גדול יותר מזמן השידור של החלון .עם זאת ,מכיוון שה RTTמכין
בתוכו את זמן השידור של החבילה הראשונה ,אם חיבור ה TCPמתחיל מחלון בגודל חבילה אחת ,בחלון
הראשון תמיד ה RTTיהיה גדול יותר מזמן השידור של החלון.
כאשר באי שיוויון זה הנעלם היחיד הוא iכי ניתן יהיה לחשב את השהיית השידור ואת ה .RTTעד החלון
. WL
R
והחל מהחלון ה iמשדרים לפי > RT T ה iאנחנו משדרים לפי < RT T
WL
R
דוגמה:
חבילות ,כאשר החבילה האחרונה אינה מלאה והיא בגודל . 820B נרצה לשלוח = 83.56 ∼ 84
122000
1500−40
1460B + 40B
= dt + dp + 12ms = 13ms
12M bps
820B + 40B
= dt + dp + 12ms = 12.573ms
12M bps
40B
= dt + dp + 12ms = 12.027ms
12M bps
R
< RT T נשים לב שכאן ברור ש
הקודמת.
לכן: WL
R
< RT T מתקיים ש
1460B + 40B 820B + 40B
⋅ 11 ⋅ RT T + 2 + = 0.2779
12M bps 12M bps
הסיבה ששמנו 11היא בגלל שהיחס הנ״ל הוא > אז מתקיים שנשלח 10סיבובים מלאים של 8חבילות
בנפרד ועוד סיבוב אחד של 4חבילות (לא משפיע על ה RTTשנמדד לפי החבילה הראשונה) .לאחר
החישוב הזה מוסיפים את זמן השידור של כל החבילות בחלון האחרון חוץ מהחבילה הראשונה שנספרה
ב RTTה . 11החבילה האחרונה נזכיר היא קטנה יותר משאר החבילות.
הבעיה כאן היא שעלולה להיווצר תופעה בה כמות המידע ששולחים בכל חבילה הולכת וקטנה והולכת
וקטנה מה שגורם לכך שאנחנו שולחים הרבה מאוד תחיליות.
בעיה דומה יכולה להתרחש בכיוון ההפוך ,כאשר האפליקציה בצד השולח ,שולחת הרבה מידע אבל
בחתיכות קטנות (אם TCPיחכה הוא יוכל לחבר חתיכות קטנות לחבילה אחת במקום חבילות נפרדות).
דוגמה:
במקרה הכללי ,אם הקצב שבו מגיע המידע הוא Rוהקצב שבו קוראת האפליקציה מהבאפר הוא Oוגודל
.W
1−
הבאפר בפועל הוא Wאזי הנוסחה עבור גודל החלון ה אגרסיבי אותו ניתן לפרסם היא
O
R
נשים לב שהעיקר פה הוא השהיית ההתפשטות ולכן גם אן נתעלם משאר ההשהיות נקבל שאם השולח
ישלח מידע בגודל הבאפר וימתין עד לקבלת תשובה ,נקבל שקצב העברת המידע הוא
. =
200000B
= 500KBps
RT T
200000B
0.4s
.1המקבל יכול לפרסם חלון גדול יותר מהגודל הבאפר שיש לו בפועל .פרסום שכזה יאפשר למידע
להגיע מהר יותר ,למרות שאין גודל בפאר לכאורה מתאים ,האפליקציה מרוקנת כל הזמן את הבאפר
ומפנה מקום .למשל ,אם המקבל יפרסם חלון בגודל 400000אז הקצב יגדל ל .1MBps
. .גודל חלון כזה יתן לנו קצב של .2נציב בנוסחה
6
10 200000B 6
= 2.5M Bps 8M bps
= 10 B
0.4
1−
10M bps
שכבת האפליקציה
שכבת היישום (באנגלית )Application :נקראת גם :שכבת התוכנה או שכבת האפליקציה .היא השכבה
השביעית והעליונה של מודל ה OSI-והחמישית במודל .TCP/IPהיא ממונה על אספקת שירותי הרשת
לתוכנות בהן משתמש משתמש הקצה .שכבת היישום משתמשת בשירותיה של שכבת הייצוג של מודל ה-
OSIואינה מספקת שירותים לאף שכבה אחרת במודל ה.OSI-
שכבת היישום היא זו הקובעת את סוג התקשורת בין מחשבים .למשל ,היא קובעת האם מדובר בתקשורת
"שרת–לקוח" ( )client-serverשבה מחשב אחד (השרת) מספק נתונים לאחר (הלקוח) -כמו בגלישה
באינטרנט ,או שמדובר בתקשורת "קצה לקצה" ( ,)peer to peerשבה כל אחד מהמחשבים הוא גם שרת
וגם לקוח -כמו ברשתות שיתוף קבצים.
DHCP
) Dynamic Host Configuration Protocol (DHCPהוא פרוטוקול client/serverשמספק באופן
אוטומטי ודינמי ,את הכתובת IPשל hostכאשר הוא מתחבר לרשת בפעם הראשונה.
כי הוא לא מוקצה. 0.0.0.0 ניתן לראות שבשליחת ברשה ראשונית ה source IPהוא עדיין
השרת שולח תגובת Offerב Broadcastעם המזהה הספציפי שדיברנו עליו מקודם והכתובת IPהמוקצת.
ההודעת Offerבדוגמה למעלה הייתה ב broadcastאבל היא גם יכולה להשלח בבקשת . Unicast
במצב זה השרת שולח בקשה ל IPשהוא עוד לא הקצה למחשב החדש שהתחבר
הבחנה
אם קיימים שרתי DHCPברשת המקומית בעלי כתובת פנויה לחלוקה ,הלקוח יקבל חבילת offerעם
כתובת IPמכל אחד מהם (בהנחה שאין חסימה של מעבר חבילות DHCPבין השרת ללקוח ,למשל
על ידי חומת אש).
DNS
מחשבים מתקשרים זה עם זה באמצעות IPאך רוב הגולשים לא מודעים לקיומן בכלל.
כדי להפוך את הגלישה לנוחה ,לכל אתר מוצמד שם דומיין שהוא שם מילולי ומייצג את הכתובת .לשם כך
הוגדר הפרוטוקול DNSשרץ על .UDPהפרוטוקול מהווה מעין ״ספר טלפונים״ .הדפדפן מאחורי הקלעים
על כל דומיין פונה לשרת ה DNSכדי לקבל את הכתובת ה .IP
מבנה של שמות דומיין מזכיר עץ ,הסיומות בשם הדומיין מייצגות את סדר הפניה לשרתי DNSמהסוף
להתחלה .נדגים על : cyber.org.il
א) בגזע של שמות ה domainנמצא שרת DNSבשם -Rootהוא שומר את כתובת ה IPהמשמשים רק ב
top level domainsלמשל סיומות של מדינות il, ukוסיומות כמו .com
ב) בשלב הבא מתבצעת הפנייה אל שרת ה DNSהאחראי על סיומות ilממנו מתפצלים ענפים נוספים כמו
org. il
ומבקש את הכתובת של org. il ג) בשלב האחרון מתבצעת פנייה לשרת DNSשהשורש שלו הוא
. cyber.org.il
שרתי ה :Root
יש כ 13שרתי rootלוגיים (של חברות רשת מסויימות שהשרתי rootהפיזיים שלהם מפוזרים בכל מיני
מקומות).
בהגדרות הרשת של המחשב מוגדר לנו לאיזה שרת DNSלפנות כאשר אנחנו רוצים לקבל כתובת
של דומיין מסוים .אלו הגדרות שמוזנות באופן אוטומטי דרך הראוטר אבל נתנות לשינוי או להגדיר
באופן ידני את כתובת ה IPשל השרת DNSשנרצה לפנות אליו
DNS Resolver
ה resolverהיא התוכנה שפותרת שאילתות .DNS
מההסבר שהבאנו למעלה ,אפשר להניח שמשיכת כתובת IPהיא תהליך ארוך שיכול לעבור בכמה וכמה
שרתים .כדי לייעל את התהליך הזה ישנם שני פתרונות
א .שימוש ב Cacheכדי להכיל מיפוי לכתובות שכבר חיפשנו כדי לא לחפש אותם שוב.
ב .פרוטוקול DHCPיביא כתובת לשרת DNSשל הרשת המקומית (לרוב זה יהיה הראוטר) והמטמון ישב
שם .היתרון בזה הוא שהמטמון משותף בין כל ה hostsברשת המקומית ויש שיתופיות של כתובות ,
resolverאחד ישתף המון לקוחות.
ה Resolverעובד בצורה חצי איטרטיבית וחצי רקורסיבית ,הבקשה עולה לשרת ה DNSהמתאים ומשם
הולכים לפי העץ ,תחילה פונים ל rootשמחזיר את הכתובת הבאה של השרת שעלינו לשאול אותו (במקום
שהוא יעשה זאת וככה יורד ממנו עומס) השרת DNSהמקומי שלנו מכאן ממשיך לשאול בתורות את
השרתים שחוזרים עד שמתקבלת תשובה כפי שמתואר בתרשים הבא
הריקורסיה באה לידי ביטוי בכך שיכול להיות שגם השרתים עצמם יצטרכו לעבור תהליך דומה.
בעצם הבעיה שחסכנו בשיטה זאת היא heavy loadעל השרתי rootכפי שהיה קורה אם היינו עובדים
בשיטה ריקורסיבית מלאה :
שדות DNS
כפי שאמרנו ניתן לראות שהחבילה נשלחת בשכבת האפליקציה מעל .UDP
א) בצהוב ניתן לראות את ה Transaction IDשאמרנו שהוא נפוץ מעל UDP
ב) השדה בכחול הוא flagsששדה זה מורכב משמונה דגלים בעלי משמעויות שונות ,הדגל הנ״ל מציים
שמדובר בשאילתה סטנדרטיץ
ג) RR- Resource Recordsבירוק זה מידע שמתאר כמה רשומות מכילה חבילת ה .DNS
ד) השאלתה עצמה בסוף של הבקשה מכילות Name,Typeו Classכאשר האחרון מתאר את סוג הרשת
בד״כ יהיה רשום .IN
ב Responseאפשר לראות שגם התווסף תשובת Answersוב RRאפשר לראות שעבור שאלה אחת יש
חמש רשומות תשובה .הסיבה לכך היא שלפעמים כתובת דומיין אחת מצביעה לכמה כתובות IPוכך אם
שרת אחד נפל יש שכפולים.
ברשומה של שאילתה יש את השדרות הטריוויאלים אבל נשים לב שיש גם ttlששדה זה קובע כמה זמן יש
לשמור את הרשומה ב.Cache
כאשר מידע נוסף מועיל )RR = (name, type, ttl, addr באופן כללי רשומת DNSהיא רביעייה מהצורה
אבל לא הכרחי.
הראשון הוא המיפוי בין ה domainל NSהרלוונטי ,השני הוא הכתובת IPשל הNS
DNS Redirection
טכניקה שנועדה לפזר עומס על שרתים .בהינתן Domainמסויים ,יהיו מספר העתקים שלנו כאשר לכל
אחד יש IPשונה .שרת ה DNSמחזיר כתובת IPשונה לצורך פיזור העומס ,באמצעות אלגוריתם Round
.Robin
HTTP
.Hyper-Text Transfer Protocolפרוטוקול זה מאפשר לאפליקציות לגשת ולעשות שימוש במשאבי
האינטרנט (תמונות ,קבצים וכו׳) .בפרוטוקול זה כתובת ה URLהיא מרכיב הכרחי כדי לקבוע מהו המשאב
הרלוונטי שאנחנו רוצים למשוך
HTTPעובד בעקרון של בקשה ותגובה כלומר הלקוח שולח בקשה לשרת וכאשר היא מתקבלת ,השרת
ישלח תגובה .בתקשורת HTTPהשרת לא יוזם שיח עם הלקוח.
כמו כן חשוב לציין ש HTTPרץ על . TCP
גרסאות HTTP
ישנם מספר גרסאות ל HTTPשחשוב להכיר:
:Non-persistent
על גבי חיבור TCPבודד ניתן לקבל משאב אחד ואז החיבור נסגר.
:Persistent
כמה וכמה בקשות ניתנו לביצוע פר חיבור TCPבודד.
:Pipelining
ניתן לשלוח מספר בקשות HTTPלפני שמתקבלת עליהן תשובה על אותו החיבור .
Format
יש שני סוגי הודעות ל :Httpהודעת requestוהודעת . response
שני הבקשות עוברות בקידוד . ASCII
בקשת requestנראת המצורה:
בקשות HTTPהן הודעות שנשלחות על ידי הלקוח כדי ליזום פעולה בשרת .קו ההתחלה שלהם מכיל
שלושה אלמנטים:
HTTP method
מתאר איזה פעולה הבקשה רוצה לעשות:
- GETמבקשת לקבל משאב מסויים.
- HEADמבקשת את אותה תגובה כמו בקשת ה GETרק בלי ה .body
- POSTשליחה של יישות עבור משאב מסויים במערכת ,לעתים זאת משנה את ה stateשלו או משפיעה
על השרת.
- DELETEמחיקה של משאב מסויים.
- PUTהחלפה של משאב מסויים בתוכן הבקשה.
- PATCHביצוע מודיפיקציה של משאב בשרת.
Request target
בדרך כלל זה URLאו נתיב אבסולוטי שמכיל בתוכו ,queriesפורט וכו׳.
בעצם זה יכול להיות כל נתיב שהוא בעצם מורכב מהמבנה המלא של URL
HTTP version
הגרסה קובעת את המבנה של שאר ההודעה וגם כדי לדעת כיצד לבנות את התגובה.
Headers
כותרות HTTPמייצרות בקשה תחת אותו מבנה בסיסי של :Header HTTPמחרוזת לא תלוית רישיות
ואחריה נקודתיים (' )':וערך שהמבנה שלו תלוי ב .Headerהכותרת כולה ,כולל הערך ,מורכבת משורה
אחת בודדת ,שיכולה להיות ארוכה למדי.
Body
החלק האחרון של הבקשה הוא הגוף שלה .לא לכל הבקשות יש אחת :בקשות שמביאות משאבים ,כמו
GET, HEAD, DELETEאו ,OPTIONSבדרך כלל אינן זקוקות למשאבים כאלה .חלק מהבקשות
שולחות נתונים לשרת על מנת לעדכן אותם :כפי שקורה לעתים קרובות בבקשות ( POSTהמכילות נתוני
טופס .)HTML
HTTP Response
כפי שאמרנו המבנה הוא דומה ל.Request
Status line
שורת ההתחלה של תגובת ,HTTPהנקראת שורת המצב ,מכילה את המידע הבא:
Headers
מבנה זהה לחלוטין של headersבבקשת .httpההבדל היחיד הוא בקונטקסט שיש ל headersהאלה כלומר
מה המשמעות שלהם.
Body
באופן דומה ל .HTTP Requestמכילות מידע החוזר מבקשה .הרבה פעמים אנחנו נראה את זה בבקשות
מסוג .GET
Coockies
באינטרנט ,עוגייה היא מחרוזת אותיות או מספרים ,המשמשת לאימות ,למעקב ולאגירת מידע על אודות
גולש באתר אינטרנט ,כגון שמירת העדפות המשתמש .העוגייה מייצגת מצב מסוים של גלישה באתר או
שימוש באפליקציה .לעיתים ,גם אתרים שאינם האתר שיצר את העוגייה יכולים להשתמש בה.
העוגייה נוצרת על ידי השרת שמעביר אותה לדפדפן ששומר אותה בזיכרון המחשב .המחרוזת מוחזרת
חזרה לשרת בכל פעם שהדפדפן יוצר קשר עם השרת וכך למעשה יכול השרת לזהות את המשתמש
ולאחזר מידע שנשמר בין שיחות שונות.
הדפדפן שומר את העוגיות בקובץ key-valueכאשר ה keyהוא ה domainוה valuesהם הcoockies
ששמרת עבור אותו .domain
Http cache
ל Httpיש מנגנון Cacheבצד הלקוח שמאפשר לדעת האם יש צורך להביא משאבים כבדים מהשרת או
לטעון אותם ישירות מה cacheלמשל על ידי שימור בפרמטר ה .last modified
ניתן לראות שהשרת יחזיר 304שזה אומר שהמידע לא השתנה אם שלחנו בקשה עבור משאב שנמצא
במטמון בפרק זמן קצר מדי.
היתרון המשמעותי של זה הוא שניתן לחסוך זמן יקר בטעינת משאבים באתר על ידי שימוש במטמון
שנמצא קרוב יותר למחשב הלקוח מאשר השרת המקומי.
כמו כן -גם אם המטמון של ה responseשמור בצד שרת עדיין השרת לא צריך לבצע עיבוד לבקשה.
באמצעות הפרמטר Cache-Controlנוכל להגביל את זמן השמירה של מידע במטמון וגם לקבוע האם יש
צורך בשימוש במטמון בכלל.
סוגי Cache
אם נרצה לשמור מידע במטמון פרטי נוכל לציין זאת באמצעות הוספת הheader
Cache-Control: private
:sharedמטמון שממוקם בין הלקוח לשרת ויכול לשמור responsesשיכולים להיות משותפים בין מספר
משתמשים .אפשר לחלק אותו לשניים Proxy cache ,או . managed cache
Proxy
המטרה של Proxy Serverהיא לספק בקשות לקוח מבלי לערב את השרת המקורי .במילים אחרות ,שרת
שתפקידו העיקרי לספק גישה מהירה למשאבים חיצוניים ברשת מחשבים.
הסוואת כתובת ה IP-מתאפשרת על ידי חיבור לשרת פרוקסי שדרכו כל חיבורי האינטרנט עוברים (הנתונים
נשלחים אליו וממנו אל השרת ומן השרת אליו ועד למשתמש) כפי שניתן לראות בתמונה.
תפקידו העיקרי של שרת הפרוקסי מתאפשר באמצעות תוכנה השומרת בזיכרון המטמון שלו עותקים של
דפי אינטרנט ומאפשרת גישה מהירה אליהם מהמחשבים המחוברים לפרוקסי .בחלק מהמקרים משמש
הפרוקסי כנקודת הפרדה וביקורת בין רשת המחשבים הפנימית של הארגון אליו הוא שייך לבין העולם
החיצוני.
הוא מאפשר מעקב ,חסימה או שינוי לדפי HTMLעל פי מדיניות הארגון בענייני אבטחת מידע ותכני מידע
קבילים (אפשר ,למשל ,לחסום אתרים פורנוגרפיים) .יש מקרים שהוא משמש למימוש ( SSOמסיר את
הצורך בהכנסת שם לכל אפליקציה שונה) ולהוספת הגנות לדפי הארגון על פי הרשאת המשתמש.
סוגי :Proxy
Regular Proxy )1
- Transparent Proxy )2הלקוח לא מכיר את ה Proxyהזה ,הוא מפענח פקטות ומשתמש בהן בהתאם.
-Reverse proxy )3מיועד לצד השרת ,מסתיר את השרת והטכנולוגיה של השרת ,מבצע בעיקר cacheו
load balancingבשביל .Scaleability
HTTP calculations
בחלק זה נראה מספר שאלות חישוב שניתן לעשות מעל .HTTP
שאלה :1
מכיוון שאליס עובדת ב http1.0אזי מדובר על חיבור שהוא ברירת מחדל לא .persistent
נשים לב :תמיד דגל ה ACKדולק בכל החבילות (למעט הראשונה של ה ,SYNובהתאם ערך ה ACK
numberיהיה הכי עדכני) .לא תמיד נקפיד על הצגה של זה בתרשימים הבאים.
נשים לב שהדפדפן של אליס מעולם לא ניגש לאתר של בוב אבל שרת ה DNSהמקומי כן ניגש .כלומר
כשנשלח אליו בקשת DNSהוא לא יצטרך ללכת להירכייה ומיד יוכל להחזיר תשובה.
כעת יתחיל חיבור TCPבין אליס ובוב כיוון ש HTTPהוא פרוטוקול מעל TCPואליס שולחת בקשת
GETכדי לקבל את עמוד האינטרנט .כמו כן כיוון שנתון שבקשה בודדת הייתה קטנה מ MSSכל תהליך ה
requestו responseיהיה בסגמנט אחד בלבד לכל שלב.
לבסוף נוכל לסגור את חיבור ה TCPלאחר שהבקשה הושלמה.
לא סיימנו ,כיוון שאתר האינטרנט מכיל גם תמונה אחת הדפדפן צריך להוריד את ה assetבבקשת GET
נוספת ולכן יפתח חיבור TCPחדש.
שאלה :2
נתון שהשהיית ההתפשטות מה clientל serverהיא .10
−3
כיוון שניתן להתעלם מהשהיית ההתפשטות של תחיליות ושל הבקשה בפרט .לכן אין צורך לחשב את
השהיית השידור מהלקוח לראוטר ומשם לשרת .אפשר לחשב ישירות את ההשהייה מהלקוח לשרת
שניות. 3 ⋅ 10
−3
ניתן לראות ששלב ה handshakeושליחת הבקשה לוקח 3השהיות כלומר
שניות .ולהעביר MSSאחד בערוץ בין הראוטר ללקוח זה פי 4מזה ולכן זה יהיה 4 ⋅ 10שניות .לכן
−3
להעביר MSSאחד מהשרת ללקוח הוא תהליך שלוקח 5 ⋅ 10שניות .אפשר להוסיף עוד אלפית שניה
−3
התהליך הזה חוזר על עצמו 3פעמים אחד אחרי השני (בגלל שאנחנו ב )store and forwardוסך הכל
התהליך יסתיים לאחר 21אלפית השנייה.
שאלה :3
נשים לב שכעת פרוטוקול DNSהולך ״לעבוד קשה״ בגלל שה cacheריק .הלקוח ברשת Aניגש לשרת
הפרוקסי ולאחר מכן ניגש ל local resolverשמשם יבצע את שרשרת ה DNSהרלוונטית למשיכת ה.ip
כעת הפרוקסי יבצע פנייה ל local resolverבכוונה למצוא את ה domainוכן הלאה נמשיך בשרשרת פניות
ל ns serversכדי למצוא את ה .ipנזכיר ש DNSלא עובד רקורסיבי אלא סדרתי ולכן השרת comיחזיר
תשובה ל B.comל resolverוכן הלאה .לבסוף ה resolverיחזיר את התשובה ל .proxy
לאחר שכל זה קרה ,יתבצע חיבור TCPנוסף בין ה proxyלבין ה web serverלקבלת הדף ושמירה ב
.cache
שאלה 3.2
שאלה :4
יש Nשרתי DNSשהיה צריך לפנות אליהם וזה לקחת . RT T + ⋯ + RT Tכעת חיבור ה, tcp
1 n
שליחת Synוקבלת Ackעליו לוקחת RT Tושליחת Ackוקבלת התשובה לוקח עוד RT Tולכן
0 0
N
2RT T 0 + ∑ RT T i
i=1
שאלה :5
השהיית ההתפשטות נתונה לנו לכן צריך לחשב רק את השהיית השידור ונקבל
20Kb
d t S→R = = 0.2ms
2
100M bps
20Kb
d tR →R
= = 0.8ms
2 1
25M bps
20Kb
d tR →C
= = 0.02ms
1
1Gbps
:6 שאלה
CDN
Content Delivery Networkהיא רשת של שרתים שמאפשר העלאה מהירה יותר של דפי אינטרנט
כאשר הן עושות שימוש בהמון .data
אם לא היינו משתמשים בשירות הזה כל הלקוחות שמשתמשים בשירות שלנו ניגשים לאותו שרת .המנגנון
הזה נתון להמון בעיות ,החל מהעובדה שלקוחות מסוימים יחוו את טעינת האתר בצורה איטית יותר או
שהשרת עלול לקרוס ואין לו גיבוי.
חברות רבות שמציעות שירותי CDNמציעות אלטרנטיבה לרכישה של שרתים מסביב לעולם כדי לתקן את
הבעיות האלה.
החברות הנ״ל שמו בכל מיני אזורים שרת שנקרא .Edge serverהלקוחות פונים לאחד מהשרתים הקרובים
אליהם באמצעות קח שהן מתלבשות על חוות שרתים של ספקי האינטרנט באזורים השונים.
השרתים האלה מהווים מנגנון של Cacheעבור השרת שלנו.
SMTP
רכיבים עיקריים3 הוא פרוטוקול שכבת האפליקצייה המכילSimple Mail Transfer Protocol
user agents .1
mail servers .2
simple mail transfer protocol .3
User Agent
עונה גם לשם mail reader
מיועד לעריכה קריאה ושליחה של הודעות מייל.
תוכנות רבות מהוות user agentלפרוטוקול למשל אפליקציית Outlook, Gmailוכו׳
הודעות יוצאות ונכנסות מאוחסנות בשרת.
נשים לב SMTP :משמש למשלוח דואר אלקטרוני מ user agentובין שרתים שונים ,עד שיגיע לשרת היעד,
אך אינו מאפשר למשתמש לשלוף את הודעות הדואר המיועדות אליו מן השרת .קיימים פרוטוקולים אחרים
המיועדים לשליפה של הודעות דואר ,כגון POP3ו.IMAP-
SMTPעובר מעל TCPומשתמש בדרך כלל בפורט .25פורט לקבלת נתונים הוא פורט .587
Flow
.1אליס משתמשת ב user agentכדי לנסח הודעה עבור .bob@someschool.edu
.2אליס שולחת הודעה לשרת המייל שלה ,שם הוא נמצא ב .message queue
.3״צד הלקוח״ של שרת ה SMTPהנ״ל פותח חיבור TCPלשרת המייל של בוב.
SMTP client .4שולח את ההודעה של אליס על גבי .TCP
.5שרת המייל של בוב ממקם את ההודעה של בוב ב .mailbox
.6בוב מושך מהשרת את ההודעות שלו (בעזרת פרוטוקול אחר או בעזרת ה .)web-based mail
נשים לב שאם אליס ובוב היו באותו שרת webשלבים 5 4ו 6לא היו רלוונטים אלא שהשרת היה מיד שם
את ההודעה בתיבה של בוב והוא היה מושך את זה.
לאחר מכן הלקוח שולח לשרת הודעת .MAIL FROMהשרת מגיב ב ( 250כמו מקודם) ומאשר את המייל
של השולח.
כעת הלקוח שולח לשרת את שם הנמען עם הודעה .RCPT TOהשרת מגיב ללקוח עם 250ומאשר את
הנמען (אם היו כמה נמענים השורות האלה היו חוזרות על עצמן כמספר הנמענים).
כעת הלקוח שולח לשרת הודעת DATAכדי להכין את השרת לקבלת מידע (נגמר מידע ה״מעטפה״).
השרת מגיב בהודעת 354ומבקש לסיים את המייל עם הודעת ״.״ בסוף בשורה נפרדת.
הלקוח לאחר מכן שולח את ה dataעם נקודה בסוף כמבוקש .השרת מדווח 250שהוא קיבל את ההודעה
וכיוון שהלקוח סיים הוא שולח QUITוהשרת מגיב בהודעת 221וסוגר את החיבור.
כאן בשלב ה messageהלקוח שולח שתי הודעות דיווח נוספות של fromו toוכאן יש שני נמענים ורק
לאחר מכן נשלח ה dataהנוסף .הפורמט הזה הוא הפורמט הרשמי של .RFC822ניתן לראות שאומנם יש
כאן עוד נמען אך השרת הנ״ל מתעסק ב b.comולכן הוא לא מתעסק בזה.
כאן ניתן לראות דוגמה שבה המידע הנוסף (המידע ב )Ccכן היה רלוונטי עבור השרת הנ״ל ולכן הוא גם
קיבלת הודעת RCPTנוספת עבור מייל זה (בשניהם הדומיין הוא .)example.com
כאן גם יש שני נמענים רק שהפעם אחד הנמענים הוא נסתר ולכן לא נמצא כחלק מה .Dataכמו כן בסיום
ההודעה לא נסגר החיבור אלא נשלח הודעה חדשה אל נמען אחר ב .sponge.com
POP3
פרוטוקול משיכת המיילים בצד הלקוח.
השלב הראשון ב flowהתקשורת בפרוטוקול זה הוא שלח ה .authorizationבשלב זה הלקוח שולח את
המשתמש ( ) user bobולאחר מכן את הסיסמה ( )pass hungryוהשרת מגיב בהודעת +OKאו ב
. −ERR
השלב השני נקרא שלב ה ,transactionבשלב זה הלקוח מבקש לקבל רשימת הודעות חדשות באמצעות
הפקודה .listהשרת יגיב רשימה של tupleשל מספר הודעה עם הגודל שלה ויסיים כאשר ישלח את התו
״.״ בשורה ריקה.
לאחר מכן הלקוח יכול להחליט להשתמש בפקודות מסוימות על הודעות מהרשימה למשל dele 1תמחק
את הודעה 1מהרשימה ו retr 2תשלוף את המידע מההודעה לפי המספר הודעה.
פרוטוקול POP3וקודמיו תוכננו במטרה לאפשר למשתמשים שאין להם חיבור-קבוע לשרת הדואר ,דוגמת
משתמשי מודם חיוג או ,ADSLגישה לדואר האלקטרוני שלהם .במרבית המקרים ,צד הלקוח מתחבר אל
השרת ,מוריד ממנו את ההודעות במלואן בסדר שבו התקבלו ,ושומר אותן על מחשבו .לאחר מכן ההודעות
נמחקות מהשרת .הפרוטוקול תומך באפשרות (אם כי השימוש בה הוא לא-נפוץ) להשאיר עותק מן ההודעה
המקורית על השרת .בצורה זו יכול המשתמש לקרוא את הדואר שלו מכמה מקומות וגם מכמה תוכנות
לקוח שונות .לכן POP3הוא statelessלאורך ה ,sessionהוא לא שומר את המידע בשרת.
פרוטוקול נוסף להעברת דואר הוא פרוטוקול .IMAPזהו פרוטוקול חדש יותר ובעל מגוון פונקציות
נוספות ,כגון אימות מוצפן ,הפרדת הדואר לתיקיות-משנה ,הפרדה בין כותרי ההודעה לגוף ,ועוד .מאחר
שזהו פרוטוקול מורכב הרבה יותר ,הוא נפוץ פחות ורוב ספקיות האינטרנט אינן מאפשרות גישת IMAP
ללקוחותיהן.
בעוד שליחה של דואר אלקטרוני או העברת דואר בין שרתים מתבצעת באמצעות פרוטוקול SMTP
והרחבותיו ,קריאת דואר על ידי הלקוח תתבצע באמצעות פרוטוקול POP3או .IMAP
SMTP calculations
קודם כל צריך לדעת מיהו שרת השמות של . israblof.comלשם כך השולח ירצה לשאול את שרת ה
DNSהמקומי של הרשת שלו .כיוון שאפשר להניח שיש במטמון את רשומות ה NSשל COMאז השרת
dnsהמקומי יעבור את השאילתה ״מיהו שרת ה MXשל ?israblof.com״ אל שרת ה NSשל comמבלי
לחפש אותו .שרת זה מחזיר את ה ipשל שרת ה NSשל israblof.comאל שרת הדומיין המקומי והוא ילך
לשאול את שרת זה את הכתובת של שרת ה MXהמתאים.
כפי שציינו שרתי DNSיודעים לעבור עם prioritiesל דומיין וכדי להוריד את העומס השרת
ns.israblof.comיחזיר קודם כל העדיפות גבוהה את הכתובת של שרת ה . MX : mail.MXrUS.com
ולכן כשה domainהזה יחזור לשרת ה local DNSהוא יחזיר את ה domainשאותו יש לחפש (מבלי לצרף
הת ה IPכמו במקרה של )ns.comל . sender.comמיד תשלח בקשה נוספת כדי לחפש את הדומיים של
שרת ה MXוהתהליך יעבור שוב דרך ns.comויוחזר 5.5.6.6שזה כתובת שרתי ה dnsשל .MXrUS
לאחר פנייה אליו ,הוא יחזיר את כתובת ה ipשל של המיילים שלהם שתומך בשרת של .israblofכעת
אפשר להתחיל לבצע חיבור SMTPלשרת המיילים הזה
כדי לבדוק את אמינות המידע שרת המיילים שולח בקשת DNSעם ה ipשל השולח כדי לוודא שהדומיין
הוא אכן שרת מיילים תקין.
מתבצע כעת חיבור SMTPבין שרת המיילים של MXrUSאל mail.israblofוגם הוא מבצע את אותה
בדיקת אמינות .והמידע מגיע ליעד.
שכבת הרשת
תפקיד שכבת הרשת הוא לשנע segmentמהרכיב השולח לרכיב המקבל.
התפקיד של שכבת הרשת הוא לא בידיוק להעביר למחשב המקבל אלא לרשת שבה נמצא המחשב המקבל
Link Layer ,אחרי להעביר את המידע למחשב המתאים ברשת המקומית.
- Control planeקובע כיצד datagramמנותב בין ראוטרים מקצה לקצה עד הגעה ליעד .כלומר איך
הראוטרים מחליטים בינהם לאן הפקטה תלך
לכל ראוטר יהיה רכיב שמהווה את אלגוריתם הניתוב והוא מתממשק עם מישור הבקרה.
הכתובת שמאפשר לייצג 2כתובות .למבנה הזה קוראים IPv6לעומת IPv4שזאת הגרסה הנ״ל .כיום
128
אנשים רגילים לא יכולים לדעת איפה אנחנו גרים על סמך כתובת ה IPשלנו ,אך בחוזה ההתקשרות
שאנו חתומים עם ספק האינטרנט ,רשומה כתובת הבית שלנו וזאת מקושרת לכתובת ה IPשל
המחשב שלנו.
הפקודה PING
ping IPהיא פקודה שמאפשרת לנו לבדוק אם שני מחשבים מקושרים זה לזה .הפקודה שולחת
הודעות אל כתובת ה IPשל היעד שאנחנו בוחרים .אם ההודעות מגיעות ליעד ואם היעד מוכן לענות
לנו ,נקבל על כל הודעה תשובה ובה משך הזמן שלקח להודעה לעבור בין שני המחשבים.
ככל שעולים ב Classככה מתווספים עוד 8ביטים לרשתות אבל גם מאבדים עוד MSBבמספר המחלקה.
היתרון של שיטה זאת הוא בכתובת ipאני יכול לקבל במחיר די קטן את החלוקה של הכתובת ל מזהה
רשת ויישות.
החסרון של שיטה זאת הוא שמעבר בין מחלקות מקפיץ את כמות הכתובות מעריכית ולכן יש לזה עלות
״כלכלית״ גבוהה.
כפי שאמרנו לכתובת IPv4יש 2כתובות אפשריות .מרחב הכתובות הזה נוצל מזמן ואומנם יש כבר
32
גרסאות עם יותר כתובות כמו IPv6אבל זה לא כזה פשוט להמיר את כל הכתובות הקיימות לכתובות
מגרסא חדשה .לכן נרצה שיטה פחות בזבזנית מה class addressingכדי להבדיל בין בין מזהה הרשת
למזהה היישות.
השיטה הזו פחות בזבזנית כי היא מאפשרת קפיצות ברמת ביט בודד ולא בית כמו בשיטה המחלקות.
כלומר אומנם אנחנו עדיין מוגבלים ברמת הקפיצות בין כמות המחשבים שאפשר לייצג באותה רשת ברמת
הקפיצות בין ביט לביט אבל כעת אלו יותר קטנות.
ה subnet maskהוא בעצם מספר בינארי באורך 32ביטים שכל ביט אצלו מייצג האם הביט ב ipשייך
למזהה רשת או מזהה היישות (ביט דולק משמעותו שייך למזהה היישות אחרת למזהה הרשת) .לאחר מכן
נתן לחלץ את המידע מה maskעל ידי ביצוע . & bitwise
כתובות IPשמורות
שומרים בדרך כלל את הכתובת הראשונה עבור הרשת עצמה והכתובת האחרונה היא עבור broadcastשל
הרשת.
Destination-base forwarding
בהינתן פקטה ,נרצה לדעת כיצד הראוטר מחליט לאיזה ממשק להעביר את הפקטה כדי שתמשיך להתקדם
עד להגיעה ליעד.
לשם כך הראוטר יחזיק בתוכו forwarding tableעם שתי עמודות .הראשונה תהיה ה Link Interface
והשנייה תהיה Destination Address Rangeשתכיל בתוכו את טווח הכתובות ה IPשמיועדות לעבור
לממשק שבעמודה הראשונה .נזכיר שפקטה של שכבת הרשת מכילה כתובת IPשל ה sourceוכתובת IP
של ה destinationב תחיליות שלה.
נשים לב שייצוג של טווח בטבלה הוא על ידי סימון ב * את הביטים שברצוננו לאפשר להיות להיות במצב
״חופשי״ כלומר גם כבויים וגם דלוקים .טווח בשורה מסוימת יכול להיות ״ספציפי״ יותר מאחר או להכיל
טווח בשורה אחרת .כאשר הראוטר רוצה לקבוע לאן פקטה צריכה ללכת הוא מחפש את האחד שטווח
הכתובות המכיל אותו הוא הקטן ביותר (יכול להיות כמה אבל בהכרח יהיה טווח קטן יותר מהשני)
. 11001000 00010111 00010110 10100001 נסתכל על ה ipהבא
בעצם מחפשים את ה prefixהארוך ביותר שמתאים לשורה כלשהי בטבלה .אם נסתכל על הכתובת
הדוגמה ,נראה שעבור שלושת השורות ,הבית הראשון מתאים וגם הבית השני .לעומת זאת ,הבית השלישי
מתאים רק לשורה הראשונה בטבלה כי הוא היחיד שהבית ה 5משמאל הוא 0ולכן השורה הראשונה מכילה
את ה prefixהארוך ביותר.
באמצעות הטבלה הזאת ספקי אינטרנט יכולים להשתמש בראוטרים שלהם כדי להעביר מידע לפי הארגונים
שנמצאים תחתם ברשת .הקונספט הזה נקרא hierarchical addressingוהוא בעצם מאפשר להקצות עוד
ביטים למזהה רשת דרך ה maskואלו יהוו מזהים לארגונים.
״האינטרנט״ בתמונה למעלה מהווה ראוטרים אחרים שמקבלים מידע מספקי אינטרנט על טווחי הכתובות
שהם מעוניינים שאותם ראוטרים יעבירו אליהם את המידע .לפי הממשק שממנו באה הבקשה הראוטרים
יודעים לבנות את ה forward tableשלהם.
IP Calculations
שאלה 1
הביט השמאלי הוא 1ומימינו מכובה ולכן הכתובת שייכת למחלקה .Bלכן המזהה רשת הוא . 138.64
שאלה 2
ה subnet maskהוא ( 23כמות הביטים הדלוקים היא 23מתוך .)32נבצע & בין כתובת ה IPל subnet
maskבבינארית ונקבל
שאלה 3
ראשית נזהה כמה כתובות יש ברשת הזאת לכל היותר
מכיוון שה subnet maskהוא 26יש 6ביטים שמייצגים מחשבים בתוך הרשת ולכן יש 2 = 64כתובות
6
אפשריות ברשת .נשים לב שמפרישים שתי כתובות לשימושים מיוחדים (הראשונה והאחרונה) ולכן יש 62
כתובות אפשריות .לכן במקרה שלנו כל כתובת בטווח
101.101.101.126 - 101.101.101.65מתאימה לנו.
שאלה 4
ברשת שלנו יש 64כתובות אפשריות .נשים לב ,שהספק מעוניין לדעת לכל כתובת לאיזה לקוח היא שייכת.
מכיוון שיש 4לקוחות ,הספק מקריב את 2הביטים הכי שמאליים מהחלק של הכתובת ולא מהחלק של
מזהה הרשת ,בכדי לזהות את הלקוח .הסיבה ל 2ביטים היא שאפשר בעזרתם לייצג 4לקוחות .בלוקי
הכתובות ייראו מהצורה
101.101.101.64/28 .1
101.101.101.80/28 .2
101.101.101.96/28 .3
101.101.101.101.112/28 .4
נשים לב ,שכאשר ספק האינטרנט מפרסם לעולם את הכתובות שהוא מעוניין שישלחו אליו ,הוא מפרסם רק
את הכתובת הראשונה .כאשר חבילה המיועדת לכתובת ipכלשהי בטווח הזה תגיע לראוטר של ספק
האינטרנט ,הראוטר יסתכל על 2הביטים הבאים ולפי זה ידע לאיזה לקוח יש להעביר את החבילה.
התהליך שבו ״איחדנו״ מספר תתי רשתות תחת רשת אחת נקרא .route aggregation
שאלה 5
בשלב הראשון ספק האינטרנט יעביר שכל הפקטות עם ה dst ipכפי שמצויין בתמונה ,יש להעביר את
הכתובות האלה אליו.
נשים לב שזה ממשק אחד מבין ה 4כי הנתב חייב להתחבר לאינטרנט .נשארנו עם 3ממשקים.
אם כן נוכל להקדיש 2ביטים עבור ניתוב לכל אחד מ 3הממשקים כאשר הממשק השלישי (עם ביט שמאלי
מבין ה 2שערכו יהיה )1יקבל פי 2יותר כתובות פנימיות ,את החצי השני של מרחב הכתובות הפנימיות.
וסה״כ
נשים לב שמכיוון שכל כתובת היא מבוססת בינארית צריך לבדוק כמה ביטים צריך עבור לפחות 50כתובות.
ICMP
פרוטוקול של שכבת הרשת שמאפשר להעביר errors, pingsו .network diagnosticsהודעות ICMP
נבנות בשכבת ה־ ,IPבדרך כלל מחבילת IPרגילה ,אשר יצרה תגובת ICMP IP .עוטף את הודעת ה
ICMPהמתאימה בכותרת IPחדשה ,כדי לשולחה חזרה למכונה ששלחה את ההודעה המקורית ,ולהעביר
את החבילה הנוצרת באופן הרגיל.
Traceroute
באמצעות הפקודה הזאת ניתן לאתר את הנתבים שהמידע עובר בהם כדי להגיע ליעד.
הרעיון הוא כל פעם לשלוח פקטת UDPעם ttlשערכו הוא iכאשר iמייצג את מספר הפקטה ששלחנו.
הפקטה הראשונה תקבל ttl=1השנייה ttl=2וכן הלאה ttl .הוא פרמטר שמתעדכן בכל פעם שהפקטה
מגיעה לראוטר .הראוטר מוריד ערך זה ב , 1אם הערך הוא 0הוא זורק את הפקטה ומחזיר הודעת שגיאה
עם פרוטוקול .ICMPלכן עבור הפקטה ה iהראוטר ה iיחזיר שגיאה מסוג 11עם קוד )ttl expired( 0
בטרמינל של : windows
בטרמינל של לינוקס :
NAT
- network address translationבפועל יש הרבה יותר מחשבים מכתובות ipv4וגם הטכנולוגייה לא
תומכת בהעברה מידית ומלאה ל .ipv6לשם כך ,משתמשים ב ,NATטכניקת ניתוב שמאפשרת למספר
מכשירים ברשת מקומית לחלוק רק כתובת IPאחת ברחבי האינטרנט.
דיברנו על כך ש DHCPהוא פרוטוקול שמספק כתובת IPל hostשמתחבר לרשת פעם ראשונה.
חשוב להבחין שפרוטוקול זה מספק את כתובות הרשת הפנימיות (מצד ימין בתמונה) בעוד
שבאינטרנט הכתובת של כל הרשת הזאת הוא הכתובת ( 138.76.29.7וזה החלק ששכבת הרשת
ביחד עם NATאחראית עליו).
כאשר datagramעוזבים את ה , local networkכתובת ה ipשנמצאת ב headerהיא הכתובת
.138.76.29.7אבל כאשר ה datagramנשארות ברשת המקומית הכתובות ipשלהם ב header
רשומות לפי הכתובת הפנימית שלהם.
NATהוא לא פרוטוקול של שכבת הרשת! הוא מעין hackשמאפשר לפתור את הבעיה של מחסור
כתובת מסוג ( IPv4שאמורה להפתר עם מעבר ל IPv6אבל הטכנולוגיה לא מאפשרת מעבר שכזה)
ולכן שיטה זאת קצת שנויה במחלוקת שכן היא משנה headersשל שכבת הרשת ונותנת לראוטר
אחריות נוספת .כמו כן בגלל ההכמסה של NATנפגעת היכולת לעשות חיבור ישיר ( )end to endבין
מחשב אחד לאחר ברשת החיצונית כמו ב , TCPעל ה NAT routerלפתור בעיות אלו בעצמו מה
שגם מערבב בין השכבות.
NAT Variations
כפי שניתן לראות ב RFC 38489ישנם מספר סוגים של :NAT routers
(מסמכי בקשה להערות הם סדרה של מזכרים בתחום טכנולוגיות אינטרנט שונות .לרוב ,המזכרים
מתארים מחקר חדש ,חדשנות טכנולוגית או מתודולוגיה המרחיבים באופן כלשהו את טכנולוגיות האינטרנט
הקיימות).
- Full Cone .1המיפוי הוא קבוע ,כל בקשה שתשלח מה ipוהפורט הפנימיים ימופו לאותו כתובת ipו
פורט חיצוניים .כמו כן כל מחשב אחר ששולח פקטה ל ipוהפורט החיצוני שממופים לכתובת פנימיות
יגיעו לכתובות האלו (גם אם המחשב ברשת הפנימית לא שלח בקשה).
- Restricted Cone .2כמו ה ,Fullהמיפוי קבוע אבל מחשב חיצוני עם כתובת Xכלשהי יכול לשלוח
פקטה למחשב פנימי רק אם המחשב הפנימי שלח בעבר פקטה למחשב החיצוני בכתובת .Xכלומר
מניחים שהמחשבים שנמצאים תחת NATהם מחשבי Clientsשלא אמורים לקבל פקטות בלי לבקש
זאת מראש .נשים לב שההגבלה היא רק על כתובת IPולא פורט.
- Port Restricted .3כמו Restrictedרק שההגבלה ספציפית יותר גם למספרי פורט .כלומר רק אם
המחשב הפנימי שלח בקשה לכתובת Xבפורט Pאז כתובת זאת והפורט הזה יכולים לשלוח בחזרה
פקטות .ישנה בעיה שעולה מידית ,מה קורה כששני מחשבים נמצאים מאחורי NATמסוג Port
, Restrictedאיך הם יתקשרו אחד עם השני? שכן ,הפורטים שאנחנו נשלח אליהם יהיו שונים בגלל
המיפוי.
- Symmetric .4כל הבקשות מאותו ipו פורט פנימיים ליעד כלשהו ימופו לאותו ipופורט חיצוניים .אם
המחשב הפנימי י שלח לכתובת אחרת המיפוי יהיה אחר .כמו כן ,רק מחשבים חיצוניים שקיבלו פקטה
יכולים לשלוח פקטת UDPבחזרה ל .internal host
(לא אעמיק כאן בחשיבות של זה ,אבל בגדול זה קשור לנושאים כמו firewallואבטחה ,איך אפשר לדעת
שחבילת UDPנשלחת במסגרת חיבור שבוצע בעבר).
Architectures
השיטות NATהנ״ל יכולות להעלות מספר סימני שאלה כאשר מבינים שברשת יש מספר ארכיטקטורות
- Client/Server .1השיטה הקלאסית שאנחנו מכירים ,שרת תמיד ער עם IPקבוע בעוד שהלקוחות
משתנים.
- Peer 2 Peer .2כל מחשב בתקשורת זאת הוא גם שרת וגם לקוח כאשר המערכות קצה הן
שרירותיות וה IPשל כולם הוא דינמי.
- Hybrid .3הלקוח משתף שרת בתוכן שלו והשרת מאפשר ללקוח להתחבר ללקוחות אחרים.
הבעייתיות מתחילה כאשר חלק מהמכשירים מדברים אחד עם השני מבלי שפנו אליהם קודם אבל הם
יושבים מאחורי .NATבמצבים מסוימים בקשות שיגיעו פשוט יחסמו בגלל המגבלות של שיטה זאת.
פתרון - 1השרת שנמצאת מאחורי ה NATיוסיף רשומה סטטית לטבלת ה NATשבאופן אוטומטי
מעבירה בקשות מפורט וכתובת מסויימת למחשב מקומי שנרצה.
פתרון - 2שימוש בשרת מתווך .מחשבים שמשתמשים באפליקציה מסוימת שולחים בקשה לשרת מה
שיגרום למיפוי ב nat tableולקוחות שרוצים לדבר עם המחשבים הנ״ל ישלחו בקשות לשרת המתווך והוא
יעביר אותם למחשבים וככה לא יחסם.
נשים לב שכדי שזה יעבוד השרת עצמו לא צריך לשבת מאחורי .NATכמובן גם שיש חסרון של איטיות
ופרטיות ,השרת המתווך לא יכול להבטיח הצפנה של המידע וכו׳.
אליס ובוב רוצים לתקשר אחד עם השני ללא מתווך ,בהתחלה נחזיק שרת Dirשהמטרה שלו היא לייצר
חורים ב NATוגם להחזיק מיפוי בין לקוחות שרוצים לדבר אחד עם השני.
אליס יעביר את הפרטים שלו ל Dirוככה יווצר 'חור' ב ( NATרשומה בטבלה) שלא חוסמת בקשות מ.Dir
אליס מאוחר יותר תרצה להקים חיבור עם בוב ותבקש משרת ה Dirאת הפרטים של המחשב של בוב
וככה נוצר 'חור' גם בטבלה של המחשב שלה.
ה Dirיעשה ״היכרות״ בין אליס ובוב על ידי כך שישלח בקשה לשניהם עם הפרטים של השני .כעת אליס
יכולה לפנות לבוב ,תשמור רשומה שלו בטבלה שלה ,אבל החבילה תזרק אצל בוב ,למרות זאת במקביל,
בוב שולח בקשה לאליס שומר את הרשומה אצלו בטבלה אבל החבילה תגיע הפעם לאליס כי היא שמרה
את בוב בטבלה ,כעת הם יכולים לתקשר בינהם.
בעיית הניתוב
כיצד ראוטר שרוצה להעביר בקשה למחשב יעד יודע מה המסלול הכי טוב על גבי הרשת שפקטה צריכה
לעבור? זאת אחת הבעיות ששכבת הרשת פותרת .שכבת הרשת ממדלת את הבעיה הזאת באמצעות גרף.
הקודקוד הם ראוטרים והקשתות הם חיבורים בין ראוטרים קרובים (לפי ה.)forward table
OSPF routing
-Open Shortest Path Firstפרוטוקול ניתוב שמשתמש באלגוריתם Shortest Path Firstונמצא תחת
קטגוריית אלגוריתמים מסוג ,link-stateכלומר כל כל ראוטר צריך להציף את מצב הערוצים לכל הראוטרים
ששייכים לאותו .ASברגע שיש את המידע הזה ניתן לקבוע את העלות לפי מספר פרמטרים כמו
bandwidthו delayאבל החלק המרכזי כאן הוא שניתן לבצע דייקסטרה בגלל שלכל מחשב יש את כל
טופולוגיית הרשת שלו ובאמצעות דייקסטרה אפשר לבנות את ה .forward table
הסיבוכיות של אלגוריתמים כאלה לעתים לא מאפשרת לנו להריץ אותם כל פעם בכל ראוטר כי זה כמו
גדולה של זכרון וזמן ,כמו כן הקשרים בין ראוטרים הם מאוד דינמיים .לכן מחלקים את האינטרנט
ל ,Autonomous Systemאזור אוטונומי ,ובכל אזור ניתן לקבוע באיזה אלגוריתם ניתוב להשתמש .כאשר
רוצים לדבר עם נתב מחוץ לאזור האוטונומי שלך צריך להשתמש בפרוטוקול BGPעליו נדבר בהמשך.
.1מתחילים מקודקוד מקור u ,ובודקים את השכנים שלו והעלות להגיע אליהן ,מעדכנים בטבלה אם
העלות להגיע אליהן כעת קטנה ממה שחישבנו קודם לכן(בשלב הראשון הכל ∞) ולוקחים את
המינימלי מבינהם ,במקרה הזה העלות של 3לקודקוד .w
.2מבצעים כיווץ קודקודים של uו wוכעת בודקים את השכנים של שניהם .ניתן לראות שהעלות להגיע
ל xיקרה יותר ולכן אם עושים זאת דרך wולכן לא מעדכנים אבל להגיע ל vכן קצר יותר כי העלות
היא 6ולכן מעדכנים בטבלה.
.3ממשיכים כך עד שמכסים את כל הקודקודים.
.4נשים לב שגם שומרים בטבלה מי הקודקוד שממנו הגענו כדי שנוכל לבנות מסלול.
כעת עם הגרף הזה ניתן לבנות את ה .forward tableבהתאם ליעד ,נוסיף את הממשק (השכן) שהכי קצר
להגיע ממנו ליעד הסופי .למשל עבור הגרף הנ״ל הטבלה תיראה ככה
מה שהראנו עד כה זה לא הפרוטוקול ניתוב אלא רק חלק ממנו שמשתמש בדיקסטרה .נשים לב שכל נתב
צריך להריץ דייקסטרה בעצמו וגם בעיות נוספת שעולות:
כלומר העלות המינימלית מ xל yהיא המינימום מבין העלות של xלהגיע לשכן שלו + vעלות ההגעה מ
vל .y
נסתכל על דוגמה שבה כל הקודקוד x,v,wמדווחיםל uאת העלות המינימלית שלהם לz
מתקיים
D u (z) = min(c u,v + D y (z), c u,x + D x (z), c u,w + D w (z)) = 4
.1נשים לב שבשיטה הזאת נוכל להגיע למצב של מעגלים כי אין לנו מידע על כל הגרף.
.2כמו כן ,גם כאן אם המידע משתנה קודקודים צריכים לעדכן את שכניהם בוקטור המעודכן אבל זה
דורש פחות עדכונים מאשר להריץ דייקסטרה מחדש.
אבל כמו שחדשות טובות מתפשטות מהר ככה גם ״חדשות רעות מתפשטות לאט״:
y .1רואה את השינוי אבל רואה ש zמגיע ל xבעלות .5מסיבה זאת yמודיע ל zשהעלות החדשה שלו
ל xתהיה 6דרך .z
z .2מזהה שהעלות ל xדרך yעולה 6אז zמחשב מחדש שהעלות שלו היא 1ל + yהעלות מ yל x
שזה 6כלומר סך הכל .7
y .3מזהה את העלות החדשה מ zל xכלומר 7ומחשב מחדש עלות של .8
.4התהליך הזה חוזר שוב ושוב עד שהעלות עולה על , 50רק בשלב הזה zו yיבינו שהמסלול בכלל ל
xהוא מצד השני.
A .1רוצה להוריד קובץ בגודל 5KBמ Gב .HTTP1.1מה הנתיב שיעברו בין החבילות בעזרת ?RIP
A .2רוצה להוריד 2קבצים מ Gבגודל 3KBכל אחד באזרת OSPFב .HTTP1.1
.3אותו הדבר אבל הפעם Dהוא פרוקסי.
נבין כיצד ניגשים לבעיה הזאת .ראשית ,מכיוון ש RIPהוא פרוטוקול מסוג ) Distance Vector (DVאזי כל
נתב לומד את המרחקים לכל היעדים דרך שכניו .ב RIPאנחנו מעדיפים את המסלול הקצר ביותר מבחינת
מספר הקפיצות .לאחרמ ספר סיבובים תחנה Aתלמד מתחנה Dשהיא יכולה להגיע דרכה ל Gבמסלול
הקצר ביותר.
נזכיר שבמהלך השידוך היחס בין גודל החלון וקצב השידור מתהפכים בהתאם לנוסחה
i−1
2 ⋅ d tran ≥ RT T
i−1 −3
2 ⋅ 10 ≥ 4.28ms → i > 3
המכפלות פי 2זה בגלל שעוברים שתי ראוטרים עד שמגיעים ליעד ובחזרה A .ל Gדרך Dובחזרה.
כלומר ,כאשר גודל החלון גדול יותר מ 4חבילות .אבל ,יש לנו סך הכל 5חבילות לשדר (כי הקובץ
הוא 5וה mssהוא )1כך שלא נגיע לזה.
סך הכל שידרנו 3חלונות ולכן הזמן כולו היה
−5
3RT T + 10 + connection establishment
כעת לסעיף השני ,משתמשים כעת ב OSPFכלומר צריך לחשב את משקלי הקשתות ,השהיית
ההתפשטות לכל קשת .נקבל:
כעת המסלול הקצר ביותר הוא .A → B → F → Gנשים לב שמכיוון שמדובר בחיבור persistentאזי נוכל
לבקש את שני המשאבים באותו חיבור ,לא נצטרך שני חיבורים נפרדים .אם מדובר בחיבור pipeliningאז
נוכל לשלוח את שתי הבקשות אחת אחרי השנייה בלי לחכות .אם מדובר בחיבור ללא ,pipeliningאזי
נבקש משאב ,נוריד אותו ואז נבקש את המשאב הבא על גבי אותו חיבור וננצל את גודל החלון .אם היינו
צריכים לפתוח חיבור נפרד ,גודל החלון היה מתאפס בחיבור החדש.
נשים לב ,שהורדת המשאב הראשון תהיה בעזרת החלון החילון והשני בחיבור ואילו הורדת המשאב
השלישי תהיה בעזרת החלון השלישי בלבד.
לגבי הסעיף האחרון ,כעת יש פרוקסי ,אזי Aיפתח חיבור TCPמול הפרוקסי ויבקש את המשאב ממנוD .
יפתח חיבור נפרד מול Gויבקש את המשאב .יוריד את המשאב ואז יעביר אותו ל .A