2012-02-19 8 views
7

जब pcap_open_live का उपयोग कर एक अंतरफलक से सूंघ करने के लिए, मैं विभिन्न नंबरों का उपयोग कर उदाहरण के एक बहुत SNAPLEN मूल्य के रूप में देखा है, लेकर BUFSIZ (<stdio.h>) को "जादू संख्या" से।इष्टतम SNAPLEN PCAP लाइव कब्जा

क्या इंटरफ़ेस के एमटीयू को एसएनएपीएलएनएन के रूप में सेट करने के लिए और अधिक समझदारी नहीं होगी, जिसे हम कैप्चर कर रहे हैं? इस तरह, हम पीसीएपी बफर में एक बार में अधिक पैकेट फिट कर सकते हैं। क्या यह मानना ​​सुरक्षित है कि एमआरयू एमटीयू के बराबर है?

अन्यथा, क्या SNAPLEN मान सेट करने के लिए कोई गैर-विदेशी तरीका है?

धन्यवाद

उत्तर

6

MTU सबसे बड़ा पेलोड आकार कि लिंक परत को सौंप दिया जा सकता है; इसमें कोई भी लिंक-लेयर हेडर शामिल नहीं है, इसलिए, उदाहरण के लिए, ईथरनेट पर यह 1500, 1514 या 1518 नहीं होगा, और पूर्ण आकार के ईथरनेट पैकेट को कैप्चर करने के लिए पर्याप्त नहीं होगा।

इसके अतिरिक्त, इसमें मेटाडेटा शीर्षलेख शामिल नहीं हैं जैसे 802.11 रेडियो जानकारी के लिए रेडियोटाइप हेडर।

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

पीसीएपी बफर में अधिक पैकेट लगाने के लिए, जो केवल लिनक्स में मेमोरी-मैप किए गए TPACKET_V1 और TPACKET_V2 कैप्चर तंत्र पर लागू होता है, जिसमें निश्चित आकार के पैकेट स्लॉट होते हैं; अन्य कैप्चर तंत्र प्रत्येक पैकेट के लिए अधिकतम आकार के स्लॉट को आरक्षित नहीं करते हैं, इसलिए एक छोटी स्नैपशॉट लंबाई कोई फर्क नहीं पड़ता। TPACKET_V1 और TPACKET_V2 के लिए, एक छोटी स्नैपशॉट लंबाई एक अंतर डाल सकती है, हालांकि, कम से कम ईथरनेट के लिए, libpcap 1.2.1 प्रयास, जितना संभव हो सके, ईथरनेट के लिए उपयुक्त बफर स्लॉट आकार चुनने के लिए। (TPACKET_V3 में फिक्स्ड-साइज प्रति-पैकेट स्लॉट नहीं दिखते हैं, इस मामले में इसमें यह समस्या नहीं होगी, लेकिन यह हाल ही में आधिकारिक रूप से जारी किए गए कर्नेल में दिखाई दी है, और इसके लिए कोई समर्थन अभी तक libpcap में मौजूद नहीं है।)

+0

ठीक है, इसलिए मुझे उस ट्रैफ़िक के लिए संभावित अनुमान लगाया जा सकता है, जिसे मैं मॉनीटर करने जा रहा हूं। – ziu

+2

* यदि * आप लिनपैप के आधुनिक संस्करण के साथ लिनक्स का उपयोग कर रहे हैं, और या तो संस्करण 1.2.1 या बाद में नहीं है या आप ईथरनेट पर कैप्चर नहीं कर रहे हैं (या विखंडन/सेगमेंटेशन/रीसाइब्स ऑफ़लोडिंग के साथ ईथरनेट पर कैप्चरिंग कर रहे हैं) , * और * आप एक विशाल साझा-मेमोरी बफर आवंटित नहीं करना चाहते हैं ('pcap_create()'/'pcap_set_buffer_size()'/'pcap_activate()') का उपयोग करके, और पैकेट बूंदों से बचना चाहते हैं, आपको करना होगा libpcap को दिए गए पैकेट के लिए संभावित अधिकतम आकार अनुमान लगाएं। –

+0

ठीक है, मेरी समस्या दो गुना है क्योंकि मैं नया प्राप्त करने से पहले प्रत्येक पैकेट का विश्लेषण नहीं करता हूं, इसलिए मुझे उपयोगकर्ता एप्लिकेशन स्तर पर भी बफर करना होगा। यही कारण है कि मैं स्मृति उपयोग पर ट्रिम करने की कोशिश कर रहा हूं। – ziu

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