2012-04-11 13 views
36

ऐसा लगता है कि कम से कम 3 अलग-अलग स्थानीय/यूनिक्स सॉकेट प्रकार (PF_UNIX), SOCK_STREAM, SOCK_DGRAM और SOCK_SEQPACKET हैं।यूनिक्स सॉकेट, SOCK_SEQPACKET बनाम SOCK_DGRAM

जबकि मुझे पता है कि एक SOCK_STREAM आपको एक द्वि-दिशात्मक बाइट स्ट्रीम देता है, जैसे टीसीपी या बिडरेक्शनल पाइप, और अन्य दो आपको एक मैज/पैकेट एपीआई देता है, SOCK_DGRAM और SOCK_SEQPACKET के यूनिक्स सॉकेट के बीच क्या अंतर है?

चूंकि ये केवल स्थानीय हैं, इसलिए मैं किसी अच्छे कारण के बारे में नहीं सोच सकता कि कोई SOCK_DGRAM को पैकेट को पुन: व्यवस्थित कर सकता है।

साथ ही, क्या SOCK_DGRAM/SOCK_SEQPACKET प्रवाह नियंत्रण को नियोजित करता है, या धीमे पाठकों के मामले में संदेशों को हटाया जा सकता है?

+0

आईआईआरसी, SOCK_DGRAM आपको एक समय में एक संदेश देगा, जबकि SOCK_SEQPACKET (प्रोटोकॉल जो इसे समर्थन देता है) आपको एक समय में एकाधिक डेटाग्राम पढ़ने की अनुमति देगा, लेकिन हमेशा परमाणु डेटाग्राम, उपाध्यक्ष SOCK_STREAM को पढ़ता है जहां आपको संदेश सीमाओं को स्वयं पार्स करने की आवश्यकता होती है। – tbert

+1

बस एक टिप्पणी SOCK_SEQPACKET का उपयोग AX.25 (हैम रेडियो प्रोटोकॉल) में किया जाता है उदाहरण के लिए देखें http://stackoverflow.com/questions/19040205/connect-error-no-route-to-host –

उत्तर

5

सॉकेट (2) लिनक्स प्रदान की मैनपेज: "DGRAM: डाटाग्राम (संयोजन, अविश्वसनीय संदेश), SEQPACKET: अनुक्रम, विश्वसनीय, [दो तरह] डाटाग्राम के लिए कनेक्शन के आधार पर आंकड़ा संचरण पथ"।। महत्वपूर्ण अंतर

यूनिक्स (7) लिनक्स प्रदान की मैनपेज कहते हैं: "SOCK_DGRAM, एक आंकड़ारेख उन्मुख सॉकेट कि संदेश सीमाओं [लेकिन जरूरी नहीं कि आदेश] [...] SOCK_SEQPACKET, एक कनेक्शन उन्मुख सॉकेट के लिए कि बरकरार रखता है को बरकरार रखता है के लिए संदेश सीमाएं और संदेश भेजे गए क्रम में संदेश भेजता है। "

sta ndard परमिट करता है कि आपको SOCK_DGRAM के साथ दोबारा पैकेट मिलते हैं। (दूसरे शब्दों में, यदि एक ओएस उन्हें आपके लिए हाथ में रखता है, तो यह एक कार्यान्वयन-विशिष्ट सुविधा है। या केवल शुद्ध समय भाग्य।)

लिनक्स में af_file/af_unix कार्यान्वयन में प्रवाह नियंत्रण है, लेकिन यह करता है मानक निर्दिष्ट व्यवहार के साथ सहसंबंध की आवश्यकता नहीं है।

17

यहाँ SOCK_SEQPACKET लिए करना उपयोग के मामले पर एक अच्छा लेख है, तथ्य यह है कि यह आईपी प्रोटोकॉल परिवारों में वास्तव में उपलब्ध नहीं है, और कैसे आप मौजूदा टीसीपी अर्थ विज्ञान के साथ एक ही बात प्राप्त कर सकते हैं:

http://urchin.earth.li/~twic/Sequenced_Packets_Over_Ordinary_TCP.html

ध्यान दें कि SOCK_SEQPACKETSOCK_DGRAM से SOCK_STREAM पर व्यवहार में बहुत करीब है।

संदर्भित वेबसाइट से हवाला देते हुए:

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

+1

अच्छा लिंक, धन्यवाद। –

+1

यह पीएफ_यूएनआईक्स (पीएफ_ओएलसीएएल) सॉकेट की तुलना में टीसीपी/आईपी के बारे में अधिक बात करता है .. अब तक ऐसा लगता है कि एक SOCK_SEQPACKET और SOCK_DGRAM स्थानीय सॉकेट के बीच एकमात्र वास्तविक अंतर यह है कि एक SOCK_SEQPACKET सॉकेट कनेक्शन उन्मुख है, लेकिन मुझे अभी भी यकीन नहीं है। – user1255770

+0

अच्छा, यह उत्तर गलत है। सवाल विशेष रूप से PF_UNIX के बारे में पूछता है, और आदर्श SOCK_SEQPACKET SOCK_STREAM (संदेश पर सीमाएं प्रदान करने) से अधिक एक अवशोषण स्तर होगा, कार्यान्वयन इतना आदर्शवादी नहीं हैं। [इस] के अनुसार (http://osdir.com/ml/ietf.tsvwg/2005-12/msg00005.html), PF_UNIX कार्यान्वयन बहुत अधिक पसंद करते हैं SOCK_DGRAM, इसके अलावा ... अच्छा, मुझे वास्तव में पता नहीं है , यही कारण है कि मैं इस पृष्ठ में आया, और कोई जवाब संतोषजनक प्रतीत होता है। यह उत्तर केवल अधिक विस्तृत नेटवर्क प्रोटोकॉल पर लागू होता है जो SOCK_SEQPACKET को लागू होने के रूप में लागू करता है। – lvella

8

SOCK_SEQPACKET आप SOCK_STREAM (अर्थात, आदेश के संरक्षण की गारंटी वितरण, कोई दोहराव) की गारंटी देता है देता है, लेकिन चित्रित पैकेट सीमाओं सिर्फ SOCK_DGRAM की तरह साथ। तो, मूल रूप से यह दो प्रोटोकॉल प्रकारों का मिश्रण है।

टीसीपी/आईपी-परिवार में, SCTP दोनों SOCK_STREAM (TCP-like) और SOCK_SEQPACKET लागू करता है। दुर्भाग्य से यह विंडोज़ पर स्टॉक-उपलब्ध नहीं है।

1

टीसीपी और यूडीपी सॉकेट की तरह, एससीटीपी (स्ट्रीम कंट्रोल ट्रांसमिशन प्रोटोकॉल) सॉकेट होते हैं जिनमें एंडपॉइंट्स के बीच दो रूप होते हैं, (एक से एक) और (एक से कई) होते हैं। एक से एक SOCK_STREAM का उपयोग करता है और कई का उपयोग SOCK_SEQPACKET

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