जवाबों:
एक बुनियादी टीसीपी एसीके का कहना है "मुझे एक्स तक सभी बाइट्स मिले।" चयनात्मक ACK आपको यह कहने की अनुमति देता है "मुझे बाइट्स XY, और VZ प्राप्त हुआ।"
उदाहरण के लिए, यदि एक मेजबान ने आपको 10,000 बाइट और बाइट्स भेजे थे, तो 3000-5000 ट्रांजिट में खो गए थे, एसीके कहेगा "मुझे 3000 तक सब कुछ मिला।" दूसरे छोर को फिर से बाइट्स 3001-10000 पर भेजना होगा। SACK कह सकता है "मुझे 1000-2999 मिला, और 5001-10000" और मेजबान सिर्फ 3000-5000 भेजेगा।
यह एक उच्च बैंडविड्थ, हानिपूर्ण (या उच्च विलंब) लिंक पर बहुत अच्छा है। समस्या यह है कि यह विशिष्ट परिस्थितियों में गंभीर प्रदर्शन के मुद्दों का कारण बन सकता है। सामान्य टीसीपी एसीके सर्वर को उच्च-बैंडविड्थ, बच्चे के दस्ताने के साथ हानिपूर्ण कनेक्शन का इलाज करेगा (500 बाइट भेजें, प्रतीक्षा करें, 500 बाइट भेजें, प्रतीक्षा करें, आदि)। SACK यह उच्च देरी के लिए अनुकूल है क्योंकि यह जानता है कि उनकी संख्या कितनी पैकेट थे देता है वास्तव में खो दिया है।
यहां वह है जहां बुरी चीजें हो सकती हैं। एक हमलावर आपके सर्वर को एक लंबे समय के लिए एक बड़े पैमाने पर पुन: पेश करने की कतार रखने के लिए मजबूर कर सकता है, फिर उस संपूर्ण लानत को बार-बार संसाधित करें। यह सीपीयू को पेग कर सकता है, रैम को खा सकता है, और इसकी तुलना में अधिक बैंडविड्थ का उपभोग करना चाहिए। संक्षेप में, एक हल्का सिस्टम बीफ़ सर्वर के खिलाफ एक DoS आरंभ कर सकता है।
यदि आपका सर्वर मजबूत है और बड़ी फ़ाइलों की सेवा नहीं करता है, तो आप इसके खिलाफ बहुत अच्छी तरह से अछूते हैं।
यदि आप ज्यादातर उपयोगकर्ताओं के इंट्रानेट या अन्य कम-विलंबता समूह की सेवा कर रहे हैं, तो SACK आपको कुछ नहीं खरीदता है और बिना किसी प्रदर्शन हानि के सुरक्षा कारणों से बंद किया जा सकता है।
यदि आप कम-बैंडविड्थ लिंक (1Mbps या अंगूठे के पूर्ण रूप से मनमाने नियम के रूप में कम) पर हैं, तो SACK आपके कनेक्शन को संतृप्त करके सामान्य संचालन में समस्याएं पैदा कर सकता है और इसे बंद कर दिया जाना चाहिए।
अंततः, यह आपके ऊपर है। इस बात पर विचार करें कि आप क्या कर रहे हैं, किससे, किससे, और अपने जोखिम की डिग्री को सैक के प्रदर्शन प्रभावों के खिलाफ तौलें।
यहां SACK और इसकी भेद्यता का एक बड़ा अवलोकन है।
एक अन्य कारण यह है कि TCP SACK अक्सर अक्षम होता है, जिससे कि वहाँ पर नेटवर्क गियर की एक अद्भुत मात्रा होती है जो इस विकल्प को सही ढंग से संभालने में विफल रहता है। हम हर समय एक उच्च गति फ़ाइल स्थानांतरण उत्पाद के साथ देखते हैं जो हम प्रदान करते हैं जो टीसीपी का उपयोग करता है। सबसे आम मुद्दा गेटवे उपकरणों का है जो आंतरिक नेटवर्क से बाहरी नेटवर्क पर डिवाइस के माध्यम से टीसीपी पैकेटों को स्थानांतरित करने के लिए यादृच्छिक संख्याओं की तरह काम करता है, लेकिन यह टीसीपी सेक विकल्पों को "अन-रैंडमाइज" नहीं करता है जो रिमोट से भेजे जा सकते हैं। समाप्त। यदि वास्तविक SACK मानों का इन उपकरणों द्वारा उचित मानों में वापस अनुवाद नहीं किया जाता है, तो TCP सत्र कभी पैकेट नुकसान की स्थिति में पूरा नहीं होगा, जब दूरस्थ अंत SACK का उपयोग करके चयनात्मक ACK लाभ प्राप्त करने का प्रयास करता है।
संभवतः यह एक मुद्दे से कम होगा यदि लोग इस गियर में अधिक आक्रामक रूप से निवारक सॉफ़्टवेयर रखरखाव लागू करते थे, लेकिन वे नहीं करते हैं।
मैं कड़वे अनुभव से पुष्टि कर सकता हूं कि tcp_sack = 1 कुछ सिस्को एएसए फ़ायरवॉल उपकरणों का उपयोग करते समय लगभग 12mb से अधिक की फ़ाइलों के साथ sftp / rsync / scp इत्यादि पर डेटा ट्रांसफर को रोक देता है।
हर बार यह ठप हो जाएगा।
हम दो अलग-अलग डेटा केंद्रों में होस्ट ए और होस्ट बी के बीच एक समर्पित 100mbps लिंक पर स्थानांतरित कर रहे थे, दोनों सिस्को फ़ायरवॉल और सेंट के साथ हार्डवेयर स्विच करते हैं।
यह बफर आकारों को संशोधित करके कुछ हद तक कम किया जा सकता है - जैसे मैं होस्ट ए से होस्ट बी से 1 जीबी फ़ाइल को तब तक हस्तांतरित नहीं कर सकता जब तक कि मैं 2048 तक sftp बफर सेट नहीं करता, लेकिन मैं इस बात की परवाह किए बिना कर सकता था कि होस्ट B फाइल को ए से खींच रहा था।
Rsync और सेंड / रिसीव / बफर ट्यूनिंग का उपयोग करने वाली एक ही फाइल के साथ प्रयोगों ने मुझे A से B तक धकेल दी गई 1GB फ़ाइल के 70mb के आसपास yo उठने की अनुमति दी।
हालाँकि, अंतिम उत्तर होस्ट ए पर tcp_sack को निष्क्रिय करने के लिए था। शुरू में मक्खी पर कर्नेल में tcp_sack = 0 सेट करके - लेकिन अंततः - मैंने इसे अपने /etc/sysctl.conf में जोड़ा।