एक टीसीपी कनेक्शन के लिए अधिकतम पैकेट का आकार


196

टीसीपी कनेक्शन के लिए अधिकतम पैकेट आकार क्या है या मैं अधिकतम पैकेट आकार कैसे प्राप्त कर सकता हूं?


24
टीसीपी स्ट्रीम आधारित है। क्या कोई विशेष कारण है कि आप व्यक्तिगत पैकेट के बारे में चिंता कर रहे हैं?
मत्ती विर्ककुनेन

27
क्योंकि इसके नीचे की परतें पैकेट आधारित होती हैं ... विशिष्ट कार्यान्वयन -> परत 1 - ईथरनेट PHY, परत 2 - ईथरनेट मैक (मैक पैकेट परिभाषा, परत 3 - इंटरनेट प्रोटोकॉल (IP पैकेट परिभाषा), परत 4 - टीसीपी (ट्रांसमिशन कंट्रोल प्रोटोकॉल) ) - इसके नीचे पैकेट आधारित सेवा का उपयोग करता है।

2
'टीसीपी पैकेट' जैसी कोई चीज नहीं है। टीसीपी सेगमेंट हैं , जिनकी लंबाई 32-बिट शब्द द्वारा वर्णित है, और वे आईपी पैकेट के भीतर या उसके भीतर समाहित हैं , जिनकी लंबाई 16 बिट्स में वर्णित है। ईथरनेट फ्रेम भी हैं, जिसमें ये सभी चीजें हैं। आप इनमें से किस चीज के बारे में पूछ रहे हैं? किसी भी स्थिति में यदि आप टीसीपी का उपयोग कर रहे हैं, तो आपको किसी भी तरह से उनमें से किसी के बारे में चिंता करने की आवश्यकता नहीं है: टीसीपी और आईपी आपके लिए यह सब देखते हैं।
लोर्ने

जवाबों:


178

टीसीपी पैकेट आकार पर पूर्ण सीमा 64K (65535 बाइट्स) है, लेकिन व्यावहारिकता में यह आपके द्वारा देखे गए किसी भी पैकेट के आकार से कहीं अधिक बड़ा है, क्योंकि निचली परतों (उदाहरण के लिए ईथरनेट) में कम पैकेट आकार होते हैं।

उदाहरण के लिए, ईथरनेट के लिए MTU (अधिकतम ट्रांसमिशन यूनिट) 1500 बाइट्स है। कुछ प्रकार के नेटवर्क (जैसे टोकन रिंग) में बड़े MTU होते हैं, और कुछ प्रकार में छोटे MTU होते हैं, लेकिन प्रत्येक भौतिक तकनीक के लिए मान निश्चित होते हैं।


15
"लेकिन मूल्य प्रत्येक भौतिक तकनीक के लिए तय किए गए हैं" - यह सच नहीं है। ईथरनेट में अधिकतम MTU 1500 हुआ करता था, लेकिन आप कम उपयोग कर सकते थे। जंबो फ्रेम के आगमन के साथ, कोई वास्तविक निर्दिष्ट अधिकतम नहीं है, और हार्डवेयर और ड्राइवर के आधार पर अधिकतम भिन्न होता है।
व्हर्लविंड

4
@Hirl: सच है, वे कॉन्फ़िगर करने योग्य हैं, लेकिन आम तौर पर वे नहीं हैं; "विन्यास योग्य" व्यक्तिपरक है क्योंकि ऐसा करने के लिए किसी को कर्नेल में तल्लीन करना होगा। यह कुछ ऐसा नहीं है जो आवेदन के स्तर पर टिंकर कर सकता है, जहां ओपी लगता है।
ईथर

3
@ हिरोप्रोटैगनिस्ट: 1500 एक अधिकतम है, इसलिए 600 का होना कोई आश्चर्य की बात नहीं है।
निकोलस राउल

28
यह 64K (65535 बाइट्स) सीमा क्यों है? क्योंकि TCP Header में Window Size विशेषता केवल 16 बिट्स है। मैं सिर्फ उल्लेख करना चाहता था, किसी समय किसी की मदद कर सकता था ..... महान जवाब btw @ आगे!
काचो सांता

