2008-10-01 18 views
16

मैं कब तक क्लाइंट/सर्वर टीसीपी कनेक्शन जंगली में रहने की उम्मीद कर सकता हूं?टीसीपी कनेक्शन लाइफ

मैं चाहता हूं कि यह स्थायी रूप से जुड़े रहें, लेकिन चीजें होती हैं, इसलिए ग्राहक को फिर से कनेक्ट करना होगा। मैं किस बिंदु पर कहता हूं कि कुछ बाहरी उपकरणों के साथ समस्या होने के बजाय कोड में कोई समस्या है?

+1

हमेशा के लिए यदि आपके पास सही KeepAlive अंतराल है, तो संबंधित: http://stackoverflow.com/questions/3907537/keep-alive-tcp-ip-connected-sockets-over-the-internet-when-how-and- कितना/5149662 # 5149662 – markmnl

+0

1 999 में लोगों ने क्या जवाब दिया: https://ask.slashdot.org/story/99/09/19/2150236/longest-open-tcp-connection – user3041714

उत्तर

14

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

आम तौर पर मैं आवेदन स्तर के लिए जीवित दृष्टिकोण के लिए गया हूं, हालांकि आमतौर पर यह क्लाइंट स्पेक में रहा है इसलिए मुझे इसे करना पड़ा। लेकिन बस हर मिनट या दो डेटा के कुछ छोटे टुकड़े भेजें, जिसके लिए आप किसी प्रकार की पावती की अपेक्षा करते हैं।

चाहे आप स्वीकार करने में विफलता की गिनती करते हैं क्योंकि असफल कनेक्शन आपके ऊपर है। आम तौर पर मैंने अतीत में ऐसा किया है, हालांकि एक मामला था, मैंने कनेक्शन को छोड़ने के लिए लगातार तीन असफल प्रतिक्रियाओं का इंतजार किया था क्योंकि कनेक्शन के दूसरे छोर पर ऐप जवाब देने के बारे में बेहद निराशाजनक था "क्या आप वहां हैं ? " अनुरोध।

यदि कनेक्शन विफल रहता है, जो किसी बिंदु पर शायद उसी नेटवर्क पर मशीनों के साथ भी होगा, तो बस इसे पुन: स्थापित करने का प्रयास करें। यदि वह एक निश्चित संख्या में विफल रहता है तो आपको एक समस्या है। यदि आपका कनेक्शन थोड़ी देर के लिए कनेक्ट होने के बाद लगातार विफल रहता है, तो आपको एक समस्या है। दोनों मामलों में सबसे अधिक संभावना है कि यह संभवतः आपके कोड के बजाय कुछ नेटवर्क समस्या है, या शायद आपकी मशीन पर टीसीपी/आईपी स्टैक के साथ एक समस्या है (ज्ञात है: मुझे QNX के पुराने संस्करण पर इसके साथ समस्याएं आईं - यह बस यादृच्छिक रूप से गिरना)। यह कहकर कि आपके पास सॉफ़्टवेयर समस्या हो सकती है, और निश्चित रूप से जानने के लिए एकमात्र तरीका अक्सर एक डीबगर संलग्न करना है, या वहां कुछ लॉगिंग प्राप्त करना है। जैसे यदि आप हमेशा सफलतापूर्वक कनेक्ट कर सकते हैं, लेकिन एक बार बाद में आप एसीके प्राप्त करना बंद कर देते हैं, फिर भी कनेक्ट होने के बाद भी, हो सकता है कि आपका सर्वर डेडलॉकिंग हो या लूप या कुछ में फंस जाए।

वास्तव में उपयोगी है कि विभिन्न लोड स्थितियों के तहत लंबे समय से चलने वाले परीक्षणों की एक श्रृंखला स्थापित करने के लिए, केवल जिंदा रखने से ही आप वहां हैं?/एके अनुरोध और प्रतिक्रियाएं, सर्वर को बिल्कुल बल्लेबाजी करने के लिए।यह आम तौर पर आपको अपने सॉफ़्टवेयर घटकों के बारे में अधिक आत्मविश्वास प्रदान करेगा, और वास्तव में कुछ अजीब समस्याओं को हल करने में वास्तव में उपयोगी हो सकता है जो आपके कनेक्शन के साथ कोई समस्या नहीं पैदा करेगा, हालांकि लेन-देन के साथ समस्याएं हो सकती हैं। उदाहरण के लिए, मैं एक बार एक टेलीकॉम एप्लिकेशन सर्वर लिख रहा था जिसने संख्या अनुवाद जैसे सेवाएं प्रदान कीं, और हम इसे एक समय में दिनों के लिए चलाना छोड़ देंगे। बात यह थी कि जब शनिवार पूरे दौर में आया, तो वह हर कॉल अनुरोध को अस्वीकार कर देगा, जिसमें लाखों कॉल की राशि थी, और हमें नहीं पता था कि क्यों। यह कुछ दिनांक रूपांतरण कोड में एक टाइपो की वजह से हुआ जो केवल शनिवार को एक समस्या का कारण बनता था।

