2009-06-25 21 views
9

मैं एक टीसीपी स्ट्रीम पर जा रहा एक संदेश प्रोटोकॉल लिखने वाला हूं। रिसीवर को यह जानने की जरूरत है कि संदेश सीमाएं कहां हैं।एक स्ट्रीम प्रोटोकॉल लिखना: संदेश आकार फ़ील्ड या संदेश डिलीमीटर?

मैं या तो 1) निश्चित लंबाई संदेश, 2) आकार फ़ील्ड भेज सकता हूं ताकि रिसीवर जानता हो कि संदेश कितना बड़ा है, या 3) एक अद्वितीय संदेश टर्मिनेटर (मुझे लगता है कि यह संदेश में कहीं और नहीं उपयोग किया जा सकता है) ।

मैं दक्षता कारणों से # 1 का उपयोग नहीं करूंगा।

मुझे # 2 पसंद है, लेकिन क्या स्ट्रीम के लिए सिंक से बाहर निकलना संभव है?

मुझे विचार # 3 पसंद नहीं है क्योंकि इसका मतलब है कि रिसीवर समय से पहले संदेश के आकार को नहीं जान सकता है और यह भी आवश्यक है कि टर्मिनेटर संदेश में कहीं और दिखाई न दे।

# 2 के साथ, यदि सिंक से बाहर निकलना संभव है, तो क्या मैं टर्मिनेटर जोड़ सकता हूं या क्या मैं कभी भी सिंक से बाहर नहीं होने की गारंटी देता हूं जब तक प्रेषक प्रोग्राम जो भेजता है उसमें सही होता है? क्या यह # 2 और # 3 करना आवश्यक है?

कृपया मुझे बताएं।

धन्यवाद, jbu

उत्तर

5

आप टीसीपी उपयोग कर रहे हैं, पैकेट वितरण विश्वसनीय है। तो कनेक्शन या तो ड्रॉप हो जाता है, टाइमआउट या आप पूरे संदेश को पढ़ लेंगे। तो विकल्प # 2 ठीक है।

3

जिस स्तर पर आप काम कर रहे हैं उसके आधार पर, # 2 में वास्तव में सिंक से बाहर जाने के साथ कोई समस्या नहीं हो सकती है (टीसीपी में पैकेट में अनुक्रम संख्या है, और अगर यह आता है तो स्ट्रीम के लिए सही क्रम में स्ट्रीम को फिर से इकट्ठा कर लेता है खराब)।

इस प्रकार, # 2 शायद आपकी सबसे अच्छी शर्त है। इसके अलावा, ट्रांसमिशन में शुरुआती संदेश आकार को जानना, प्राप्त करने वाले अंतराल पर स्मृति आवंटित करना आसान बनाता है।

+0

_ इसके अलावा, ट्रांसमिशन में संदेश आकार को जानना, प्राप्त करने वाले अंतराल पर स्मृति आवंटित करना आसान बना देगा ._ देखभाल का एक शब्द: यह सुनिश्चित करना सुनिश्चित करें कि कितनी मेमोरी आवंटित की जाती है। अन्यथा, आप उन कस्टम पैकेट्स के साथ डीडीओएस हमलों के लिए अतिसंवेदनशील हैं जिनके आकार 2^32-1 (या फिर आपके पूर्णांक बड़े हैं) का आकार क्षेत्र है, जो आपकी याददाश्त को तेज़ी से भरते हैं। – Kenji

1

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

यदि आप मूर्खतापूर्ण नहीं होने पर # 2 और # 3 दोनों का उपयोग करते हैं, तो रिसीवर को अधिक आत्मविश्वास हो सकता है कि अगर यह टीसीपी धारा से एन बाइट्स लेने के बाद डीलिमीटर से मुकाबला करता है तो उसे संदेश सही ढंग से प्राप्त होता है। आप अपने संदेश के अंदर डेलीमीटर का सुरक्षित रूप से उपयोग भी कर सकते हैं।

# 2 और # 3 दोनों का उपयोग करने के वास्तविक दुनिया उदाहरण के लिए HTTP Chunked Transfer Coding पर एक नज़र डालें।

2

मैं सिगुजू से सहमत हूं। यदि आपके पास आकार फ़ील्ड है, तो यह आवश्यक संदेश जोड़ने और अंतराल के अंतराल के लिए नहीं है - हालांकि, यह एक अच्छा विचार है। दोनों होने से चीजों को अधिक मजबूत और डीबग करना आसान हो जाता है।

मानक netstring format का उपयोग करने पर विचार करें, जिसमें आकार क्षेत्र और अंत-स्ट्रिंग वर्ण दोनों शामिल हैं। क्योंकि इसका आकार फ़ील्ड है, संदेश के अंदर अंत-स्ट्रिंग वर्ण का उपयोग करना ठीक है।

0

एक चौथा विकल्प है: एक्सएमएल जैसे स्वयं वर्णन प्रोटोकॉल।

+0

यह शुद्ध बाइनरी संदेशों के लिए अनुपयुक्त है। यह मूल रूप से विकल्प # 3 है लेकिन एक एकल डेलीमीटर से भी बदतर है। – Lucretiel

2

दिलचस्प है यहां कोई स्पष्ट जवाब नहीं है। # 2 टीसीपी पर सुरक्षित है चाहे कोई फर्क नहीं पड़ता, और "असली दुनिया में" अक्सर किया जाता है। ऐसा इसलिए है क्योंकि टीसीपी गारंटी देता है कि सभी डेटा दोनों बेकार और क्रम में भेजे गए क्रम में आता है, इसलिए कोई संभावना नहीं है कि सही कार्यान्वयन सिंक से बाहर हो सके।

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