सर्वर-साइड `TIME_WAIT` वास्तव में कैसे काम करता है?


11

मुझे पता है कि इस पर कुछ एसई प्रश्न हैं, और मुझे विश्वास है कि मैंने उनमें से कई को पढ़ा क्योंकि यह इस बिंदु पर आने से पहले मायने रखता है।

"सर्वर-साइड TIME_WAIT" से मेरा मतलब है कि सर्वर-साइड सॉकेट जोड़ी की स्थिति जो सर्वर साइड पर शुरू हुई थी।

मैं अक्सर इन बयानों को देखता हूं जो मुझे विरोधाभासी लगते हैं:

  1. सर्वर-साइड TIME_WAITहानिरहित है
  2. आपको अपने नेटवर्क ऐप्स को डिज़ाइन करना चाहिए जिससे क्लाइंट्स को पास होना चाहिए (), इसलिए क्लाइंट को सहन करना होगा TIME_WAIT

मेरे विरोधाभासी होने का कारण यह है कि क्योंकि TIME_WAITग्राहक को कोई समस्या हो सकती है - क्लाइंट उपलब्ध पोर्ट को चला सकता है, इसलिए संक्षेप में ऊपर TIME_WAITक्लाइंट पक्ष के बोझ को स्थानांतरित करने की सिफारिश कर रहा है जहां यह समस्या हो सकती है, से सर्वर साइड जहां यह कोई समस्या नहीं है।

क्लाइंट-साइड TIME_WAITबेशक सीमित संख्या में उपयोग के मामलों के लिए एक समस्या है। अधिकांश क्लाइंट-सर्वर समाधानों में एक सर्वर और कई क्लाइंट शामिल होंगे, क्लाइंट आमतौर पर इसके लिए पर्याप्त मात्रा में कनेक्शन के साथ सौदा नहीं करते हैं क्योंकि यह एक समस्या है, और यहां तक ​​कि अगर वे करते हैं, तो "sanely" के लिए कई सिफारिशें हैं ( के रूप में SO_LINGER0 मध्यांतर के साथ विरोध किया , या tcp_tw के साथ मध्यस्थता) sysctls) TIME_WAITबहुत अधिक कनेक्शन बनाने से बचने के द्वारा क्लाइंट-साइड का मुकाबला करें । लेकिन यह हमेशा संभव नहीं है, उदाहरण के लिए जैसे अनुप्रयोगों के वर्ग के लिए:

  • निगरानी प्रणाली
  • लोड जनरेटर
  • प्रॉक्सी

दूसरी तरफ, मुझे यह भी समझ में नहीं आ रहा है कि सर्वर-साइड कैसे TIME_WAITसहायक है। इसका कारण TIME_WAITयहां तक ​​है, यह इसलिए है क्योंकि यह बासी TCPअंशों को उन धाराओं में इंजेक्ट करने से रोकता है जो वे अब नहीं हैं। क्लाइंट-साइड के लिए TIME_WAITयह केवल उन ip:portजोड़ियों के साथ संबंध बनाने के लिए असंभव है, जो इस बासी कनेक्शन के साथ हो सकते थे (उपयोग किए गए जोड़े बाहर से बंद हैं TIME_WAIT)। लेकिन सर्वर साइड के लिए, इसे रोका नहीं जा सकता है क्योंकि स्थानीय पते में स्वीकार पोर्ट होगा, और हमेशा एक ही होगा, और सर्वर नहीं कर सकता है (AFAIK, मेरे पास केवल अनुभवजन्य प्रमाण है) केवल इसलिए कनेक्शन से इनकार करें एक आने वाली सहकर्मी वही पता जोड़ी बनाएगी जो सॉकेट टेबल में पहले से मौजूद है।

मैंने एक प्रोग्राम लिखा था जो दिखाता है कि सर्वर-साइड TIME-WAIT को अनदेखा किया गया है। इसके अलावा, क्योंकि परीक्षण 127.0.0.1 पर किया गया था, कर्नेल के पास एक विशेष बिट होना चाहिए जो यह भी बताता है कि क्या यह सर्वर साइड है या क्लाइंट साइड (क्योंकि अन्यथा ट्यूपल समान होगा)।

स्रोत: http://pastebin.com/5PWjkjEf , फेडोरा 22 पर परीक्षण किया गया, डिफ़ॉल्ट नेट कॉन्फिग।

$ gcc -o rtest rtest.c -lpthread
$ ./rtest 44400 s # will do server-side close
Will initiate server close
... iterates ~20 times successfully
^C
$ ss -a|grep 44400
tcp    TIME-WAIT  0      0            127.0.0.1:44400         127.0.0.1:44401   
$ ./rtest 44500 c # will do client-side close
Will initiate client close
... runs once and then
connecting...
connect: Cannot assign requested address

