टीसीपी कनेक्शन के लिए अधिकतम पैकेट आकार क्या है या मैं अधिकतम पैकेट आकार कैसे प्राप्त कर सकता हूं?
टीसीपी कनेक्शन के लिए अधिकतम पैकेट आकार क्या है या मैं अधिकतम पैकेट आकार कैसे प्राप्त कर सकता हूं?
जवाबों:
टीसीपी पैकेट आकार पर पूर्ण सीमा 64K (65535 बाइट्स) है, लेकिन व्यावहारिकता में यह आपके द्वारा देखे गए किसी भी पैकेट के आकार से कहीं अधिक बड़ा है, क्योंकि निचली परतों (उदाहरण के लिए ईथरनेट) में कम पैकेट आकार होते हैं।
उदाहरण के लिए, ईथरनेट के लिए MTU (अधिकतम ट्रांसमिशन यूनिट) 1500 बाइट्स है। कुछ प्रकार के नेटवर्क (जैसे टोकन रिंग) में बड़े MTU होते हैं, और कुछ प्रकार में छोटे MTU होते हैं, लेकिन प्रत्येक भौतिक तकनीक के लिए मान निश्चित होते हैं।
यह एक उत्कृष्ट सवाल है और मैं वास्तव में इस पर बहुत काम करता हूं। 65k और 1500 जैसे "तकनीकी रूप से सही" उत्तरों के बहुत सारे हैं। मैंने नेटवर्क लेखन में बहुत काम किया है और 65k का उपयोग करना मूर्खतापूर्ण है, और 1500 आपको बड़ी परेशानी में भी डाल सकता है। मेरा काम बहुत सारे हार्डवेयर / प्लेटफ़ॉर्म / राउटर पर चलता है, और ईमानदारी से कहूं तो मेरे द्वारा शुरू की गई जगह 1400 बाइट्स है। यदि आपको 1400 से अधिक की आवश्यकता है, तो आप अपना रास्ता बढ़ाना शुरू कर सकते हैं, आप शायद 1450 पर जा सकते हैं और कभी-कभी 1480'ish पर जा सकते हैं? यदि आपको इससे अधिक की आवश्यकता है, तो बेशक आपको 2 पैकेट में विभाजित करने की आवश्यकता है, जिनमें से कई स्पष्ट तरीके हैं।
समस्या यह है कि आप एक डेटा पैकेट बनाने और इसे टीसीपी के माध्यम से लिखने की बात कर रहे हैं, लेकिन निश्चित रूप से हेडर डेटा पर और इसके बाद से निपटने के लिए है, इसलिए आपके पास "सामान" है जो आपको 1500 या उससे आगे रखता है .. और एक बहुत सारे हार्डवेयर की सीमाएँ कम होती हैं।
यदि आप इसे "पुश" करते हैं, तो आप वास्तव में कुछ अजीब चीजें प्राप्त कर सकते हैं। काटे गए डेटा, स्पष्ट रूप से, या गिराए गए डेटा को मैंने शायद ही कभी देखा है। दूषित डेटा भी शायद ही कभी लेकिन निश्चित रूप से होता है।
send()
।
1480'ish
होना चाहिए 1460
। IP हेडर और TCP हेडर प्रत्येक में कम से कम 20 बाइट लेते हैं (जब तक कि वैकल्पिक हेडर फ़ील्ड का उपयोग नहीं किया जाता है) और इस प्रकार ईथरनेट (गैर-जंबो फ्रेम) ईथरनेट के लिए अधिकतम है 1500 - 20 -20 = 1460
।
एप्लिकेशन स्तर पर, एप्लिकेशन टीसीपी को स्ट्रीम ओरिएंटेड प्रोटोकॉल के रूप में उपयोग करता है। बदले में टीसीपी में सेगमेंट और एब्स्ट्रैक्ट्स हैं जो अविश्वसनीय आईपी पैकेट के साथ काम करने के विवरण को दूर करते हैं।
टीसीपी पैकेट के बजाय सेगमेंट से संबंधित है। प्रत्येक टीसीपी सेगमेंट में एक अनुक्रम संख्या होती है जो टीसीपी हेडर के अंदर समाहित होती है। टीसीपी सेगमेंट में भेजा गया वास्तविक डेटा परिवर्तनशील है।
कुछ OS पर समर्थित getsockopt के लिए एक मूल्य है जिसे आप TCP_MAXSEG का उपयोग कर सकते हैं जो अधिकतम TCP खंड आकार (MSS) को पुनः प्राप्त करता है। हालांकि यह सभी ओएस पर समर्थित नहीं है।
मुझे यकीन नहीं है कि आप क्या करने की कोशिश कर रहे हैं, लेकिन यदि आप उस बफर आकार को कम करना चाहते हैं जिसका उपयोग आप भी देख सकते हैं: SO_SNDBUF और SO_RCVBUF।
Http://en.wikipedia.org/wiki/Maximum_segment_size के अनुसार , नेटवर्क पर IPV4 पैकेट के लिए डिफ़ॉल्ट सबसे बड़ा आकार 536 ओकटेट्स (आकार 8 बिट्स का बाइट्स) है। RFC 879 देखें
टीसीपी एपीआई में कोई पैकेट नहीं हैं।
अंतर्निहित प्रोटोकॉल में अक्सर पैकेट होते हैं, जैसे कि जब आईपी पर टीसीपी किया जाता है, जिसमें आपकी कोई रुचि नहीं है, क्योंकि उनके पास उपयोगकर्ता के साथ बहुत नाजुक प्रदर्शन अनुकूलन के अलावा कुछ भी नहीं है, जिसमें आप शायद रुचि नहीं रखते हैं (के अनुसार प्रश्न का सूत्रीकरण)।
यदि आप पूछते हैं कि send()
एक एपीआई कॉल में आप अधिकतम कितने बाइट्स कर सकते हैं, तो यह कार्यान्वयन और सेटिंग्स पर निर्भर है। आप आमतौर पर कई किलोबाइट तक की चॉइस के लिए सेंड () कॉल करेंगे, और सिस्टम के लिए हमेशा पूरी तरह से या आंशिक रूप से इसे स्वीकार करने से इंकार करने के लिए तैयार रहें, इस स्थिति में आपको अपने डेटा को फीड करने के लिए मैन्युअल रूप से छोटे चंक्स में विभाजन करना होगा। टीसीपी भेजें () एपीआई।
आमतौर पर, यह उस इंटरफ़ेस पर निर्भर करेगा जो कनेक्शन का उपयोग कर रहा है। आप शायद MTU पाने के लिए एक ioctl () का उपयोग कर सकते हैं, और यदि यह ईथरनेट है, तो आप आमतौर पर उस से हार्डवेयर हेडर के आकार को घटाकर अधिकतम पैकेट आकार प्राप्त कर सकते हैं, जो ईथरनेट के लिए 14 है जिसमें कोई वीएलएएन नहीं है।
यह केवल मामला है अगर MTU कम से कम नेटवर्क में बड़ा है। TCP आपके प्रभावी MTU को कम करने के लिए पथ MTU खोज का उपयोग कर सकता है।
सवाल यह है कि आप परवाह क्यों करते हैं?
ऐसा लगता है कि इंटरनेट पर अधिकांश वेब साइटें MTU के मूल्य के लिए 1460 बाइट्स का उपयोग करती हैं। कभी-कभी यह 1452 है और अगर आप वीपीएन पर हैं तो यह IPSec हेडर के लिए और भी अधिक गिर जाएगा।
डिफ़ॉल्ट विंडो का आकार अधिकतम 65535 बाइट तक भिन्न होता है। मैं अपने स्वयं के स्रोत आईपी मूल्यों को देखने के लिए और अन्य इंटरनेट विक्रेता क्या उपयोग कर रहे हैं यह देखने के लिए मैं http://tcpcheck.com का उपयोग करता हूं ।
एक समाधान सॉकेट विकल्प TCP_MAXSEG ( http://linux.die.net/man/7/tcp ) को उस मूल्य पर सेट करने के लिए हो सकता है जो अंतर्निहित नेटवर्क के साथ "सुरक्षित" है (उदाहरण के लिए 1400 ईथरनेट पर सुरक्षित होने के लिए सेट)। सिस्टम कॉल भेजने में एक बड़े बफर का उपयोग करें। इस तरह से कम सिस्टम कॉल हो सकती हैं जो महंगी हैं। कर्नेल एमएसएस से मिलान करने के लिए डेटा को विभाजित करेगा।
इस तरह आप छोटे डेटा से बच सकते हैं और आपके एप्लिकेशन को छोटे बफ़र्स के बारे में चिंता करने की ज़रूरत नहीं है।
IP प्रोटोकॉल (Ip4) में एक टीसीपी सेटिंग के लिए पैकेट का आकार। इस क्षेत्र (टीएल) के लिए, 16 बिट्स आवंटित किए जाते हैं, तदनुसार पैकेट का अधिकतम आकार 65535 बाइट्स: आईपी प्रोटोकॉल विवरण है