2010-08-30 11 views
31

मेरे पास एक टीसीपी सर्वर है जो आने वाले क्लाइंट के लिए सुनता है, फिर उसे प्रति सेकंड डेटा का एक पैकेट भेजता है। मैं सोच रहा था, SYN/एसीके पैकेट केवल प्रारंभिक कनेक्शन पर भेजा है, इसलिए यह इस तरह दिखता है:क्या टीसीपी प्रत्येक पैकेट पर या केवल पहले कनेक्शन पर एक एसईएन/एसीके भेजता है?

<client connect> 
SYN 
ACK 
DATA 
DATA 
DATA 
<client disconnect> 

या यह हर पैकेट के साथ भेजा हो जाता है, इस तरह?

<client connect> 
SYN 
ACK 
DATA 

SYN 
ACK 
DATA 

SYN 
ACK 
DATA 
<client disconnect> 

इसके अलावा, अगर यह पहली बार ऐसा है, तो टीसीपी पर UDP के किसी भी लाभ अगर आप सिर्फ कनेक्शन समय की एक लंबी अवधि में खोलने रख रहे हैं?

+2

टीसीपी/आईपी में कोई "पैकेट" नहीं है। यहां सही शब्दावली देखें: http://stackoverflow.com/questions/955369/protocol-terminology-message-versus-packet –

+2

@ फिलिप्स - टीसीपी आईपी पर एक प्रोटोकॉल स्तरित है। टीसीपी द्वारा संसाधित होने तक सेगमेंट की कोई अवधारणा नहीं है। इस प्रक्रिया को छोड़कर आने वाले डेटा को सेगमेंट की बजाय पैकेट के रूप में संदर्भित करना निश्चित रूप से स्वीकार्य है, क्योंकि वे इस बिंदु पर केवल आईपी पैकेट के बाद हैं। आईपी ​​पैकेट के रूप में टीसीपी में जाता है, सेगमेंट, संदेश इत्यादि के रूप में आता है – JSON

उत्तर

57

यह थोड़े की तरह है:

+-------------------------------------------------------+ 
|  client   network   server  | 
+-----------------+    +--------------------| 
| (connect) | ---- SYN ----> |     | 
|     | <-- SYN,ACK -- |  (accepted)  | 
| (connected) | ---- ACK ----> |     | 
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/ 

when client sends... 
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/ 
|     |    |     | 
|  (send)  | ---- data ---> |     | 
|     | <---- ACK ---- | (data received) | 
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/ 

when server sends... 
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/ 
|     |    |     | 
|     | <--- data ---- |  (send)  | 
| (data received) | ---- ACK ----> |     | 
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/ 

...and so on, til the connection is shut down or reset 

SYN एक कनेक्शन शुरू होता है; कनेक्शन की स्थापना होने पर आप आमतौर पर इसे देख पाएंगे। लेकिन टीसीपी के माध्यम से भेजे जाने वाले सभी आंकड़ों को एक एसीके की आवश्यकता होती है। भेजे गए प्रत्येक बाइट को जिम्मेदार ठहराया जाना चाहिए, या इसे गंभीर मामलों में पुन: प्रेषित किया जाएगा (या कनेक्शन रीसेट (बंद))।

वास्तविक कनेक्शन नहीं आमतौर पर बिल्कुल ऊपर चित्र की तरह है, हालांकि, दो कारणों के लिए कर रहे हैं:

  • ACKs, का निर्माण कर सकते हैं ताकि एक एसीके उस समय तक प्राप्त सब कुछ स्वीकार करते हैं कर सकते हैं। इसका मतलब है कि आप एक या एक से अधिक एसीके के साथ भेज सकते हैं।
  • एक एसीके बस एक टीसीपी हेडर में एक ध्वज और क्षेत्र है। किसी को भेजने के लिए कम से कम एक शीर्षलेख के बैंडविड्थ की आवश्यकता होती है, साथ ही जो भी निम्न परतों पर काम करती है। लेकिन डेटा सेगमेंट में पहले से ही वह सब शामिल है ... इसलिए यदि आप डेटा भेज रहे हैं, तो आप एक ही समय में एक एसीके मुफ्त में भेज सकते हैं।

अधिकांश टीसीपी/आईपी स्टैक्स अनावश्यक जोखिम वाले रीट्रांसमिशन या कनेक्शन रीसेट के बिना नग्न एसीके की संख्या को कम करने का प्रयास करते हैं। तो इस तरह एक बातचीत संभव है:

\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/ 
|     |    |     | 
|     | <--- data ---- |  (send)  | 
| (data received) |    |     | 
|  (send)  | -- data,ACK -> |     | 
|     |    | (data received) | 
|     | <- data,ACK -- |  (send)  | 
| (data received) |    |     | 
| (wait a bit) | <--- data ---- |  (send)  | 
| (data received) |    |     | 
|  (send)  | -- data,ACK -> |     | 
|     |    | (data received) | 
|  (send)  | ---- data ---> | (wait a bit)  | 
|     |    | (data received) | 
|     | <- data,ACK -- |  (send)  | 
| (data received) |    |     | 
| (wait a bit) | (dead air) |     | 
|     | ---- ACK ----> |     | 
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/ 

यूडीपी का सवाल है, कोई अंतर्निहित SYN और एसीके की अवधारणा - यूडीपी स्वभाव से "अविश्वसनीय" है, और नहीं कनेक्शन उन्मुख, इसलिए अवधारणाएं उतनी ही लागू नहीं होती हैं। आपकी पावती आमतौर पर सर्वर की प्रतिक्रिया होगी। लेकिन यूडीपी के शीर्ष पर बनाए गए कुछ एप्लिकेशन-लेयर प्रोटोकॉल में भेजे गए और प्राप्त किए गए डेटा को स्वीकार करने के कुछ प्रोटोकॉल-विशिष्ट तरीके होंगे।

