2008-11-03 13 views
5

मुझे एक असामान्य स्थिति मिली है: मैं एक एम्बेडेड स्थिति (इंटेल बॉक्स, वर्तमान में 2.6.20 कर्नेल का उपयोग कर) में एक लिनक्स सिस्टम का उपयोग कर रहा हूं। एक एम्बेडेड सिस्टम के साथ संवाद करें जिसमें आंशिक रूप से टूटा हुआ टीसीपी कार्यान्वयन है। जैसा कि मैं अभी बता सकता हूं कि वे प्रत्येक संदेश को अलग ईथरनेट फ्रेम में आने की उम्मीद करते हैं! जब उन्हें ईथरनेट फ्रेम में संदेश विभाजित होते हैं तो उन्हें समस्याएं प्रतीत होती हैं।मुझे तत्काल डेटा भेजने के लिए एक टीसीपी विकल्प (ioctl) की आवश्यकता है

हम डिवाइस के साथ स्थानीय नेटवर्क पर हैं, और हमारे बीच कोई रूटर नहीं है (केवल एक स्विच)।

हम निश्चित रूप से, उन्हें अपने सिस्टम को ठीक करने के लिए मजबूर करने की कोशिश कर रहे हैं, लेकिन यह संभव नहीं हो सकता है।

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

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

क्या कोई तरीका है कि मैं यह बता सकता हूं कि ड्राइवर के पास डेटा कतारबद्ध है या नहीं? क्या कोई तरीका है कि मैं ड्राइवर को स्वतंत्र परिवहन परत पैकेट में स्वतंत्र लेखन कॉल भेजने के लिए मजबूर कर सकता हूं? मैंने सॉकेट (7) और टीसीपी (7) मैन पेजों के माध्यम से देखा है और मुझे कुछ भी नहीं मिला। यह हो सकता है कि मैं नहीं जानता कि मैं क्या देख रहा हूं।

जाहिर है, यूडीपी एक रास्ता होगा, लेकिन फिर, मुझे नहीं लगता कि हम इस बिंदु पर दूसरे छोर को और कुछ भी बदल सकते हैं।

किसी भी मदद की बहुत सराहना की।

उत्तर

7

IIUC, TCP_NODELAY विकल्प को सेट करने से सभी पैकेट फ़्लश करना चाहिए (यानी tcp.c tcp_push_pending_frames को कॉल के साथ NODELAY की सेटिंग लागू करता है)। इसलिए यदि आप प्रत्येक प्रेषण कॉल के बाद सॉकेट विकल्प सेट करते हैं, तो आपको वह चाहिए जो आप चाहते हैं।

1

शायद, TCP_NODELAY सेट करें और अपना एमटीयू इतना कम सेट करें ताकि प्रति फ्रेम में अधिकतम 1 संदेश होगा? ओह, और आउटगोइंग पैकेट पर "डेंट-फ्रैगमेंट" ध्वज जोड़ें

+0

अच्छा विचार। दुर्भाग्यवश, चूंकि संदेश आकार में समान नहीं हैं, इसलिए मैं एक एमटीयू नहीं चुन सकता जो इस उदाहरण में प्रति फ्रेम एक संदेश बीमा करेगा। –

0

क्या आपने प्रत्येक संदेश के लिए एक नई सॉकेट खोलने और इसे तुरंत बंद करने का प्रयास किया है? ओवरहेड उल्टी हो सकता है, लेकिन यह आपके संदेशों को सीमित कर सकता है।

+0

अफसोस की बात यह है कि इससे खंडित संदेशों की तुलना में दूसरे छोर पर अधिक परेशानी होगी, इसलिए यह इस उदाहरण में काम नहीं करेगा। –

0

सबसे खराब स्थिति परिदृश्य में आप एक स्तर के निचले (कच्चे सॉकेट) जा सकते हैं, जहां आपके पास भेजे गए पैकेट पर बेहतर नियंत्रण होता है, लेकिन फिर आपको टीसीपी के सभी नट-किरकिरा से निपटना होगा।

-1

शायद तुम कम विलंबता मोड में टीसीपी ढेर लगाने की कोशिश कर सकते:

echo 1 > /proc/sys/net/ipv4/tcp_low_latency 

डेटा के संयोजन से अधिक जितनी जल्दी संभव हो पैकेट उत्सर्जक एहसान चाहिए। अधिक जानकारी के लिए टीसीपी (7) पर आदमी को पढ़ें।

+0

लिनक्स कर्नेल (नेट/ipv4/tcp.c) में कोड द्वारा निर्णय, tcp_low_latency ध्वज केवल अनुप्रयोग बफर में टीसीपी स्टैक से डेटा पढ़ने को प्रभावित करता है। – Alexander

+0

अलेक्जेंडर सही है –

2

आप एक समस्या के आसपास काम नहीं कर सकते हैं जब तक आप सुनिश्चित न हों कि समस्या क्या है।

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

नेटवर्क भीड़ इसे रोकने के लिए व्यावहारिक रूप से असंभव बनाता है (सभ्य थ्रुपुट बनाए रखने के दौरान) भले ही वे आपको बता सकें कि वे कितनी बार recv() कहते हैं।

+1

दुर्भाग्यवश, दूसरी तरफ डिवाइस सामान्य टीसीपी स्टैक नहीं चला रहा है, जहां तक ​​मैं कह सकता हूं। यह एक छोटे पैमाने पर एम्बेडेड डिवाइस है और उन्होंने किसी भी समय अपने स्वयं के डिज़ाइन के ईथरनेट बोर्ड पर जोड़ा। व्यवहार से मुझे संदेह है कि वे ईथरनेट फ्रेम में घूमते हैं। –

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