2010-06-08 10 views
6

हमारे पास एक एप्लिकेशन सर्वर है जिसे नेटवर्क को भीड़ (ग्राहक की साइट पर) होने पर टीसीपी विंडो आकार 0 के साथ हेडर भेजने को देखा गया है।टीसीपी विंडो आकार 0, इंडी या विंडोज़ को किसने सेट कर रहा है?

हम जानना चाहते हैं कि यह इंडी या अंतर्निहित विंडोज परत है जो उपलब्ध थ्रूपुट के अनुकूलन में नाममात्र 64 के नीचे टीसीपी विंडो आकार को समायोजित करने के लिए ज़िम्मेदार है।
और हम 0 बनने पर कार्य करने में सक्षम होंगे (कुछ भी नहीं भेजता है, उपयोगकर्ता प्रतीक्षा => कोई अच्छा नहीं)।

तो, कोई भी जानकारी, लिंक, इंडी कोड सूचक स्वागत कर रहे हैं ...

अस्वीकरण: मैं एक नेटवर्क विशेषज्ञ नहीं हूँ। कृपया औसत मुझे औसत के लिए समझने योग्य रखें ;-)
नोट: यह Windows Server 2003 SP2 पर इंडी 9/D2007 है।

अधिक गोर विवरण:
डीसी सर्वर से बात करते हुए मध्य स्तर पर टीसीपी शून्य खिड़की के मामले होते हैं।
यह उसी क्षण होता है जब अंत उपयोगकर्ता क्लाइंट एप्लिकेशन में मंदी की शिकायत करते हैं (यही नेटवर्क जांच को ट्रिगर करता है)।
बाधाओं के कारण होने वाले 2 प्रमुख नेटवर्क मुद्दों की पहचान की गई है।
नेटवर्क की भीड़ होने पर टीसीपी शून्य विंडो तब हुई, लेकिन इसके कारण हो सकता है या नहीं भी हो सकता है।
हम जानना चाहते हैं कि ऐसा कब होता है और हमारे कोड में कुछ करने का तरीका होता है (कम से कम लॉगिंग)।

तो मूल प्रश्न यह है कि विंडो आकार 0 और कहां सेट करता है?
यह स्थिति कब होती है यह जानने के लिए कहां (इंडी?) को हुक करना है?

उत्तर

6

टीसीपी हेडर में विंडो आकार न तो बफर स्पेस सॉफ़्टवेयर द्वारा सेट किया गया है ताकि बफर स्पेस के आकार को प्रतिबिंबित किया जा सके। यदि आपका सर्वर विंडो सेट के साथ पैकेट भेज रहा है, तो शायद यह कारण है कि क्लाइंट सर्वर पर चल रहे एप्लिकेशन की तुलना में डेटा भेज रहा है, इसे पढ़ रहा है, और टीसीपी कनेक्शन से जुड़े बफर अब पूर्ण हो गए हैं।

यह क्लाइंट टीसीपी प्रोटोकॉल के लिए पूरी तरह से सामान्य ऑपरेशन है यदि क्लाइंट डेटा को तेज़ी से भेजता है तो सर्वर इसे पढ़ सकता है। क्लाइंट को डेटा भेजने से बचना चाहिए जब तक कि सर्वर गैर-शून्य विंडो आकार भेजता है (कोई बिंदु नहीं है, क्योंकि इसे किसी भी तरह से त्याग दिया जाएगा)।

यह क्लाइंट और सर्वर के बीच गंभीर समस्या को प्रतिबिंबित नहीं कर सकता है, लेकिन यदि स्थिति बनी रहती है तो शायद इसका मतलब है कि सर्वर पर चल रहे एप्लिकेशन ने प्राप्त डेटा को पढ़ना बंद कर दिया है (एक बार जब यह पढ़ना शुरू हो जाता है, तो यह बफर स्पेस को मुक्त करता है टीसीपी, और टीसीपी स्टैक एक नया गैर-शून्य विंडो आकार भेज देगा)।

+0

मूल प्रश्न यह है कि कौन सा विंडो आकार 0 और कहां सेट करता है? प्रश्न अपडेट कर रहा है ... –

+3

