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