मौजूदा जवाबों में से कोई भी लोगों को यह नहीं बताता कि कैसे shutdownऔरclose टीसीपी प्रोटोकॉल स्तर पर काम करता है, इसलिए इसे जोड़ने के लायक है।
एक मानक टीसीपी कनेक्शन 4-वे फाइनल करके समाप्त हो जाता है:
- एक बार एक प्रतिभागी के पास भेजने के लिए अधिक डेटा नहीं होता है, यह दूसरे को एक फिन पैकेट भेजता है
- दूसरी पार्टी फिन के लिए एक एसीके लौटाती है।
- जब दूसरी पार्टी ने भी डेटा ट्रांसफर खत्म कर दिया, तो यह एक और फिन पैकेट भेजती है
- प्रारंभिक प्रतिभागी एक ACK देता है और अंतरण को अंतिम रूप देता है।
हालाँकि, टीसीपी कनेक्शन को बंद करने का एक और "उभरता हुआ" तरीका है:
- एक प्रतिभागी एक RST पैकेट भेजता है और कनेक्शन को छोड़ देता है
- दूसरा पक्ष एक RST प्राप्त करता है और फिर कनेक्शन को छोड़ देता है
डिफ़ॉल्ट सॉकेट विकल्पों के साथ विंडसरक के साथ मेरे परीक्षण में, shutdownदूसरे छोर पर एक फिन पैकेट भेजता है , लेकिन यह सब होता है। जब तक दूसरी पार्टी आपको फिन पैकेट नहीं भेजती तब तक आप डेटा प्राप्त करने में सक्षम हैं। एक बार यह हो गया, आपकाReceive 0 आकार का परिणाम मिलेगा। इसलिए यदि आप "भेजने" को बंद करने वाले पहले व्यक्ति हैं, तो डेटा प्राप्त करने के बाद आपको सॉकेट बंद कर देना चाहिए।
दूसरी ओर, यदि आप फोन करते हैं close करते हैं जबकि कनेक्शन अभी भी सक्रिय है (दूसरा पक्ष अभी भी सक्रिय है और आपके पास सिस्टम बफर में भी असंतोषजनक डेटा हो सकता है), दूसरी तरफ एक आरएसटी पैकेट भेजा जाएगा। यह त्रुटियों के लिए अच्छा है। उदाहरण के लिए, यदि आपको लगता है कि दूसरे पक्ष ने गलत डेटा प्रदान किया या उसने डेटा (डॉस अटैक?) प्रदान करने से इनकार कर दिया, तो आप सीधे डेटा को बंद कर सकते हैं।
नियमों के बारे में मेरी राय होगी:
- जब संभव हो
shutdownपहले विचार करेंclose
- यदि आपने शटडाउन करने का निर्णय लेने से पहले (0 आकार का डेटा प्राप्त) समाप्त कर दिया है, तो अंतिम भेजने (यदि कोई हो) के बाद कनेक्शन बंद कर दें।
- यदि आप कनेक्शन को सामान्य रूप से बंद करना चाहते हैं, तो कनेक्शन को बंद करें (SHUT_WR के साथ, और यदि आप इस बिंदु के बाद डेटा प्राप्त करने के बारे में परवाह नहीं करते हैं, तो SHUT_RD के साथ भी), और तब तक प्रतीक्षा करें जब तक आप 0 आकार का डेटा प्राप्त न कर लें, और फिर बंद करें। सॉकेट।
- किसी भी स्थिति में, यदि कोई अन्य त्रुटि हुई (उदाहरण के लिए समय समाप्त), बस सॉकेट बंद करें।
SHUT_RD और SHUT_WR के लिए आदर्श कार्यान्वयन
निम्नलिखित का परीक्षण नहीं किया गया है, अपने जोखिम पर विश्वास करें। हालांकि, मेरा मानना है कि यह चीजों को करने का एक उचित और व्यावहारिक तरीका है।
यदि टीसीपी स्टैक केवल SHUT_RD के साथ शटडाउन प्राप्त करता है, तो यह इस कनेक्शन को चिन्हित करेगा क्योंकि कोई अधिक डेटा अपेक्षित नहीं है। कोई भी लंबित और बाद में readअनुरोध (जो भी धागा हो, वे) फिर शून्य आकार के परिणाम के साथ वापस आ जाएंगे। हालाँकि, कनेक्शन अभी भी सक्रिय और प्रयोग करने योग्य है - आप अभी भी OOB डेटा प्राप्त कर सकते हैं, उदाहरण के लिए। इसके अलावा, ओएस इस कनेक्शन के लिए प्राप्त किसी भी डेटा को छोड़ देगा। लेकिन यह सब है, दूसरी तरफ कोई पैकेज नहीं भेजा जाएगा।
यदि टीसीपी स्टैक केवल SHUT_WR के साथ शटडाउन प्राप्त करता है, तो यह इस कनेक्शन को चिह्नित करेगा क्योंकि कोई और डेटा नहीं भेजा जा सकता है। सभी लंबित लेखन अनुरोध समाप्त हो जाएंगे, लेकिन बाद में लिखित अनुरोध विफल हो जाएंगे। इसके अलावा, एक फ़ाइनल पैकेट को दूसरी तरफ भेजा जाएगा ताकि उन्हें सूचित किया जा सके कि हमारे पास भेजने के लिए अधिक डेटा नहीं है।