עוד תקלת רשת מוזרה

בהמשך לפוסט האחרון על בעיות רשת מוזרות, הנה עוד אחת.
אפליקציית ג'אווה שכתבנו עובדת טוב לרוב האנשים, אבל משום מה "נתקעת" בהתחברות לחלק מהאנשים.
בבדיקה, נראה שהאפליקציה מתחברת לשרת, מקבלת תשובה ממנו, אבל לא קוראת את התוכן של התשובה.
בבדיקה מעמיקה יותר, רואים שהאפליקציה ניגשת לשדה הContent-Length של התשובה, ומקבלת משם 1-, מה שמרמז על זה שאין בתגובת הHTTP שדה של Content-Length.
בדיקה קטנה עם WireShark (לשעבר Ethereal) מראה את זה:

[code]
HTTP/1.1 200 OK
Date: Thu, 31 Jan 2008 13:21:24 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=j2hx2qvprzec3u55htsykh45; path=/; HttpOnly
Cache-Control: private
Content-Type: text/html
Content-Length: 20877
[/code]

(המשך התגובה נחתך מחוסר עניין).

אז נראה שהכל בסדר, יש Content-Length בתגובה.
ובכל זאת, אפליקציית הJava מקבלת 1-, ובדיבוג מעמיק אין רמז לContent-Length באובייקט שמייצג את תגובת הHTTP.
אז מה קורה פה?

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

[code]
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Date: Thu, 31 Jan 2008 13:21:24 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=j2hx2qvprzec3u55htsykh45; path=/; HttpOnly
Cache-Control: private
Content-Type: text/html
————–: —–
[/code]

יש פה כמה דברים שצריך לשים אליהם לב:
1. פתאום יש לנו בתשובה Transfer-Encoding: chunked.
2. מה זה איפה שקודם היה לנו Content-Length? ————–: —– ?? איזה וודו שחור פועל פה?

יש לציין שבזמן שאני מקבל את הנתונים האלו בתוכנית, אני מקבל נתונים זהים למה שראיתי קודם WireShark, כלומר – המחשב מקבל את הנתונים בצורה תקינה, אבל התוכנית מקבלת אותם אחרי טיפול.

כדי לנטרל אפשרות שJava התחלקה על השכל, ניסיתי (בעזרתו של חבר מהעבודה) להריץ תוכנית שעושה את אותו דבר בדיוק, רק שכתובה בC#.
לא במפתיע, התוצאה זהה: אין Content-Length, במקום זה יש שורת מינוסים.
מסקנה, Java לא אשמה הפעם.

אז מה נשאר?
מי משחק בתעבורת הרשת במחשב? אולי זה ווירוס, ואולי זה אנטי וירוס; בכל מקרה מדובר בתוכנה נאלחת.
לא במפתיע, האשם הוא הSymantec Client Firewall, שסורק בזמן אמת את תעבודת הHTTP, מחרבש אותה קלות, ומעביר את הזבל לתוכניות התמימות.
ברגע שנטרלתי את הסריקה שלו את פורט 80, הכל הסתדר.

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

אם הייתי כותב ווירוסים, הייתי משתמש במידע הזה בכיף כדי לזהות שהמחשב מריץ את הFirewall של סימנטק, שמשאיר עקבות כמו חזיר בחנות בורקסים.

Facebook Comments

10 תגובות בנושא “עוד תקלת רשת מוזרה”

  1. מעולה, מעולה!!

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

    מה שלא הבנתי זה למה רואים דבר אחד ב- WireShark ודבר שני ב- TCP הנקי. מה זה WireShark אני יודע, אבל איפה ראית את הדבר השני? ולמה דווקא שם זה לא בסדר? (ה- WireShark "ראשוני" יותר, לא?)

    ובכל מקרה זה בדיוק דבר ששווה לך לשלוח לאיפה שהוא, ביחוד בגלל שזה מערב שם של חברה גדולה.

  2. (וגם אם הייתי מכבה את האנטי וירוס, אני בספק אם הייתי עולה על הבעיה המדוייקת). רק הייתי יודע שבלי ה- AV זה עובד. פה אתה גם מראה שה- AV הוא שאשם, וזה דבר חשוב מאוד.

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

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

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

  4. תודה על ההסברים.

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

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

סגור לתגובות.