2
इसके अलावा, विंडो स्केलिंग का उपयोग करके इसे बढ़ावा देना संभव है। उस स्थिति में अधिकतम 1 GiB है
मार्टिन मेल्का

86

यह एक उत्कृष्ट सवाल है और मैं वास्तव में इस पर बहुत काम करता हूं। 65k और 1500 जैसे "तकनीकी रूप से सही" उत्तरों के बहुत सारे हैं। मैंने नेटवर्क लेखन में बहुत काम किया है और 65k का उपयोग करना मूर्खतापूर्ण है, और 1500 आपको बड़ी परेशानी में भी डाल सकता है। मेरा काम बहुत सारे हार्डवेयर / प्लेटफ़ॉर्म / राउटर पर चलता है, और ईमानदारी से कहूं तो मेरे द्वारा शुरू की गई जगह 1400 बाइट्स है। यदि आपको 1400 से अधिक की आवश्यकता है, तो आप अपना रास्ता बढ़ाना शुरू कर सकते हैं, आप शायद 1450 पर जा सकते हैं और कभी-कभी 1480'ish पर जा सकते हैं? यदि आपको इससे अधिक की आवश्यकता है, तो बेशक आपको 2 पैकेट में विभाजित करने की आवश्यकता है, जिनमें से कई स्पष्ट तरीके हैं।

समस्या यह है कि आप एक डेटा पैकेट बनाने और इसे टीसीपी के माध्यम से लिखने की बात कर रहे हैं, लेकिन निश्चित रूप से हेडर डेटा पर और इसके बाद से निपटने के लिए है, इसलिए आपके पास "सामान" है जो आपको 1500 या उससे आगे रखता है .. और एक बहुत सारे हार्डवेयर की सीमाएँ कम होती हैं।

यदि आप इसे "पुश" करते हैं, तो आप वास्तव में कुछ अजीब चीजें प्राप्त कर सकते हैं। काटे गए डेटा, स्पष्ट रूप से, या गिराए गए डेटा को मैंने शायद ही कभी देखा है। दूषित डेटा भी शायद ही कभी लेकिन निश्चित रूप से होता है।


लगभग 600 बाइट्स के लिए GET अनुरोध औसत क्यों हैं?

10
आपका मतलब 64K है, 65K नहीं। मुझे नहीं पता कि आप जिस जगह से शुरू करते हैं उसका मतलब 1400 बाइट्स है। ' आपको टीसीपी एपीआई में पैकेट के आकार के बारे में चिंता करने की आवश्यकता नहीं है। यह एमटीयू पथ को निर्धारित करने और देखने का ध्यान रखता है। कोई कारण नहीं है कि आप सुविधाजनक होने पर 2G नहीं लिख सकते send()
लोर्न

19
आपका 1480'ishहोना चाहिए 1460। IP हेडर और TCP हेडर प्रत्येक में कम से कम 20 बाइट लेते हैं (जब तक कि वैकल्पिक हेडर फ़ील्ड का उपयोग नहीं किया जाता है) और इस प्रकार ईथरनेट (गैर-जंबो फ्रेम) ईथरनेट के लिए अधिकतम है 1500 - 20 -20 = 1460
यूजीन बेरेसोव्स्की

2
मैंने वायरशर्क के माध्यम से देखा है कि एक सर्वर बड़े पैकेट (1400 बाइट से अधिक) भेजता है और ग्राहक इसे अधिकतम 1400 बाइट के कुछ पैकेट के रूप में असंतुष्ट प्राप्त करता है। पैकेट के निराकरण के लिए कौन जिम्मेदार है? @ नेकटारियो ...?
inbaly

2
@EugeneBeresovsky वैकल्पिक हेडर के साथ अच्छी तरह से + 40 से अधिक बाइट्स तक है, लेकिन यह 1420 है इसलिए यह परिवर्तनशील है। 1400 के सुझाव के साथ आपको थोड़ी पैडिंग मिलती है। मैं 1408 के साथ जाऊँगा क्योंकि यह 128 से विभाज्य है
Garet Claborn

22

एप्लिकेशन स्तर पर, एप्लिकेशन टीसीपी को स्ट्रीम ओरिएंटेड प्रोटोकॉल के रूप में उपयोग करता है। बदले में टीसीपी में सेगमेंट और एब्स्ट्रैक्ट्स हैं जो अविश्वसनीय आईपी पैकेट के साथ काम करने के विवरण को दूर करते हैं।

