डिफ़ॉल्ट रूप से, जब दोनों tcp_tw_reuse
और tcp_tw_recycle
अक्षम होते हैं, तो कर्नेल यह सुनिश्चित करेगा कि TIME_WAIT
राज्य में सॉकेट पर्याप्त रूप से उस स्थिति में रहेंगे - लंबे समय तक यह सुनिश्चित करने के लिए कि भविष्य के कनेक्शन से संबंधित पैकेट पुराने कनेक्शन के देर पैकेट के लिए गलत नहीं होंगे।
जब आप सक्षम करते हैं tcp_tw_reuse
, तो TIME_WAIT
राज्य में सॉकेट्स का उपयोग समाप्त होने से पहले किया जा सकता है, और कर्नेल यह सुनिश्चित करने की कोशिश करेगा कि टीसीपी अनुक्रम संख्याओं के बारे में कोई टक्कर नहीं है। यदि आप tcp_timestamps
(उर्फ PAWS, सुरक्षा के खिलाफ रैपिड अनुक्रम अनुक्रम के लिए) सक्षम करते हैं, तो यह सुनिश्चित करेगा कि उन टकराव नहीं हो सकते। हालाँकि, आपको दोनों छोर पर सक्षम होने के लिए टीसीपी टाइमस्टैम्प चाहिए (कम से कम, यही मेरी समझ है)। Gory विवरण के लिए tcp_twsk_unique की परिभाषा देखें।
जब आप सक्षम करते हैं tcp_tw_recycle
, तो कर्नेल अधिक आक्रामक हो जाता है, और दूरस्थ मेजबानों द्वारा उपयोग की जाने वाली टाइमस्टैम्प पर धारणाएं बना देगा। यह अंतिम टाइमस्टैम्प को ट्रैक करेगा जिसका उपयोग प्रत्येक दूरस्थ होस्ट द्वारा TIME_WAIT
राज्य में एक कनेक्शन है ), और टाइमस्टैम्प सही ढंग से बढ़ने पर सॉकेट को फिर से उपयोग करने की अनुमति देता है। हालाँकि, यदि होस्ट द्वारा उपयोग किया जाने वाला टाइमस्टैम्प बदल जाता है (अर्थात समय में वापस आ जाता है), तो SYN
पैकेट चुपचाप गिरा दिया जाएगा, और कनेक्शन स्थापित नहीं होगा (आपको "कनेक्ट टाइमआउट" के समान त्रुटि दिखाई देगी)। यदि आप कर्नेल कोड में गोता लगाना चाहते हैं, तो tcp_timewait_state_process की परिभाषा एक अच्छा प्रारंभिक बिंदु हो सकती है।
अब, टाइमस्टैम्प को समय में वापस नहीं जाना चाहिए; जब तक:
- होस्ट को रिबूट किया गया है (लेकिन फिर, जब तक यह वापस आता है, तब तक
TIME_WAIT
सॉकेट संभवतः समाप्त हो जाएगा, इसलिए यह एक गैर मुद्दा होगा);
- आईपी पते को कुछ और द्वारा पुन: उपयोग किया जाता है (
TIME_WAIT
कनेक्शन थोड़े रहेंगे, लेकिन अन्य कनेक्शन संभवतः टकरा TCP RST
जाएंगे और इससे कुछ जगह खाली हो जाएगी);
- नेटवर्क एड्रेस ट्रांसलेशन (या स्मार्टी-पैंट फ़ायरवॉल) कनेक्शन के बीच में शामिल है।
बाद के मामले में, आप एक ही आईपी पते के पीछे कई होस्ट कर सकते हैं, और इसलिए, टाइमस्टैम्प के विभिन्न अनुक्रम (या, कहा जाता है कि टाइमस्टैम्प को फ़ायरवॉल द्वारा प्रत्येक कनेक्शन पर यादृच्छिक किया जाता है)। उस स्थिति में, कुछ होस्ट यादृच्छिक रूप से कनेक्ट करने में असमर्थ होंगे, क्योंकि वे एक पोर्ट पर मैप किए जाते हैं, जिसके TIME_WAIT
लिए सर्वर की बाल्टी में एक नया टाइमस्टैम्प होता है। इसीलिए डॉक्स आपको बताता है कि "NAT डिवाइस या लोड बैलेंसर सेटिंग के कारण ड्रॉप फ्रेम शुरू कर सकते हैं"।
कुछ लोग अकेले छोड़नेtcp_tw_recycle
tcp_tw_reuse
tcp_timewait_len
की सलाह देते हैं, लेकिन सक्षम और कम । मैं सहमत हूँ :-)