जॉन स्कीट का जवाब दुर्भाग्य से तस्वीर के एक बड़े हिस्से को छोड़ देता है - भेजें बफर आकार, और bandwidth-delay product जिस पाइप को आप लिख रहे हैं।
यदि आप एक सॉकेट का उपयोग करके एक बड़ी पाइप पर डेटा भेजने की कोशिश कर रहे हैं, और आप उस पाइप को भरने के लिए टीसीपी चाहते हैं, तो आपको पाइप के बैंडविड्थ-देरी उत्पाद के बराबर एक बफर आकार का उपयोग करने की आवश्यकता है। अन्यथा, टीसीपी पाइप को भर नहीं पाएगी क्योंकि यह हर समय पर्याप्त 'बाइट्स उड़ान में नहीं छोड़ेगा'।
एक कनेक्शन पर विचार करें जिसमें 1 गिगाबिट की गति है, और औसतन 10 मिलीसेकंड की एक तरफा विलंबता है। राउंड-ट्रिप-टाइम (उर्फ, उस समय की मात्रा जो आपके सॉकेट के बीच एक पैकेट भेजती है और वह उस पैकेट के लिए एक प्राप्त करती है और इस प्रकार अधिक डेटा भेजने के लिए जानता है) आमतौर पर विलंबता से दोगुनी होती है।
तो यदि आपके पास 1 गिगाबिट कनेक्शन है, और 20 मिलीसेकंड का आरटीटी है, तो उस पाइप में 1 गिगाबिट/सेकंड * 20 मिलीसेकंड == 2.5 मेगाबाइट डेटा उड़ान भरने पर पूरी तरह से उपयोग किया जा रहा है।
यदि आपका टीसीपी भेज बफर 2.5 मेगाबाइट से कम कुछ भी है, तो वह सॉकेट कभी भी पाइप का पूरी तरह से उपयोग नहीं करेगा - आपको कभी भी अपनी सॉकेट से प्रदर्शन का गीगाबिट/सेकंड नहीं मिलेगा।
यदि आपका एप्लिकेशन कई सॉकेट का उपयोग करता है, तो इस टीपीसी प्रेषण बफर का कुल आकार 2.5 एमबी होना चाहिए ताकि इस काल्पनिक 1 गीगाबिट/20 एमएस आरटीटी पाइप का पूरी तरह से उपयोग किया जा सके। उदाहरण के लिए, यदि आप 8192-बाइट बफर का उपयोग करते हैं, तो आपको उस पाइप को भरने के लिए 306 एक साथ टीसीपी सॉकेट की आवश्यकता होती है।
यदि यह सब संभव हो तो मैं बफर आकार को बढ़ाना चाहता हूं। हम इसे 32K बनाने के बारे में सोच रहे थे, लेकिन मैं उपरोक्त परिदृश्य के बारे में चिंतित था जहां मुझे प्राप्त आदेश कमांड नहीं मिलेगा, भले ही मैंने इसे एक ही प्रेषण में भेजा हो। – uriDium
क्षमा करें मैं यह उल्लेख करना भूल गया कि हम इसे ब्लॉकिंग मोड में कर रहे हैं। हालांकि मुझे यह कोई फर्क नहीं पड़ता है। – uriDium
@uriDium: आपको अपना कोड लिखना चाहिए ताकि यह एक प्राप्त में एक ही भेजें से सब कुछ प्राप्त करने पर भरोसा न करे। यह मॉडल नहीं है कि टीसीपी उपयोग करता है - यह एक * स्ट्रीम * मॉडल है। यदि आप उस स्ट्रीम को अलग-अलग संदेशों में विभाजित करना चाहते हैं, तो आपको या तो एक डिलीमीटर का उपयोग करना चाहिए या प्रत्येक संदेश के लिए लम्बाई उपसर्ग लिखना चाहिए ताकि क्लाइंट को कितना पढ़ना पड़े। –