उम्मीद है कि मदद करता है।

7

यह वास्तव में कोई फर्क नहीं पड़ता, आपको वांछित व्यवहार होने पर अपने कोड को स्वचालित रूप से फिर से कनेक्ट करने के लिए डिज़ाइन करना चाहिए।

6

वास्तव में बताने का कोई तरीका नहीं है। टीसीपी के लिए निहित कुछ भी नहीं है जो कनेक्शन को निश्चित समय के बाद छोड़ने का कारण बनता है। किसी विश्वसनीय कनेक्शन पर किसी के पास अपटाइम के वर्षों हो सकते हैं, जबकि किसी अलग कनेक्शन पर किसी को हर 5 मिनट में फिर से कनेक्ट करना पड़ सकता है। बताने या अनुमान लगाने का कोई तरीका नहीं है।

-2

एक मूल्य चुनें। हर घंटे एक बूंद शायद ठीक है। 5 मिनट में दस अप्रत्याशित कनेक्शन बूंदें शायद एक समस्या का संकेत देती हैं।

टीसीपी कनेक्शन आमतौर पर बिना किसी ट्रैफ़िक के लगभग दो घंटे तक चलेंगे। या तो अंत रख-रखाव वाले पैकेट भेज सकते हैं, जो मुझे लगता है, आखिरी प्राप्त पैकेट पर सिर्फ एक एसीके है। यह आमतौर पर प्रत्येक सॉकेट या डिफ़ॉल्ट रूप से प्रत्येक टीसीपी कनेक्शन पर सेट किया जा सकता है।

एक आवेदन स्तर को जीवित रखना भी संभव है। एफ़टीपी, एसएमटीपी, पीओपी या आईएमएपी जैसे टेलनेट स्टाइल प्रोटोकॉल के लिए रिटर्न, न्यूलाइन और कमांड प्रॉम्प्ट वापस लेना जैसे कुछ।

+0

टीसीपी रखरखाव एक टाइमर है जो भिन्न होता है ओएस, तो विशिष्ट वातावरण में 2 घंटे भिन्न हो सकते हैं। – benc

2

आपको इसे जीवित रखने के लिए समय-समय पर कनेक्शन पर जाने वाले कुछ डेटा की आवश्यकता होगी - कई ओएस या फ़ायरवॉल निष्क्रिय कनेक्शन छोड़ देंगे।

11

मुझे लगता है कि यहां सबसे महत्वपूर्ण विचार सिद्धांत बनाम अभ्यास है।

मूल सिद्धांत यह था कि कनेक्शन में कोई जीवनकाल नहीं था। यदि आपके पास कनेक्शन था, तो यह तब तक खुला रहता था, भले ही कोई ट्रैफिक न हो, तब तक जब तक किसी ईवेंट को बंद न हो जाए।

नया सिद्धांत यह है कि अधिकांश ओएस रिलीज रख-रखाव टाइमर चालू हो गए हैं। इसका मतलब यह है कि कनेक्शन हमेशा के लिए चलेगा, जब तक कि दूसरी तरफ सिस्टम कभी-कभी टीसीपी-स्तरीय एक्सचेंज का जवाब देता है।

असल में, कई मानदंडों और स्थितियों के साथ कई कनेक्शन समाप्त हो जाएंगे।

दो वास्तव में अच्छे उदाहरण हैं: रिमोट क्लाइंट DHCP का उपयोग कर रहा है, पट्टा समाप्त हो गया है, और आईपी पता बदलता है।

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

आप पुन: कनेक्ट तर्क को कैसे कार्यान्वित करना चाहते हैं, यह आपके आर्किटेक्चर, कामकाजी माहौल और आपके प्रदर्शन लक्ष्यों पर बहुत निर्भर करता है।

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