2010-03-30 8 views
10

मैं पढ़ रहा हूं कि एनआईसी द्वारा पैकेट कैप्चर किए जाने के बाद क्या होता है, और जितना मैंने पढ़ा, उतना ही मैं उलझन में हूं।पैकेट पर कब्जा करने के बाद क्या होता है?

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

दूसरा, क्या आरएसएस (रिसीव साइड स्केलिंग) विंडोज और लिनक्स सिस्टम दोनों में समान रूप से काम करता है? मैं केवल एमएसडीएन लेखों में आरएसएस कैसे काम करता है, इस बारे में विस्तृत स्पष्टीकरण प्राप्त कर सकता हूं, जहां वे आरएसएस (और एमएसआई-एक्स) विंडोज सर्वर 2008 पर कैसे काम करते हैं, इस बारे में बात करते हैं। लेकिन आरएसएस और एमएसआई-एक्स की एक ही अवधारणा अभी भी लिनक्स सिस्टम के लिए लागू होनी चाहिए ?

धन्यवाद।

सादर, Rayne

+1

Google प्रतिलिपि नेटवर्किंग के लिए Google ... बहुत कम हाई स्पीड डिवाइस इन दिनों उपयोगकर्ता को कर्नेल को दोहरी प्रतिलिपि सहन कर सकते हैं। इयानंग (मैं नेटवर्क गुरु नहीं हूं) लेकिन मेरा मानना ​​है कि डीएमए आक्रामक रूप से –

+0

का उपयोग किया जाता है, इसलिए आजकल, एक बार एनआईसी एक पैकेट कैप्चर करता है, तो इसे सीधे (उपयोगकर्ता) मेमोरी में कॉपी किया जाएगा? – Rayne

+3

@ रेये हां; एनआईसी आपकी प्रक्रिया '(उपयोगकर्तालैंड) पता स्थान में मैप किए गए भौतिक मेमोरी में सीधे डेटा स्थानांतरित करने के लिए डीएमए का उपयोग करेगा। – vladr

उत्तर

12

कैसे इस प्रक्रिया को बाहर निभाता है में से कुछ ज्यादातर चालक लेखक और हार्डवेयर पर निर्भर है बाहर समाशोधन मदद कर सकता है , लेकिन चालकों के लिए मैं को देखा या लिखित और हार्डवेयर मैं के साथ काम किया, यह आम तौर पर जिस तरह से यह काम करता है है:

  1. ड्राइवर प्रारंभ में, यह बफ़र्स के कुछ नंबर आवंटित और करने के लिए इन दे देंगेएनआईसी।
  2. जब एनआईसी द्वारा एक पैकेट प्राप्त होता है, तो यह अगले पते को बफर की सूची, डीएमए डेटा को सीधे इसमें खींचता है, और एक इंटरप्ट के माध्यम से ड्राइवर को सूचित करता है।
  3. ड्राइवर को बाधा आती है, और या तो बफर को कर्नेल पर बदल सकता है या यह एक नया कर्नेल बफर आवंटित करेगा और डेटा कॉपी करेगा। "शून्य प्रति नेटवर्किंग" पूर्व है और स्पष्ट रूप से ऑपरेटिंग सिस्टम से समर्थन की आवश्यकता है। (इस पर अधिक नीचे)
  4. ड्राइवर को या तो एक नया बफर आवंटित करने की आवश्यकता है (शून्य प्रतिलिपि मामले में) या यह बफर का पुन: उपयोग करेगा। किसी भी मामले में, भविष्य में पैकेट के लिए बफर को एनआईसी को वापस दिया जाता है।

कर्नेल के भीतर शून्य-कॉपी नेटवर्किंग इतना खराब नहीं है। उपयोगकर्ता की ओर से नीचे की ओर शून्य-प्रतिलिपि अधिक कठिन है। उपयोगकर्तालैंड डेटा प्राप्त करता है, लेकिन नेटवर्क पैकेट दोनों शीर्षलेख और डेटा से बने होते हैं। कम से कम, उपयोगकर्तालैंड के लिए सभी तरह से सही शून्य-प्रतिलिपि आपके एनआईसी से समर्थन की आवश्यकता है ताकि यह अलग-अलग शीर्षलेख/डेटा बफर में डीएमए पैकेट कर सके। एक बार जब कर्नेल पैकेट को अपने गंतव्य पर रूट करता है और चेकसम को सत्यापित करता है (टीसीपी के लिए, या तो हार्डवेयर में अगर एनआईसी इसका समर्थन करता है या सॉफ्टवेयर में नहीं है; ध्यान दें कि अगर कर्नेल को चेकसम की गणना करना है, तो यह होगा डेटा को भी प्रतिलिपि बना सकते हैं: डेटा को देखकर कैश की याद आती है और इसे कहीं और कॉपी करना ट्यून कोड के साथ मुफ्त में हो सकता है)।

यह भी मानते हुए कि सभी सितारों को संरेखित किया गया है, सिस्टम वास्तव में आपके उपयोगकर्ता बफर में सिस्टम द्वारा प्राप्त होने पर नहीं है। जब तक कोई एप्लिकेशन डेटा के लिए नहीं पूछता, तब तक कर्नेल नहीं जानता कि यह कहां समाप्त होगा। Apache जैसे बहु-प्रक्रिया डिमन के मामले पर विचार करें। कई बच्चे प्रक्रियाएं हैं, सभी एक ही सॉकेट पर सुन रहे हैं। आप एक कनेक्शन भी स्थापित कर सकते हैं, fork(), और दोनों प्रक्रियाएं recv() आने वाले डेटा में सक्षम हैं।

इंटरनेट पर टीसीपी पैकेट आमतौर पर पेलोड के 1460 बाइट्स (1500 = 20 बाइट आईपी हेडर + 20 बाइट टीसीपी हेडर + 1460 बाइट डेटा के एमटीयू) हैं। 1460 2 की शक्ति नहीं है और आपको प्राप्त होने वाले किसी भी सिस्टम पर पेज आकार से मेल नहीं खाएगा। यह डेटा स्ट्रीम के पुनर्वितरण के लिए समस्याएं प्रस्तुत करता है। याद रखें कि टीसीपी धारा-उन्मुख है। प्रेषक लिखने के बीच कोई भेद नहीं है, और प्राप्त किए गए दो 1000 बाइट लिखने का इंतजार पूरी तरह से 2000 बाइट पढ़ने में किया जाएगा।

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

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

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