2010-03-05 13 views
14

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

यह सर्वर पैकेट है कि यह डेटा से पहले प्राप्त करने के लिए या कुछ पैकेट के अंत अंकन के लिए जा रहा है की पूरी लंबाई बताने के लिए और अधिक आम है?

भेजा केवल कुछ वर्ण लंबा हो जाएगा डेटा और पात्रों में से कुछ हजारों हो सकता है में से कुछ।

+2

मुझे लगता है कि यह टीसीपी पैकेट नहीं है जिसके बारे में आप चिंतित हैं, यह टीसीपी स्ट्रीम के भीतर एप्लिकेशन-स्तरीय संदेश है, है ना? –

उत्तर

23

टीसीपी डेटा की निरंतर स्ट्रीम प्रदान करता है। टीसीपी पैकेट का उपयोग कर लागू किया गया है लेकिन टीसीपी का पूरा बिंदु उन्हें छिपाना है।

इस बारे में सोचें जैसे कि यह एक दीवार थी जिस पर आप आकर्षित करना चाहते हैं। दीवार ईंटों से बना है। ईंटों को मोर्टार के साथ एक साथ चिपकाया जाता है, और प्लास्टर लागू होता है कि दीवार की सतह चिकनी हो जाती है। ईंटें आईपी पैकेट हैं, टीसीपी प्लास्टर है।

तो अब आप अपने चिकनी मदहोश टीसीपी सुरंग है, और आप इसमें कुछ संरचना जोड़ना चाहते हैं। आप बक्से खींचना चाहते हैं, ताकि आपके चित्र एक दूसरे से अलग रखा जा सके। यह वही है जो आप करना चाहते हैं: अपने डेटा में कुछ "प्रशासनिक" संरचना (चित्रों के चारों ओर बक्से) जोड़ने के लिए।

कई प्रोटोकॉल एक packet है, जो एक निश्चित प्रारूप प्रशासनिक हैडर के साथ शुरुआत डेटा का एक समूह है की अवधारणा का उपयोग करें। पैकेट समाप्त होने का निर्णय लेने के लिए शीर्षलेख में पर्याप्त जानकारी होती है; उदाहरण के लिए, इसमें पैकेट की लंबाई शामिल है। एचटीटीपी Content-Length हेडर, या (HTTP/1.1 के साथ) "खंडित स्थानांतरण एन्कोडिंग" के साथ करता है जहां डेटा एक या कई मिनी-पैकेट में विभाजित होता है, प्रत्येक में एक सरल हेडर होता है जिसमें बिल्कुल मिनी-पैकेट-लंबाई संकेत होता है ।

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

फिर भी एक और तरीका स्वयं-समाप्त डेटा का उपयोग करना है। यह डेटा इस तरह से संरचित है कि आप किसी भी बिंदु पर जान सकते हैं कि तत्व का अंत तक पहुंच गया है या नहीं। उदाहरण के लिए, एक्सएमएल डेटा मार्करों के नेस्टेड जोड़े जैसे <foo>...</foo> के रूप में व्यवस्थित किया जाता है। जब अंत मार्कर (</foo>) पहुंच जाता है, तो आप जानते हैं कि तत्व समाप्त हो गया है।

3

अपने पैकेट को इस तरह से व्यवस्थित करें कि इसमें शुरुआत में एक लंबा क्षेत्र शामिल है।

1

अपने संकेतों को HTTP से लें।

वर्णों की एक टर्मिनेटर अनुक्रम का उपयोग करें, या संदेश शीर्ष लेख में कहीं लंबाई निर्दिष्ट करें, या दोनों के चतुर संयोजन का उपयोग करें।

HTTP की तरह: हेडर सीआर-एलएफ-सीआर-एलएफ के साथ समाप्त होता है। यदि शीर्षलेखों के पीछे डेटा है, तो डेटा लंबाई हेडर में से एक में है।

+1

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

2

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

लाभ बनाम पूंछ मार्कर यह है कि रिसीवर अपेक्षित डेटा के लिए अनुकूलित कर सकता है, उदा। सही आकार के एक बफर आवंटित करें। उदाहरण के लिए, टीसीपी/आईपी प्रोटोकॉल पर भंडारण आपके जैसा टीसीपी/आईपी पर एक ही समस्या है। उन मामलों में, हेडर बाद में अपेक्षित डेटा की लंबाई प्रदान करते हैं।

बाद में सड़क के नीचे, आपको अपने "हेडर" में अन्य बिट्स मिल सकते हैं। आपको खुशी होगी कि आपके पास अपनी परत -5 प्रोटोकॉल बढ़ाने के लिए कुछ संरचना है।

1

यदि आप विशेष रूप से बोल्ड महसूस कर रहे हैं, तो आप टीसीपी सॉकेट के बजाय SCTP सॉकेट का उपयोग करने में देख सकते हैं।

1

अगर आप शुरुआत में लंबाई को एन्कोड करते हैं तो कचरे से सावधान रहें। उदाहरण के लिए यदि आप लंबाई के लिए 4 बाइनरी बाइट्स का उपयोग करते हैं और कुछ बाहरी जांच HTTP अनुरोध भेजती है, तो आप शायद एक बड़ी संख्या के साथ समाप्त हो जाएंगे और हमेशा के लिए प्रतीक्षा कर रहे हैं (बफर आवंटित करने का उल्लेख न करें जो आपके प्रोग्राम को क्रैश कर सकता है)। मैं प्रत्येक कार्य को एक अलग कार्य के माध्यम से दो बार भेजता हूं और उनकी तुलना करता हूं (उदा। ~ लेन और लेन xor 0x139AF321)। यदि कोई सक्रिय रूप से आपके प्रोग्राम को क्रैश करने का प्रयास कर रहा है तो आपको अधिकतम सेट भी करना चाहिए। अगर मुझे बुरी लंबाई मिलती है तो मैं कनेक्शन बंद कर देता हूं।

यदि आपका ट्रैफ़िक एन्क्रिप्ट किया गया है तो यह एचएमएसी से ऊपर और ऊपर है।