לחיצת היד של SOCKS הצליחה. כעת הממסר קורא מהלקוח, כותב אל היעד, ממתין לתגובה מלאה ורק אז קורא שוב מהלקוח. רצף זה עלול לתקוע יישום תקין לחלוטין.

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

העבירו בייטים, לא תנועות משוערות

קריאת קבלה מחזירה את הבייטים הזמינים בהתאם לדגליה ולמצב השקע. היא אינה מודיעה לממסר כללי שתגובת היישום הושלמה. המתנה לכך שחוצץ גדול שרירותי יתמלא עלולה למנוע העברת ההודעה הקטנה שהעמית זקוק לה כדי להמשיך.

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

החזיקו שני חוצצים ממתינים מוגבלים

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

שליחה עשויה לכתוב פחות בייטים מהמבוקש. שמרו את החלק שלא נכתב; אל תזרקו אותו ואל תשחזרו את כל החוצץ. שקע שאינו ניתן לכתיבה זמנית הוא סיבה להמתין לאירוע המוכנות הנכון, לא להסתובב ללא הרף.

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

סוף בכיוון אחד דורש מדיניות

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

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

מאמרים קשורים