टीसीपी पैकेट के बजाय सेगमेंट से संबंधित है। प्रत्येक टीसीपी सेगमेंट में एक अनुक्रम संख्या होती है जो टीसीपी हेडर के अंदर समाहित होती है। टीसीपी सेगमेंट में भेजा गया वास्तविक डेटा परिवर्तनशील है।

कुछ OS पर समर्थित getsockopt के लिए एक मूल्य है जिसे आप TCP_MAXSEG का उपयोग कर सकते हैं जो अधिकतम TCP खंड आकार (MSS) को पुनः प्राप्त करता है। हालांकि यह सभी ओएस पर समर्थित नहीं है।

मुझे यकीन नहीं है कि आप क्या करने की कोशिश कर रहे हैं, लेकिन यदि आप उस बफर आकार को कम करना चाहते हैं जिसका उपयोग आप भी देख सकते हैं: SO_SNDBUF और SO_RCVBUF।


मुझे आश्चर्य है कि क्या आप टीसीपी को एक संदेश कतार के रूप में उपयोग कर सकते हैं यदि आप अपने सभी संदेशों को एक बड़े टीसीपी पैकेट के अंदर फिट कर सकते हैं?
CMCDragonkai


4

टीसीपी एपीआई में कोई पैकेट नहीं हैं।

अंतर्निहित प्रोटोकॉल में अक्सर पैकेट होते हैं, जैसे कि जब आईपी पर टीसीपी किया जाता है, जिसमें आपकी कोई रुचि नहीं है, क्योंकि उनके पास उपयोगकर्ता के साथ बहुत नाजुक प्रदर्शन अनुकूलन के अलावा कुछ भी नहीं है, जिसमें आप शायद रुचि नहीं रखते हैं (के अनुसार प्रश्न का सूत्रीकरण)।

यदि आप पूछते हैं कि send()एक एपीआई कॉल में आप अधिकतम कितने बाइट्स कर सकते हैं, तो यह कार्यान्वयन और सेटिंग्स पर निर्भर है। आप आमतौर पर कई किलोबाइट तक की चॉइस के लिए सेंड () कॉल करेंगे, और सिस्टम के लिए हमेशा पूरी तरह से या आंशिक रूप से इसे स्वीकार करने से इंकार करने के लिए तैयार रहें, इस स्थिति में आपको अपने डेटा को फीड करने के लिए मैन्युअल रूप से छोटे चंक्स में विभाजन करना होगा। टीसीपी भेजें () एपीआई।


8
टीसीपी में पैकेट, साथ ही एक पैकेट हेडर है, जिसका एक हिस्सा आईपी हेडर को ओवरलैप करता है। सिर्फ इसलिए कि आप इसे देखने के लिए नहीं हैं इसका मतलब यह नहीं है कि यह मौजूद नहीं है। टीसीपी हमेशा आईपी ​​पर किया जाता है। आप इसे आईपी के बिना नहीं कर सकते क्योंकि हेडर ओवरलैप करते हैं।
व्हर्लविंड

23
@HirlWind टीसीपी के सेगमेंट हैं। आईपी ​​में पैकेट हैं।
लोर्न के मार्किस

1
टीसीपी के सेगमेंट हैं (या उन्हें पैकेट कहते हैं, यह ठीक है)। टीसीपी एपीआई के पास कोई पैकेट नहीं है।
पावेल रेड्जविलोव्स्की

13
@NathanLong नुकसान यह है कि आप अनावश्यक भ्रम पैदा करते हैं। टीसीपी में सेगमेंट हैं, यूडीपी के पास डेटाग्राम हैं, आईपी में पैकेट हैं, इथरनेट के फ्रेम हैं, ...
लोर्ने का मार्किस

1
@Chexxor आप ईथरनेट फ्रेम के अंदर आईपी पैकेट के अंदर टीसीपी सेगमेंट का वर्णन करने के लिए किस भाषा का उपयोग करने जा रहे हैं? अलग-अलग चीजों के लिए एक ही शब्द का उपयोग करके इस मुद्दे को भ्रमित करने की कोई आवश्यकता नहीं है, जब इन चीजों के लेखक अलग-अलग शब्दों का उपयोग करने के लिए बहुत परेशानी में गए हैं।
लोर्ने