टीसीपी स्टैक (इस मामले में, विंडोज सर्वर का हिस्सा) विंडो आकार को शून्य पर सेट करता है, लेकिन ऐसा इसलिए होता है क्योंकि सर्वर (इंडी?) पर चल रहा एप्लिकेशन डेटा नहीं पढ़ रहा है। –

+0

तो यह मामला हो सकता है कि अगर मध्यम स्तर क्लाइंट ऐप को नेटवर्क क्लोजिंग के कारण वितरित नहीं कर सकता है, तो यह डीबी सर्वर से आने वाले डेटा को पढ़ना बंद कर देता है, जिसके बाद ओएस को टीसीपी विंडो आकार 0 पर सेट करने का कारण बनता है ... और चीजें बेहतर होने तक सभी प्रतीक्षा करते हैं। सही? –

2

शून्य के विंडो आकार के साथ एक टीसीपी हेडर इंगित करता है कि रिसीवर के बफर पूर्ण हैं। यह पाठक की तुलना में एक तेज लेखक के लिए एक सामान्य स्थिति है।

अपना विवरण पढ़ने में, यह स्पष्ट नहीं है कि यह अप्रत्याशित है या नहीं। प्रोटोकॉल विश्लेषक को खोलने के कारण क्या हुआ?

+0

यहां कुछ या कोई समस्या नहीं लगती है, लेकिन जब ऐसा हुआ, तो उसी सेकेंड में 40 की तरह थे। जांच तब शुरू हो गई है जब अंत उपयोगकर्ताओं ने क्लाइंट ऐप में ध्यान देने योग्य मंदी की शिकायत की थी। नेटवर्क के स्तर पर 2 प्रमुख मुद्दों की पहचान की गई जो बाधाओं का कारण बनेंगे। लेकिन टीसीपी शून्य विंडो इन स्थितियों के कारण हो सकती है या नहीं भी हो सकती है, और वैसे भी जब हम ऐसा करते हैं तो जागरूक होना चाहते हैं और कम से कम कुछ जानकारी लॉग इन करने में सक्षम होना चाहिए। –

2

आप अपने समस्या का समाधान करने में रुचि भी हो सकता है के बाद से:

आप क्या सर्वर साइड पर (एक है कि 0 विंडो का आकार संदेश भेजता है) चल रहा है पर कुछ नियंत्रण है, तो: आप समझते हैं क्या अपने सॉकेट के प्राप्त बफर के आकार को बढ़ाने के लिए SO_RCVBUF के साथ setockopt() का उपयोग करना?

इंडी में, setsockopt() TIdSocketHandle की एक विधि है। आपको इसे अपने सॉकेट से जुड़े सभी TIdSocketHandle ऑब्जेक्ट्स पर लागू करना चाहिए। और इंडी 9 में, वे आपके TIdTCPServer में संपत्ति बाइंडिंग के माध्यम से स्थित हैं।

मैं पहली बार SO_RCVBUF साथ getsockopt() उपयोग करने का सुझाव क्या ओएस एक डिफ़ॉल्ट बफर आकार के रूप में आप देता है देखने के लिए। फिर इसे काफी बढ़ाएं, लगातार परीक्षणों से हो सकता है, हर बार आकार को दोगुना कर सकता है। तुम भी एक getsockopt() को फिर से चलाने के बाद अपने setsockopt() फोन का बीमा करने कि आपके setsockopt वास्तव में प्रदर्शन किया गया था चाहते हो सकता है: वहाँ आम तौर पर एक ऊपरी सीमा है कि बफ़र आकार के लिए सॉकेट कार्यान्वयन सेट। और इस मामले में, आमतौर पर उस छत के मूल्य को स्थानांतरित करने के लिए एक ओएस-निर्भर तरीका होता है। लेकिन वे चरम मामले हैं, और आपको इसकी आवश्यकता नहीं है।

आप पक्ष overflowed हो जाता है कि पर स्रोत कोड पर नियंत्रण नहीं है, तो बस सॉफ्टवेयर वहाँ चल रहे कुछ पैरामीटर है कि बफर आकार बदलने के लिए उजागर करता है, तो देखने के लिए जाँच।

शुभकामनाएं!

+0

जानकारी के इस बहुत ही मूल्यवान टुकड़े के लिए धन्यवाद –

संबंधित मुद्दे