למינציה של TCP

מה זה Laminar?

Laminar היא מסגרת חדשה לבקרת עומסים ב-TCP, שמפרידה בין תזמון העברת נתונים, שקובעת במדויק מתי הנתונים יישלחו, לבין בקרת גודש בלבד, שקובעת את כמות הנתונים הכוללת שנשלחת במהלך כל RTT.

אלגוריתם ברירת המחדל לתזמון שידור הוא הטמעה קפדנית של עקרון שימור החבילות של ואן ג'ייקובסון [Jacobson88]. הנתונים שמגיעים למקלט גורמים ל-ACK, שגורמים לשולח להעביר כמות שווה של נתונים חזרה לרשת. משתנה המצב הראשי הוא משתמע על כמות הנתונים ומפתחות ה-ACK שמסתובבים ברשת. המצב הזה נמדד באמצעות כלי אומדן משופר של tcp_Packages_in_flight() (שנקרא גם total_pipe). ה-total_pipe מבוסס על 'pipe' כפי שמתואר ב-RFC 3517, אבל כולל גם את כמות הנתונים המדווחת על ידי ה-ACK הנוכחי ושידורים בהמתנה שעברו בקרת עומס אבל ממתינים לאירועים אחרים כמו TSO.

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

בכל זמן נתון, total_pipe שונה מ-CCwin, האלגוריתם של תזמון השידור מתאים מעט את מספר הקטעים שנשלחו בתגובה לכל ACK. הפעלה איטית והפחתת הקצב היחסי [PRR] (תחליף לחצי קצב) מוטמעות באלגוריתם של תזמון ההעברה.

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

ה-framework של Laminar משנה את פילוסופיית העיצוב הבסיסית של בקרת העומס ב-TCP, ויכול להיות שיש לו השלכות רחבות, מעבר לתיקון עצמו. התיקון הזה מאפשר לאנשים להתנסות בקוד, להגיב ולעזור לגלות מקרים פינתיים שאולי התעלמו מהם. בנוסף, התיקון חלקי כי מספר אלגוריתמים עדיין חסרים, ובאופן ספציפי: אלגוריתמים לבקרת עומסים מלבד CUBIC ו-Reno, אימות CUBIC ו-Reno, מדדי יעד וכו'. נשמח מאוד לקבל עזרה בקוד מחדש של חלק מהאלגוריתמים האחרים.

המסגרת הלמינרית והמניע שלה מתוארים בצורה מפורטת יותר בטיוטה של אינטרנט, draft-mathis-tcpm-tcp-laminar.

יש לשלוח תגובות והצעות לכתובת mattmathis@google.com.

הפרויקט הזה הוא חלק מהמאמצים של Google לשפר את המהירות של האינטרנט באמצעות שיפורי פרוטוקול.

הערות להטמעה

Laminar מיושם בעיקר ב-3 פונקציות (tcp_input.c):

הפרמטרים Tcp_cong_avoid() ו-tcp_mult_decr() מבצעים בקרת עומס באמצעות AIMD באמצעות משתנה המצב CCwin. מלבד האפשרות 'ביטול', שתי הפונקציות האלה הן המקומות היחידים שבהם CCwin משתנה. (שתי הפונקציות יפעילו רכיבי handler ספציפיים למודול עומס).

הפונקציה Tcp_laminar_schedule() קובעת כמה נתונים יישלחו בתגובה לכל ACK. היא מיישמת את שימור החבילות של ואן ג'קובסון, מגדילה או מקטינה מעט את החבילות כדי לגרום ל-tcp_bundles_in_flight() להתמזג ל-CCwin.

יש שינויים חשובים במעריך tcp_Packages_in_flight() כדי שיהיה קבוע ברוב אירועי הפרוטוקול. האפליקציות ממתינות, ההתאמות ב-tcp_laminar_schedule() ואובדן החבילות בפועל משתנות לפי הצורך tcp_packets_in_flight() . עיבוד ACK, TSO ורוב האירועים האחרים לא פועלים בהם. שימו לב: כשיש הפסדים, מספר החבילות בפועל בטיסה משתנה באופן מיידי, אבל הוא לא בא לידי ביטוי במעריך tcp_bundles_in_flight() עד שהמכונות להעברה חוזרת מסומנות כחבילות שאבדו ומצטברות lost_out.

הורדת התיקון

התיקון הזה מתנגד ל-net-next של דייב מילר, והוא חל באופן תקין על 3.5-rc2.
NB: מודולים של בקרת עומסים אחרים ש-Reno ו-CUBIC לא עודכנו ולא יעברו קומפילציה. אם התצורה יוצרת מודולים אחרים לבקרת עומסים, כמו vegas, ניתנת להתאמה, במהירות גבוהה וכו', יש להשבית אותם תחילה.