नेटवर्क प्रोग्रामिंग में स्ट्रीम और डेटाग्राम के बीच अंतर क्या है?


जवाबों:


304

कुछ समय पहले मैंने दोनों के बीच के अंतर को समझाने के लिए एक महान सादृश्य पढ़ा। मुझे याद नहीं है कि मैंने इसे कहाँ पढ़ा है दुर्भाग्य से मैं लेखक को इस विचार के लिए श्रेय नहीं दे सकता, लेकिन मैंने अपने स्वयं के बहुत से ज्ञान को वैसे भी कोर सादृश्य में जोड़ा है। तो यहाँ जाता है:

एक धारा सॉकेट एक फोन कॉल की तरह है - एक तरफ कॉल को कॉल करता है, दूसरे जवाब, आप एक दूसरे को हैलो कहते हैं (टीसीपी में SYN / ACK), और फिर आप जानकारी का आदान-प्रदान करते हैं। एक बार जब आप काम पूरा कर लेते हैं, तो आप अलविदा (टीसीपी में फिन / एसीके) कहते हैं। यदि एक पक्ष अलविदा नहीं सुनता है, तो वे आमतौर पर दूसरे को कॉल करेंगे क्योंकि यह एक अप्रत्याशित घटना है; आमतौर पर क्लाइंट सर्वर से जुड़ जाएगा। इस बात की गारंटी है कि डेटा आपके भेजे हुए से अलग क्रम में नहीं आएगा, और इस बात की उचित गारंटी है कि डेटा क्षतिग्रस्त नहीं होगा।

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

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

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

वीओआईपी / खेल के मामले में विस्तार करने के लिए, ऐसे प्रोटोकॉल में अपना डेटा-ऑर्डरिंग तंत्र शामिल है। लेकिन अगर एक पैकेट खराब हो जाता है या खो जाता है, तो आप फिर से भेजने का अनुरोध जारी करने के लिए स्ट्रीम प्रोटोकॉल (आमतौर पर टीसीपी) पर इंतजार नहीं करना चाहते हैं - आपको जल्दी से ठीक होने की आवश्यकता है। टीसीपी को ठीक होने में कुछ मिनट लग सकते हैं, और गेमिंग या वीओआईपी जैसे रियलटाइम प्रोटोकॉल के लिए भी तीन सेकंड अस्वीकार्य हो सकते हैं! यूडीपी जैसे डेटाग्राम प्रोटोकॉल का उपयोग करने से सॉफ़्टवेयर को इस तरह की घटना से बहुत जल्दी ठीक होने की अनुमति मिलती है, बस खोए हुए डेटा की अनदेखी करके या टीसीपी की तुलना में इसे फिर से अनुरोध करता है।

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


3
केवल SYNACK के विवरण को शामिल करने के लिए शानदार।
लेज़रशेक्स

2
यह उदाहरण, या एक बहुत ही समान, लिनक्स प्रोग्रामिंग इंटरफेस से है। 2010 संस्करण में 1155 और 1159 पृष्ठों पर ये उदाहरण हैं।
जोश

30

स्ट्रीम सॉकेट:

  • सर्वर और क्लाइंट के बीच समर्पित और एंड-टू-एंड चैनल।
  • डेटा ट्रांसमिशन के लिए टीसीपी प्रोटोकॉल का उपयोग करें।
  • विश्वसनीय और दोषरहित।
  • समान क्रम में भेजा / प्राप्त किया गया डेटा।
  • खोया / गलत डेटा पुनर्प्राप्त करने के लिए लंबे समय तक

डाटाग्राम सॉकेट:

  • सर्वर और क्लाइंट के बीच समर्पित और एंड-टू-एंड चैनल नहीं।
  • डेटा ट्रांसमिशन के लिए यूडीपी का उपयोग करें।
  • 100% विश्वसनीय नहीं है और डेटा खो सकता है।
  • डेटा भेजा / प्राप्त आदेश समान नहीं हो सकता है।
  • खोए हुए / गलत डेटा की देखभाल या तेजी से ठीक न करना।

क्या डेटा उसी क्रम में नहीं भेजा गया है (केवल "समान") नहीं? अर्थात। यह एक धारा सॉकेट में एक पैकेट ऑर्डरिंग मैकेनिज्म बनाने का कोई मतलब नहीं होगा
मैथ्यू डी। स्कोफील्ड

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

यह समझ आता है। हो सकता है कि बस एक अंतर के रूप में इसे हटा दें और इसे नीचे रख दें (जब से मैं इसे सही ढंग से समझ रहा हूं, केवल उस क्रम का संदर्भ देता हूं जिस पर पैकेट भेजे जाते हैं, दोनों मामलों में डेटा भेजने / प्राप्त करने का क्रम नहीं हो सकता है वही)।
मैथ्यू डी। शोलेफील्ड

@ अधिक सटीक रूप से, सॉकेट्स को एंड-टू-एंड पॉइंट के रूप में जाना जाता है क्योंकि ट्रांसपोर्ट प्रोटोकॉल एक या एक से अधिक पावर पॉइंट पर संदेश पहुंचाने के लिए जिम्मेदार होते हैं।
एलेजांद्रो ब्लास्को

0

यदि यह नेटवर्क प्रोग्रामिंग है, तो मुझे लगता है कि सॉकेट्स से शुरू करना एक अच्छी शुरुआत होगी।
सॉकेट = आईपी + पोर्ट
तीन प्रकार के सॉकेट
स्ट्रीम (टीसीपी, ऑर्डर और डिलीवरी की गारंटी, कोई दोहराव नहीं, डेटा के लिए कोई लंबाई या चार सीमाएं, कनेक्शन-उन्मुख, विश्वसनीय, संगामिति)
डेटाग्राम (यूडीपी, पैकेट-आधारित, कनेक्शन रहित, डेटाग्राम नहीं है आकार सीमा, डेटा खो सकता है या डुप्लिकेट किया जा सकता है, गारंटी नहीं दी जा सकती है, विश्वसनीय नहीं होगी)
कच्ची (निचली परत प्रोटोकॉल आईपी, आईसीएमपी तक सीधी पहुंच)
मैं परिवहन प्रोटोकॉल प्रकार के लिए कोई सख्त नियम नहीं देखता कि सॉकेट के लिए क्या परिवहन प्रोटोकॉल का उपयोग करना है और विश्वसनीयता गलत नहीं होनी चाहिए क्योंकि दोनों छोर सक्रिय होने की स्थिति में UDP वास्तविक है।
विश्वसनीयता डिलीवरी की विश्वसनीयता को संदर्भित करती है क्योंकि टीसीपी का परिवहन प्रोटोकॉल के रूप में उपयोग करके अनुक्रम संख्या की जांच होती है जो यूडीपी में मौजूद नहीं है। यह नेटवर्क प्रोटोकॉल विश्लेषक जैसे कि वायरशार्क टीसीपीडम्प आदि का उपयोग करना बेहतर है यह देखने के लिए कि आपका सॉफ्टवेयर वास्तव में क्या कर रहा है; कागज पर अपने काम के साथ सत्यापन या विलय सिद्धांत।

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