टीसीपी 3-रास्ता हैंडशेक इस तरह काम करता है:
Client ------SYN-----> Server
Client <---ACK/SYN---- Server
Client ------ACK-----> Server
सिर्फ यही क्यों नहीं?
Client ------SYN-----> Server
Client <-----ACK------ Server
टीसीपी 3-रास्ता हैंडशेक इस तरह काम करता है:
Client ------SYN-----> Server
Client <---ACK/SYN---- Server
Client ------ACK-----> Server
सिर्फ यही क्यों नहीं?
Client ------SYN-----> Server
Client <-----ACK------ Server
जवाबों:
यह वास्तव में क्या कर रहा है में हाथ मिलाना तोड़ो।
टीसीपी में, दोनों पक्ष एक अनुक्रम संख्या का उपयोग करके अपने द्वारा भेजे गए कार्यों का ट्रैक रखते हैं। प्रभावी रूप से यह सब कुछ जो भेजा गया था की एक चल बाइट काउंट समाप्त होता है। प्राप्त पार्टी विपरीत स्पीकर के क्रम संख्या का उपयोग करके यह स्वीकार कर सकती है कि उसे क्या मिला है।
लेकिन अनुक्रम संख्या 0. से शुरू नहीं होती है। यह ISN (आरंभिक अनुक्रम संख्या) से शुरू होता है, जो एक यादृच्छिक रूप से चुना गया मूल्य है। और चूंकि टीसीपी एक द्वि-दिशात्मक संचार है, इसलिए दोनों पार्टियां "बोल" सकती हैं, और इसलिए दोनों को अपने आरंभिक क्रम संख्या के रूप में आईएसएन को यादृच्छिक रूप से उत्पन्न करना होगा। बदले में, दोनों पक्षों को अपने आरंभिक ISN के दूसरे पक्ष को सूचित करने की आवश्यकता है।
तो आप ऐलिस और बॉब के बीच एक टीसीपी वार्तालाप की शुरुआत के लिए घटनाओं के इस क्रम को समाप्त करते हैं:
Alice ---> Bob SYNchronize with my Initial Sequence Number of X
Alice <--- Bob I received your syn, I ACKnowledge that I am ready for [X+1]
Alice <--- Bob SYNchronize with my Initial Sequence Number of Y
Alice ---> Bob I received your syn, I ACKnowledge that I am ready for [Y+1]
ध्यान दें, चार घटनाएं घट रही हैं:
हालांकि वास्तविकता में, मध्य दो घटनाएं (# 2 और # 3) एक ही पैकेट में होती हैं। क्या एक पैकेट एक SYN
या ACK
एक बस बाइनरी झंडे प्रत्येक टीसीपी हैडर के अंदर पर या बंद कर दिया जाता है , इसलिए इन दोनों झंडों को एक ही पैकेट पर सक्षम होने से रोकने के लिए कुछ भी नहीं है। तो तीन तरह से हाथ मिलाना समाप्त होता है:
Bob <--- Alice SYN
Bob ---> Alice SYN ACK
Bob <--- Alice ACK
"SYN" और "ACK", दोनों दिशाओं में से प्रत्येक के दोनों उदाहरणों को देखें।
तो अपने सवाल पर वापस आने के लिए, क्यों न सिर्फ दो तरफा हैंडशेक का इस्तेमाल किया जाए? संक्षिप्त उत्तर इसलिए है क्योंकि दो तरह से हैंडशेक केवल एक पार्टी को आईएसएन स्थापित करने की अनुमति देगा, और दूसरा पक्ष इसे स्वीकार करने के लिए। जिसका मतलब है कि केवल एक पार्टी डेटा भेज सकती है।
लेकिन टीसीपी एक द्वि-दिशात्मक संचार प्रोटोकॉल है, जिसका अर्थ है कि अंत में डेटा को मज़बूती से भेजने में सक्षम होना चाहिए। दोनों पक्षों को आईएसएन स्थापित करने की आवश्यकता है, और दोनों पक्षों को दूसरे के आईएसएन को स्वीकार करने की आवश्यकता है।
तो वास्तव में, आपके पास दो तरफा हैंडशेक का वर्णन है, लेकिन प्रत्येक दिशा में । इसलिए, चार घटनाएं घटती हैं। और फिर, मध्य दो झंडे एक ही पैकेट में होते हैं। के रूप में इस तरह के तीन पैकेट एक पूर्ण टीसीपी कनेक्शन दीक्षा प्रक्रिया में शामिल हैं।
क्योंकि दोनों पार्टियों की जरूरत है तीन तरह हाथ मिलाना आवश्यक है syn chronize उनके खंड अनुक्रम उनके प्रसारण के दौरान इस्तेमाल किया संख्या। इस के लिए, उनमें से प्रत्येक के लिए भेजता है (बदले में) एक यादृच्छिक मान पर सेट एक दृश्य संख्या के साथ एक SYN खंड n है, जो तब है पावती करने के लिए सेट एक दृश्य संख्या के साथ एक एसीके खंड के माध्यम से अन्य पार्टी द्वारा nowledged n + 1 ।
Eddie
उसके जवाब से टिप्पणी से उद्धृत ।
काम करने के लिए कनेक्शन के लिए, प्रत्येक पक्ष को यह सत्यापित करने की आवश्यकता है कि वह पैकेट को दूसरी तरफ भेज सकता है। यह सुनिश्चित करने का एकमात्र तरीका है कि आपको दूसरी तरफ एक पैकेट मिला है, उनके पास से एक पैकेट प्राप्त होता है, जो कि परिभाषा के अनुसार, जब तक आपके द्वारा भेजे गए पैकेट को नहीं भेजा जाता, तब तक नहीं भेजा जाएगा । टीसीपी अनिवार्य रूप से इसके लिए दो प्रकार के संदेशों का उपयोग करता है: SYN (यह अनुरोध करने के लिए कि यह पैकेट किसके माध्यम से मिला है) और ACK (जो केवल SYN के माध्यम से भेजा जाता है, यह साबित करने के लिए कि SYN के माध्यम से मिला है)। वास्तव में एक तीसरे प्रकार का संदेश है, लेकिन हम एक पल में उसे प्राप्त कर लेंगे।
कनेक्शन शुरू होने से पहले, न तो पक्ष वास्तव में दूसरे के बारे में कुछ भी जानता है। क्लाइंट, सर्वर से एक SYN पैकेट भेजता है, जो इस बात का सबूत देता है कि उसके संदेश किस माध्यम से मिल सकते हैं । यह किसी भी व्यक्ति को कुछ भी नहीं बताता है, लेकिन यह हैंडशेक का पहला चरण है।
यदि SYN के माध्यम से मिलता है, तो सर्वर जानता है कि ग्राहक इसे पैकेट भेज सकता है, क्योंकि, ठीक है, यह अभी हुआ है। लेकिन यह साबित नहीं होता है कि सर्वर पैकेट वापस भेज सकता है: ग्राहक बहुत सारे कारणों से SYN भेज सकते हैं । इसलिए सर्वर को क्लाइंट को दो संदेश भेजने की आवश्यकता है: एक एसीके (यह साबित करने के लिए कि SYN के माध्यम से मिला है) और एक SYN (अपने स्वयं के एसीके का अनुरोध करने के लिए)। टीसीपी इन दो संदेशों को एक-एक SYN-ACK संदेश में जोड़ती है, यदि आप नेटवर्क ट्रैफ़िक को कम करने के लिए करेंगे। यह हैंडशेक का दूसरा चरण है।
क्योंकि एक SYN-ACK एक ACK है, क्लाइंट अब यह सुनिश्चित करने के लिए जानता है कि यह सर्वर को पैकेट भेज सकता है। और क्योंकि एक SYN-ACK एक SYN है, यह भी जानता है कि सर्वर सबूत चाहता है कि यह संदेश के माध्यम से मिला। तो यह एक एसीके को वापस भेजता है: इस बार बस एक सादा एसीके, क्योंकि इसे अब और सबूत की जरूरत नहीं है कि इसके पैकेट मिल सकते हैं। यह हाथ मिलाना के अंतिम चरण है: ग्राहक अब जानता है पैकेट दोनों तरीकों से जा सकते हैं कि, और सर्वर है कि बस के बारे में यह पता लगाने की (क्योंकि यह जानता है एसीके के माध्यम से जाना जाएगा)।
एक बार जब एसीके के माध्यम से हो जाता है, तो अब सर्वर को पता है कि यह ग्राहक को पैकेट भेज सकता है । यह भी पता है कि क्लाइंट को यह पता है, इसलिए यह तुरंत डेटा भेजना शुरू कर सकता है। हैंडशेक पूरा हो गया है। हमारे पास एक अच्छा चैनल है।
खैर, कड़ाई से बोलते हुए, हम निश्चित नहीं हो सकते हैं कि हमारे पास एक अच्छा चैनल है । सिर्फ इसलिए कि पैकेट के इस क्रम के माध्यम से सख्ती से गारंटी नहीं दी जाती है कि अन्य लोग करेंगे। हम यह साबित नहीं कर सकते कि अनंत संख्या में SYN और ACK भेजे बिना, और फिर कुछ और कभी नहीं किया जाएगा, इसलिए यह वास्तव में एक व्यावहारिक विकल्प नहीं है। लेकिन व्यवहार में, तीन कदम अधिकांश उद्देश्यों के लिए पर्याप्त रूप से अच्छे होते हैं ।
दरअसल, टीसीपी कनेक्शन स्थापित करने का एकमात्र साधन 3-वे हैंडशेक नहीं है। एक साथ SYN एक्सचेंज की अनुमति भी है: http://www.tcpipguide.com/free/t_TCPConnectionEstablishmentProcessTheThreeWayHandsh-4.htm
इसे एक तरह से डबल 2-वे हैंडशेक के रूप में देखा जा सकता है।
टीसीपी कनेक्शन द्विदिश है। इसका मतलब यह है कि यह वास्तव में एक तरफ़ा कनेक्शन की एक जोड़ी है। सर्जक SYN भेजता है, उत्तरदाता ACK भेजता है: एक सिम्प्लेक्स कनेक्शन शुरू होता है। "फिर" उत्तरदाता SYN भेजता है, सर्जक ACK भेजता है: एक और सिम्प्लेक्स कनेक्शन शुरू होता है। दो सिंप्लेक्स कनेक्शन एक डुप्लेक्स टीसीपी सत्र बनाते हैं, सहमत हैं? इसलिए तार्किक रूप से इसमें चार चरण शामिल हैं; लेकिन क्योंकि SYN और ACK झंडे टीसीपी हैडर के अलग-अलग "फ़ील्ड" हैं, उन्हें एक साथ सेट किया जा सकता है - दूसरा और तीसरा चरण (चार में से) संयुक्त हैं, इसलिए तकनीकी रूप से तीन पैकेट एक्सचेंज हैं। प्रत्येक सिम्प्लेक्स (आधा-) कनेक्शन 2-तरफा विनिमय का उपयोग करता है, जैसा कि आपने प्रस्तावित किया था।
यदि सर्वर और क्लाइंट कनेक्शन बनाना चाहते हैं, तो उन्हें चार चीजों की पुष्टि करने की आवश्यकता है:
क्लाइंट को यह पुष्टि करने की आवश्यकता है कि वह सर्वर से पैकेट प्राप्त कर सकता है
क्लाइंट को किसी चीज़ की पुष्टि करने की आवश्यकता होती है: सर्वर क्लाइंट से पैकेट प्राप्त कर सकता है
बाद Client ------SYN-----> Server
, नियम 1 की पुष्टि की जाती है।
बाद Client <---ACK/SYN---- Server
, नियम 2 और 3 की पुष्टि की जाती है।
तो, नियम 4 की पुष्टि करने के लिए तीसरे पैकेट की आवश्यकता है।
यह बिल्कुल भी जरूरी नहीं है। यह स्पष्ट है कि एक छोटे संदेश को केवल एक पैकेट सर्वर की आवश्यकता होती है जिसमें प्रारंभ + संदेश शामिल होता है, और एक पैकेट इसे स्वीकार करता है।
पिछले उत्तर केवल पहले क्रम में यादृच्छिक अनुक्रम संख्या आदि की आवश्यकता पर चर्चा किए बिना प्रणाली का वर्णन करते हैं। मूल प्रश्न खुद टीसीपी के डिजाइन के बारे में था - जाहिर है अगर आप टीसीपी प्रोटोकॉल का उपयोग करते हैं तो आपको तीन संदेशों की आवश्यकता होती है क्योंकि वह प्रोटोकॉल है। लेकिन पहली बार में टीसीपी को इस तरह से डिजाइन क्यों किया गया था?
मेरा मानना है कि मूल विचार यह था कि क्लाइंट और सर्वर के बीच कोई अंतर नहीं था। दोनों एक दूसरे के बंदरगाहों को द्विदिश तरीके से जानते थे, और या तो बातचीत शुरू कर सकते थे। और इसके लिए सिंट आदि की आवश्यकता होती है।
लेकिन, यह निश्चित रूप से नहीं है कि आज इसका उपयोग कैसे किया जाता है। सर्वर एक प्रसिद्ध बंदरगाह पर सुनता है और करता है और "स्वीकार" करता है, क्लाइंट पोर्ट नंबर अल्पकालिक है। मुझे नहीं लगता कि सामान्य ऑपरेटिंग सिस्टम में समान क्लाइंट पोर्ट नंबर पर किसी अन्य को अनुरोध भेजने के लिए "स्वीकार" पर प्रतीक्षा करने वाले सर्वर के लिए यह संभव है।
(ध्यान दें कि यह कनेक्शन के द्विदिश दीक्षा के बारे में है, जो आज कभी नहीं किया गया है। यह एक बार स्थापित किए गए कनेक्शन के नीचे द्विदिश संदेश भेजने से काफी अलग है।)
टीसीपी अक्षमता के आसपास काम करने के लिए, हम HTTP 1.1 जैसे प्रोटोकॉल का उपयोग करते हैं जो कई अनुरोधों के लिए एक ही कनेक्शन का पुन: उपयोग कर सकते हैं, और इस तरह टीसीपी हैंडशेक से बचें जो पहली जगह में आवश्यक नहीं था।
लेकिन Http 1.1 अपेक्षाकृत नया है। और एसएसएल / टीएलएस को पीकेआई एल्गोरिदम की लागत के कारण सत्र से पुन: उपयोग करने का एक तरीका चाहिए था। ताकि प्रोटोकॉल में अपना स्वयं का सत्र पुन: उपयोग तंत्र शामिल हो जो कि एचटीटीपी 1.1 के शीर्ष पर चलता है जो टीसीपी के शीर्ष पर चलता है।
सॉफ्टवेयर के साथ ऐसा ही है। कीचड़ पर ठगना जो संयुक्त होने पर, एक स्वीकार्य परिणाम उत्पन्न करता है।
एडी के उत्तर को पढ़ने के बाद (सही के रूप में स्वीकार किया गया), अभी भी सवाल हैं कि 1 होस्ट ISN को यादृच्छिक संख्याओं के साथ असाइन नहीं कर सकता है और दूसरा इसे स्वीकार करता है। 3-वे हैंडशेक का उपयोग करने का वास्तविक कारण आधे कनेक्शन से बचना है । 2-वे हैंडशेक में आधा कनेक्शन परिदृश्य:
1) क्लाइंट --- SYN -> सर्वर
2) क्लाइंट अपना दिमाग बदलता है और अब और कनेक्ट नहीं करना चाहता है
3) क्लाइंट <-X-ACK-- सर्वर // ACK खो गया था
सर्वर को SYN नहीं दिखाई देता, इसलिए वह सोचता है कि क्लाइंट को उसका ACK मिल गया और कनेक्शन स्थापित हो गया। परिणामस्वरूप सर्वर में कनेक्शन होता है जो कभी बंद नहीं होगा