2012-11-14 11 views
11

जावास्क्रिप्ट & PHP वेबसाकेट टीसीपी पैकेट क्लंपिंग के बारे में नीचे उदाहरण के साथ।वेबसाकेट टीसीपी पैकेट एक साथ चिपकते हैं?

किसी कारण से, मेरे वीपीएस पर पैकेट भेजते समय, या मेरे आईपी पते पर इंगित डोमेन के माध्यम से मेरे लोकहोस्ट तक पहुंचने पर, कई पैकेट एक साथ मिल जाएंगे। मैं स्ट्रीम करने की कोशिश कर रहा हूं, इस उदाहरण के लिए प्रति सेकंड 20 (@ 100byte) पैकेट। सर्वर अंत में, वे वास्तव में एक स्थिर दर पर भेजा जा रहा है, बिल्कुल हर 50ms, 20 प्रति सेकंड बनाते हैं। हालांकि, जब वे ग्राहक के पास जाते हैं, तो ग्राहक केवल एक सेकंड के प्रत्येक 1/4 वें के बारे में नए संदेश संसाधित करता है। नए पैकेट को केवल प्रति सेकंड 4 या उससे कम की दर से प्राप्त करने के कारण ...

पैकेट के इस क्लैंपिंग को एक साथ क्या कारण बन रहा है? स्थानीय समस्या के माध्यम से सब कुछ तब नहीं होता है। वीयर क्या है कि यह आईफोन की आईओएस मोबाइल सफारी पर आसानी से स्ट्रीम करता है, बिना किसी समस्या के। लेकिन, यह पीसी सफारी पर बिल्कुल काम नहीं करता है, (क्योंकि मैंने इसे पुराने हिक्सी -76 वेबसाकेट प्रारूप के साथ सही तरीके से काम करने के लिए सेट नहीं किया है, मुझे लगता है कि मोबाइल सफारी पहले से ही नए आरएफसी 6455 या नई जावास्क्रिप्ट का उपयोग कर रहा है कंपाइलर) मैंने कई होस्टिंग कंपनियों की कोशिश की है, हर बार सटीक परिणाम के साथ।

नीचे दिए गए उदाहरण, InMotion के VPS पर होस्ट देखें: http://www.hovel.me/script/serverControl.php

(बाईं तरफ [कनेक्ट] क्लिक करें, फिर [देखें खेल] दाईं ओर)।

प्राप्त वर्तमान पैकेट हर बार लगभग 5 कूद जाएगा, क्योंकि प्रत्येक 5 पैकेट एक बार में प्राप्त होते हैं, एक सेकंड के प्रत्येक 1/4 वें। हालांकि, मैंने ऐसे उदाहरण देखे हैं जो पैकेट की निरंतर, त्वरित स्ट्रीम भेज सकते हैं। एक दूसरे के लिए इंतजार करने के लिए इस क्लंपिंग को एक साथ/पैकेट का क्या कारण बनता है?

संपादित: यह Nagle's algorithm के साथ कुछ है, जो एकत्रित करता & छोटे पैकेट एक साथ भेजता हो करना है? मैं PHP में इसे बाईपास करने की कोशिश करने के लिए काम करूंगा। PHP में इस TCP_NODELAY सेट के साथ भी, समस्या अभी भी खड़ी है। यह एक आईफोन पर क्यों काम करता है लेकिन पीसी नहीं अभी भी मुझे फेंक रहा है ...
EDIT: रजिस्ट्री में TCPNoDelay और TcpAckFrequency को सेट करने के लिए यह ठीक करता है, लेकिन मैं प्रत्येक उपयोगकर्ता को ऐसा करने की उम्मीद नहीं कर सकता। एक ग्राहक पक्ष होना चाहिए, रोटी & मक्खन जावास्क्रिप्ट तरीका होना चाहिए।

node.js का उपयोग किए बिना, node.js 'socket.setNoDelay(true) "को दोहराने की कार्यक्षमता कैसे हो सकती है?

उत्तर

3

यह टीसीपी है। यह आईपी पैकेट पर अर्थव्यवस्थाकरण करके आपकी मदद कर रहा है। इसका हिस्सा नागल एल्गोरिदम के कारण है लेकिन इसका हिस्सा इंटरमीडिएट नेटवर्क के कारण भी हो सकता है।

+0

यह समझ में आता है, लेकिन रीयलटाइम स्ट्रीमिंग के लिए कुछ भी नहीं है, और वेबसाकेट वर्तमान में यूडीपी का समर्थन नहीं करता है, इसलिए मैं इसके साथ अभी अटक गया हूं। मुझे पता है कि एक कामकाज है, लेकिन PHP के माध्यम से TCP_NODELAY (नागल के एल्गोरिदम को बंद करना) को अभी तक मेरे लिए हल नहीं किया है। आपकी सहायता के लिए धन्यवाद – TheWandererLee

3

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

उदाहरण के लिए:

conn = new WebSocket(url); 
conn.onmessage = function(evt){ 
    Server.send('ACKNOWLEDGE BYTES'); // Send ACK to server immediately 
    dispatch('message', evt.data); //Do regular event procedures 
}; 

यह अस्थायी समाधान काम करता है, फिर भी इस होगा लगभग दोगुना बैंडविड्थ उपयोग, अन्य नेटवर्क समस्याओं के बीच में। जब तक मैं क्लाइंट पर वेबसॉकेट प्राप्त नहीं कर पाता हूं, सर्वर एके के लिए सही तरीके से 'स्टैंडबाय' नहीं होता है, और नेटवर्क तुरंत संदेशों के माध्यम से धक्का देने के लिए, यह बफर कॉर्किंग समस्या के बिना पैकेट को जल्दी से प्राप्त करता है।

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