+6

+1 अच्छा जवाब और प्यारा एएससीआई कला। –

+16

एसीके जटिल हो सकता है। यह हर डेटा पैकेट के लिए नहीं है, लेकिन हालांकि कई लोगों को प्राप्त हुआ है इसलिए हर 8 पैकेट में एक एसीके हो सकता है। प्रेषण पक्ष में एक * विंडो * है जो इसे पहले से भेजे जाने से पहले * एसीके प्राप्त करने के लिए कितनी होगी। फिर चुनिंदा एसीके है जिसका उपयोग "बाइट 2000-8000 प्राप्त किया गया है, लेकिन 0-2000 नहीं" –

+0

वाह, उत्कृष्ट स्पष्टीकरण के लिए धन्यवाद! –

9

SYN केवल शुरुआत में ही है।

एसीके किसी भी दिशा में बाद के खंडों पर है। [संपादित करें] एसीके एक खिड़की के आकार को भी परिभाषित करेगा। यदि उदाहरण के लिए विंडो का आकार 100 है, तो प्रेषक एसीके प्राप्त करने से पहले 100 सेगमेंट भेज सकता है। उदा। अगर प्रेषक 100 सेगमेंट भेजता है लेकिन सेगमेंट नंबर 50 खो जाता है, तो रिसीवर को 1-49 & 51 -100 मिलेगा। रिसीवर फिर 50 के लिए एसीके (अगले खंड की अपेक्षा करता है) और विंडो आकार को 1 तक सेट करेगा। प्रेषक अनुक्रम संख्या 50 के साथ 1 सेगमेंट भेज देगा। रिसीवर तब 101 के लिए एसीके करेगा और विंडो आकार को उच्च संख्या में वापस सेट करेगा [संपादित करें]

दोनों वास्तव में टीसीपी हेडर में फ़ील्ड हैं और डेटा के साथ भेजा जा सकता है, हालांकि एसईएन और पहला एसीके आमतौर पर डेटा-कम होता है।

तो आपके द्वारा वर्णित परिदृश्यों में से कोई भी बिल्कुल सही नहीं है।पहला वास्तव में वास्तविकता के करीब है, लेकिन SYN के बाद सभी डेटा पैकेट में एक एसीके शामिल करना होता है, और एक पावती संख्या फ़ील्ड भी होती है जो अपेक्षित अगले पैकेट की संख्या की पहचान करता है।

सत्र के अंत में एफआईएन फ्लैग किए गए पैकेट और एसीके से संबंधित हैंडशेक भी शामिल हैं।

एक्सचेंज किए गए अनुक्रम संख्या का उपयोग खोए हुए पैकेट की पहचान करने और पुन: प्रयास तंत्र को सक्षम करने के लिए किया जाता है, और सही क्रम में पैकेट की पूरी धारा को फिर से इकट्ठा करने के लिए भी किया जाता है।

इसके अलावा, यदि यह पहला मामला है, तो क्या आप टीसीपी पर यूडीपी के कोई लाभ हैं यदि आप लंबे समय तक कनेक्शन खोलते हैं?

यूडीपी के साथ आप लंबे समय तक कनेक्शन को केवल खुला नहीं रख सकते हैं। कोई कनेक्शन नहीं है

SYN/ACK/FIN झंडे का यह अनुक्रम एक कनेक्शन बनाता है।

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

यह अभी तक थोड़ा सा सरल है, लेकिन इस समय मैं सबसे अच्छा कर सकता हूं।

wikipedia entry on TCP और निश्चित रूप से आरएफसी में इस पर और भी बहुत कुछ है।

+1

मैं विकिपीडिया और आरएफसी पढ़ने के अलावा डब्ल्यू रिचर्ड स्टीवंस द्वारा "टीसीपी/आईपी इलस्ट्रेटेड, वॉल्यूम 1 - द प्रोटोकॉल" पुस्तक की भी सिफारिश करता हूं। यह मस्तिष्क पर थोड़ा आसान है :) –

+0

_Sender अनुक्रम संख्या 50 के साथ 1 सेगमेंट भेज देगा। रिसीवर तब 101_ के लिए एसीके होगा, यह नहीं होना चाहिए _Receiver ** 51 ** _ के लिए एसीके होगा, क्योंकि अंतिम प्राप्त खंड 50 था ? –

+0

मुझे 'संचार एक तरफा' के बारे में टिप्पणी नहीं समझती है। इसका बिलकुल कोई अर्थ नहीं है। यूडीपी आईपी पर सिर्फ एक छोटी, बेहद पतली परत है, और चूंकि यह शीर्ष पर चॉकलेट सॉस की थोड़ी मात्रा के साथ आईपी है, इसलिए आप _both_ दिशाओं में यूडीपी पैकेट भेज सकते हैं। –

0

यह चित्र: मूल टीसीपी मानक आरएफसी 793 हालांकि डेटा को पहले SYN पैकेट के साथ भेजा जाने की अनुमति है। हालांकि, आज ऐसा नहीं है। कनेक्शन के अनुरोधकर्ता से थ्री-वे-हैंडशेक की शुरुआत के दौरान आपको जो मिलता है वह एक अलग एसईएन पैकेट है। मान लें कि बी के साथ जुड़ने के लिए अनुरोध, इस प्रकार ए एक एसईएन बिट सेट के साथ एक पैकेट भेजता है। बी रसीद को स्वीकार करने के लिए एसीके के साथ जवाब देता है और एसीके + एसईएन पैकेट भेजता है। डेटा को तब से प्रेषित किया जा सकता है।

Dordal has a very good explanation on this matter. Click this link here.

संबंधित मुद्दे