2009-10-07 22 views
9

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

रिसीवर टीसीपी के माध्यम से बाइट प्राप्त करने को स्वीकार करता है, इसलिए प्रेषक टीसीपी ढेर को पता होना चाहिए।

लेकिन जब मैं कुछ बाइट भेजता हूं, तो भेजें() तुरंत लौटाता है, भले ही पैकेट (अभी तक) डिलीवर नहीं किया जा सका, मैंने परीक्षण किया कि लिनक्स 2.6.30 पर नेटकैट पर स्ट्रेस का उपयोग करके, मेरे नेटवर्क केबल को पहले खींचकर कुछ बाइट भेजना

मैं सिर्फ एक एप्लीकेशन विकसित कर रहा हूं जहां यह जानना बहुत महत्वपूर्ण है कि कोई संदेश वितरित किया गया था, लेकिन टीसीपी सुविधाओं को लागू करना ("संदेश # 123 के लिए एएसी") अजीब लगता है, वहां एक बेहतर तरीका होना चाहिए।

उत्तर

19

भेजने टीसीपी जब डेटा दूसरे छोर से स्वीकार हो जाता है पता है, लेकिन एकमात्र कारण यह ऐसा करता है तो वह यह है कि यह जानता है कि यह डेटा को त्याग सकता है (क्योंकि कोई और अब इसे दूसरी ओर एप्लिकेशन में लाने के लिए ज़िम्मेदार है)।

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

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

8

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

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

+0

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

6

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

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

+0

हां, डिजाइन द्वारा यह विश्वसनीय और आदेश दिया गया है – RichardOD

3

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

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

A: Send 450 Bytes 
B: Recv 450 Bytes 
B: Send 'I got 450 Bytes' 
A: Recv 'B got the full message' 
A: Continue 
1

ऐसा लगता है कि SCTP कुछ ऐसा देखने के लिए हो सकता है; मुझे लगता है कि इसे आप जो चाहते हैं उसका समर्थन करना चाहिए। वैकल्पिक यूडीपी के लिए स्विच करने के लिए हो रहा है, और आप प्रोटोकॉल स्विच कर रहे हैं वैसे भी ...

3

भले ही यह टीसीपी परत तक पहुंच गया हो, फिर भी इस बात की कोई गारंटी नहीं है कि यह एप्लिकेशन के बफर में नहीं बैठे, फिर ऐप इसे संसाधित करने से पहले क्रैश हो गया। एक पावती का उपयोग करें, यही सब कुछ करता है (उदा। एसएमटीपी)

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