3

आमतौर पर, यह उस इंटरफ़ेस पर निर्भर करेगा जो कनेक्शन का उपयोग कर रहा है। आप शायद MTU पाने के लिए एक ioctl () का उपयोग कर सकते हैं, और यदि यह ईथरनेट है, तो आप आमतौर पर उस से हार्डवेयर हेडर के आकार को घटाकर अधिकतम पैकेट आकार प्राप्त कर सकते हैं, जो ईथरनेट के लिए 14 है जिसमें कोई वीएलएएन नहीं है।

यह केवल मामला है अगर MTU कम से कम नेटवर्क में बड़ा है। TCP आपके प्रभावी MTU को कम करने के लिए पथ MTU खोज का उपयोग कर सकता है।

सवाल यह है कि आप परवाह क्यों करते हैं?


6
यह केवल आपको पहले लिंक पर अधिकतम पैकेट आकार मिलेगा। जहां तक ​​मुझे पता है, मार्ग के साथ किसी भी अन्य नोड को बड़े पैकेट पसंद नहीं करने की अनुमति है और यह पथ के साथ कहीं भी विभाजित हो सकता है।
मत्ती विर्ककुनेन

हाँ, यह सच है ... तो आपका सवाल अच्छा है - आप ऐसा क्यों चाहते हैं?
व्हर्लविंड

मैं एक लैन कनेक्शन पर वीडियो / चित्र प्रसारित करना चाहता हूं
एलेक्सा

1
चूंकि टीसीपी स्ट्रीम-ओरिएंटेड है, इसलिए यह मामला क्यों है?
व्हर्लविंड

3

यदि आप लिनक्स मशीनों के साथ हैं, तो "ifconfig eth0 mtu 9000 up" एक इंटरफ़ेस के लिए MTU सेट करने के लिए कमांड है। हालांकि, मेरा कहना है कि बड़े एमटीयू में कुछ डाउनसाइड्स हैं अगर नेटवर्क ट्रांसमिशन इतना स्थिर नहीं है, और यह अधिक स्पेसल स्पेस मेमोरी का उपयोग कर सकता है।


3

ऐसा लगता है कि इंटरनेट पर अधिकांश वेब साइटें MTU के मूल्य के लिए 1460 बाइट्स का उपयोग करती हैं। कभी-कभी यह 1452 है और अगर आप वीपीएन पर हैं तो यह IPSec हेडर के लिए और भी अधिक गिर जाएगा।

डिफ़ॉल्ट विंडो का आकार अधिकतम 65535 बाइट तक भिन्न होता है। मैं अपने स्वयं के स्रोत आईपी मूल्यों को देखने के लिए और अन्य इंटरनेट विक्रेता क्या उपयोग कर रहे हैं यह देखने के लिए मैं http://tcpcheck.com का उपयोग करता हूं ।


2

एक समाधान सॉकेट विकल्प TCP_MAXSEG ( http://linux.die.net/man/7/tcp ) को उस मूल्य पर सेट करने के लिए हो सकता है जो अंतर्निहित नेटवर्क के साथ "सुरक्षित" है (उदाहरण के लिए 1400 ईथरनेट पर सुरक्षित होने के लिए सेट)। सिस्टम कॉल भेजने में एक बड़े बफर का उपयोग करें। इस तरह से कम सिस्टम कॉल हो सकती हैं जो महंगी हैं। कर्नेल एमएसएस से मिलान करने के लिए डेटा को विभाजित करेगा।

इस तरह आप छोटे डेटा से बच सकते हैं और आपके एप्लिकेशन को छोटे बफ़र्स के बारे में चिंता करने की ज़रूरत नहीं है।


2

IP प्रोटोकॉल (Ip4) में एक टीसीपी सेटिंग के लिए पैकेट का आकार। इस क्षेत्र (टीएल) के लिए, 16 बिट्स आवंटित किए जाते हैं, तदनुसार पैकेट का अधिकतम आकार 65535 बाइट्स: आईपी ​​प्रोटोकॉल विवरण है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.