2011-02-23 11 views
11

हाइपोटेटिकल परिदृश्य: एक udp पैकेट स्ट्रीम मशीन एक्स पर आती है, जो दो प्रोग्राम चला रही है - एक जो रीव() के साथ पैकेट सुन रहा है, और दूसरा जो पॅक चल रहा है।पैक यूनिक्स बफरिंग काम कैसे करता है?

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

मैं यथासंभव विस्तृत विवरण के रूप में एक विवरण की तलाश कर रहा हूं, इस मामले में वास्तव में कौन से बफर वास्तव में शामिल हैं, और कैसे पैकेट एक से दूसरे में जाते हैं (उदाहरण के लिए पैकेट को पीसी से पहले कैप्चर किया जाता है आरईवी बफर, बाद, या अपरिभाषित करने के लिए?)।

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

उत्तर

8

लिनक्स मामले (BSD के शायद कुछ इसी तरह कर रहे हैं, skbuff रों बजाय mbuf s का उपयोग करके): नेटवर्क डाटा बफ़र होना

लिनक्स skbuffs (सॉकेट बफ़र्स) का उपयोग करता है। एक स्कबफ में कुछ नेटवर्क डेटा के बारे में मेटाडेटा है, और उस डेटा के कुछ पॉइंटर्स हैं।

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

जब किसी को अब स्कबफ की आवश्यकता नहीं है, तो यह kfree_skb() है। kfree_skb() संदर्भ संख्या को कम करता है, और जब वह संदर्भ संख्या शून्य तक पहुंच जाती है, तो स्कबफ मुक्त हो जाता है। यह क्लोन के लिए खाते के लिए थोड़ा अधिक जटिल है, लेकिन यह सामान्य विचार है।

+0

तो, आप कह रहे हैं कि recv() फ़ंक्शन कर्नेल बफर का उपयोग करता है, लेकिन प्रत्येक पॅक उदाहरण में बफर की अपनी प्रति है? इन क्लोनों को किस चरण में बनाया जाता है - जब पैकेट प्राप्त होता है? जब पॅक इसे पढ़ना चाहता है? – Benubird

+0

प्रत्येक पॅक उदाहरण में मेटाडेटा की अपनी प्रति है, लेकिन वे सभी एक ही डेटा साझा करते हैं। जब पैकेट प्राप्त होता है तो क्लोन बनाए जाते हैं ('skb_deliver()' आईआईआरसी में)। – ninjalj

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