इसलिए, सर्वर-साइड के लिए TIME_WAIT, ठीक उसी पोर्ट जोड़ी पर कनेक्शन तुरंत और सफलतापूर्वक पुन: स्थापित किए जा सकते हैं, और क्लाइंट-साइड के लिए TIME-WAIT, दूसरी पुनरावृत्ति पर connect()सही असफल रहे

संक्षेप में, प्रश्न दो गुना है:

  • क्या सर्वर-साइड TIME_WAITवास्तव में कुछ भी नहीं करता है, और सिर्फ इसलिए RFCइसे छोड़ दिया जाता है क्योंकि इसके लिए आवश्यकता होती है?
  • क्या कारण यह है कि ग्राहक द्वारा सर्वर TIME_WAITको बंद करने की सिफारिश की गई है क्योंकि सर्वर बेकार है?

जब तक आप केवल 1 क्लाइंट को हवलदार नहीं करेंगे, आप बंदरगाहों से बाहर नहीं निकलेंगे। आपके पास क्लाइंट / सर्वर IP के प्रत्येक संयोजन के लिए 65535 पोर्ट हैं। 1.2.3.4:1111 से कनेक्शन 4.3.2.1:1111 से अलग है। यह सिर्फ प्रत्येक कनेक्शन के लिए मेमोरी के कुछ बाइट्स लेता है TIME_WAIT
मार्की 555

जवाबों:


1

में टीसीपी शर्तों सर्वर साइड यहां मेजबान राज्य सुनें में सॉकेट है कि इसका मतलब है।

RFC1122 TIME-WAIT राज्य में कुछ शर्तों के साथ नए कनेक्शन को स्वीकार करने की अनुमति देता है

        When a connection is closed actively, it MUST linger in
        TIME-WAIT state for a time 2xMSL (Maximum Segment Lifetime).
        However, it MAY accept a new SYN from the remote TCP to
        reopen the connection directly from TIME-WAIT state, if it:

शर्तों पर सटीक विवरण के लिए, कृपया RFC1122 देखें । मुझे उम्मीद है कि सॉकेट (लिस्टेन राज्य में सॉकेट) पर एक मिलान निष्क्रिय OPEN होना चाहिए।

सक्रिय OPEN (क्लाइंट साइड कनेक्ट कॉल) में ऐसा अपवाद नहीं है और RFC793 के अनुसार सॉकेट TIME-WAIT में होने पर त्रुटि देनी चाहिए ।

क्लाइंट पर सिफारिश के लिए मेरा अनुमान (टीसीपी शर्तों में होस्ट सक्रिय ओपीएन यानी कनेक्ट करने वाला प्रदर्शन करता है) शुरू की करीबी आपकी जैसी ही है, कि सामान्य स्थिति में यह अधिक होस्ट पर टाइम-वॉइट सॉकेट्स को फैलाता है जहां संसाधनों की प्रचुरता होती है सॉकेट्स। सामान्य स्थिति में ग्राहक SYN नहीं भेजते हैं जो सर्वर पर TIME-WAIT सॉकेट का पुन: उपयोग करेगा। मैं मानता हूं कि इस तरह की सिफारिश को लागू करना अभी भी उपयोग के मामले पर निर्भर करता है।


0

यह शायद सबसे स्पष्ट उदाहरण है कि टाइम-वॉइट वास्तव में क्या करता है और अधिक महत्वपूर्ण बात यह है कि यह महत्वपूर्ण क्यों है। यह भी बताता है कि क्यों 'मशीनों' के कुछ 'विशेषज्ञ' युक्तियों से बचने के लिए TIME-WAIT's को 'कम' करना है।


अभी भी यह स्पष्ट नहीं करता है कि क्लाइंट-> सर्वर कनेक्शन शुरू होने पर क्या होता है, और एक सर्वर ने उस जोड़ी को TIME_WAIT में बंद कर दिया है
Pawel Veselov

कृपया देखें stackoverflow.com/questions/1490196/… - उत्तर वही है जो आप देख रहे हैं।
खुशिल

0

Tcp सत्र की पहचान tupple (sourceIP, sourcePort, destip, destPort) द्वारा की जाती है। इसलिए TIME_WAIT हर tcp कनेक्शन पर काम करता है।

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


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

मुझे बहुत खेद है, आपका जवाब वास्तव में प्रश्न का उत्तर देता है, मैंने इसे गलत पढ़ा है, और मेरी टिप्पणी को वापस ले लिया है। हालाँकि, यह भी गलत प्रतीत होता है, क्योंकि मेरे पास कोड है जो यह साबित करने के लिए लगता है कि सर्वर-साइड से सुरक्षा नहीं है TIME_WAIT(मैंने उस जानकारी के साथ प्रश्न को अपडेट किया है)। @ खुशिल के संदर्भ में सर्वर-साइड TIME_WAITमामलों को पर्याप्त रूप से शामिल नहीं किया गया है।
पावेल वेसेलोव

-2

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


मुझे बहुत खेद है, लेकिन यह मेरे सवाल का जवाब नहीं देता है।
पावेल वेसेलोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.