HTTP प्रतिक्रिया का reassembly पथ क्या है?


0

मैं यह समझने की कोशिश कर रहा हूं कि ऑपरेटिंग सिस्टम आम तौर पर नेटवर्क अनुरोधों के पुनरावर्तन को कैसे लागू करते हैं। मेरी सबसे अच्छी समझ से निम्नलिखित सत्य है:

एक HTTP अनुरोध कुछ HTTP लाइब्रेरी का उपयोग करके एप्लिकेशन लेयर पर किया जाता है। यह HTTP लाइब्रेरी वास्तव में OS द्वारा कुछ सॉकेट कार्यान्वयन के लिए एक आवरण है।

एक "संचारण" सॉकेट HTTP अनुरोध के गंतव्य और स्रोत का उपयोग करके त्वरित किया जाता है।

एक "प्राप्त" सॉकेट डिवाइस के आईपी पते और एक यादृच्छिक (मुक्त) पोर्ट का उपयोग करके त्वरित किया जाता है।

HTTP संदेश "प्रेषित" सॉकेट की फ़ाइल डिस्क्रिप्टर का उपयोग करके "भेजा गया" है।

सॉकेट की "भेजें" विधि, ओएस के टीसीपी कार्यान्वयन के लिए संदेश भेजती है।

टीसीपी कार्यान्वयन HTTP संदेश को विभाजित करता है, गंतव्य बंदरगाह (जब सॉकेट को इंस्टेंट करते हुए प्रदान किया जाता है) और स्रोत पोर्ट को प्रस्तुत करता है। (मुझे लगता है कि इसे किसी तरह कार्यान्वयन के आधार पर पास कर दिया गया है।) एक बार HTTP संदेश खंडित हो गया है और टीसीपी हेडर इसे जोड़ दिया गया है, तो टीसीपी खंड फिर ओएस के आईपी कार्यान्वयन में पारित हो जाते हैं।

टीसीपी सेगमेंट आईपी हेडर के साथ तैयार किए गए हैं। सॉकेट को इंस्टेंट करते समय आईपी गंतव्य का पता प्रदान किया गया था। (फिर से मुझे लगता है कि स्रोत आईपी पते को कार्यान्वयन के आधार पर पास किया गया है।)

आईपी ​​पैकेट्स को तब ईथरनेट हेडर के साथ लपेटा जाता है, राउटर को भेजा जाता है, सर्वर को भेजा जाता है, सर्वर अनुरोध को संसाधित करता है, और प्रतिक्रिया भेजता है।

यह वह जगह है जहां मेरी समझ इस बात पर टूट जाती है कि वास्तव में reassembly प्रक्रिया में क्या होता है।

प्रतिक्रिया कैसे प्राप्त करता है "प्राप्त" सॉकेट के बफर को प्राप्त करने के लिए, एक बार जब आईपी पैकेट डिवाइस पर वापस आ जाता है?

स्पष्ट रूप से हेडर बंद हो जाते हैं, लेकिन विशेष रूप से "प्राप्त" सॉकेट के बफर को प्राप्त करने के लिए इसे वापस लेने के लिए क्या कदम उठाए जाते हैं, और फिर सॉकेट से एप्लिकेशन पर वापस जाएं?

PS मैं "IP इसे पुनः प्राप्त करता हूं" या "TCP इसे पुनः प्राप्त करता है" की तुलना में अधिक तकनीकी कार्यान्वयन विवरण की उम्मीद कर रहा हूं और इसे अगली परत तक पहुंचाता हूं। मैं यह समझने की उम्मीद कर रहा हूं कि केवल सैद्धांतिक रूप से इसके बजाय वास्तव में यह कैसे होता है (हालांकि मैं समझता हूं कि यह ओएस विशिष्ट है)।

संपादित करें:

विषय पर अधिक स्पष्टता लाने के लिए, मैं सॉकेट के लिए अपने संदर्भों को नोट करूंगा और किसी भी सॉकेट विधि को लिनक्स ओएस के लिए संदर्भित करूंगा।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
जर्नीमैन गीक

जवाबों:


1

माइक पेनिंगमेंट ( टिप्पणियों में ) द्वारा नेटवर्क स्टैक डाउन और बैक अप (लिनक्स ओएस 2005 के लिए विशिष्ट) के अनुरोध के मार्ग का विस्तृत तकनीकी विवरण प्राप्त करने से अच्छा लगता है ।

अधिक विस्तृत रूप, जहां से निम्न चरण निकाले गए थे :

ध्यान दें, जबकि सूचीबद्ध चरण लगभग उतने विस्तृत नहीं हैं जितना कि ऊपर वर्णित दस्तावेज़, लगभग चरण हैं:

OS में ईथरनेट rx पोर्ट के लिए एक समर्पित फाइल डिस्क्रिप्टर है,

The rx ring is a ring in the kernel memory where the network card transfers the incoming packet through DMA. The raw data which is stored in the rx ring structure is either copied into a sk buff structure.

इसके बाद पैकेट को नेटवर्क लेयर पर ले जाने के लिए ISR फायर करता है। ध्यान दें, यह चुनता है कि पैकेट को संसाधित करना है या इसे आगे भेजना है (जो दिलचस्प था जैसा कि मैं शायद कल्पना करता हूं कि यह कैसे अग्रेषण कार्यों को सक्षम कर रहा है, जैसे वीपीएन के लिए)

यदि मान्य है, तो यह IP लेयर पर जाता है। यह अपने प्रोटोकॉल (आईपी हेडर से) की जांच करता है और अगर प्रोटोकॉल टीसीपी है tcp v4 rcv, तो फुकनियन को कॉल करता है , जिससे टीसीपी लेयर में चला जाता है।

और यह हिस्सा महत्वपूर्ण है:

The next step for this function is to find an open socket for this incoming packet,

यह tcp v4 lookupकोड के निम्नलिखित सेगमेंट में कॉल करके किया जाता है :

sk = __tcp_v4_lookup(skb->nh.iph->saddr, th->source,
skb->nh.iph->daddr, ntohs(th->dest),
tcp_v4_iif(skb));

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

यदि कोई वैध सॉकेट है, तो tcp_data_queueअनुप्रयोग उपभोग के लिए स्टैक को जारी रखने के लिए डेटा डाला जाता है।


0

( टिप्पणियों से )

मुझे एनकैप्सुलेशन मिलता है। तो चलिए बताते हैं कि OS में एक समर्पित फाइल डिस्क्रिप्टर है जो समर्पित इथरनेट Rx पोर्ट पर खुला है। यह एक फ्रेम से ईथरनेट हेडर को अलग करता है और गंतव्य आईपी को हटाने के लिए इसे कुछ आईपी पार्स फ़ंक्शन में भेजता है। यह इसे कुछ संरचना में डालता है, फिर इसे और संरचना को टीसीपी परत पर भेजता है। यहाँ यह इसे गंतव्य बंदरगाह से दूर ले जाता है और इसे उसी संरचना में रखता है। यहां, पोर्ट और आईपी पर आधारित सॉकेट्स फाइल डिस्क्रिप्टर में कुछ मैपिंग करनी होती है ताकि फाइल डिस्क्रिप्टर को सौंपे गए बफर में डेटा डाला जा सके। Thats मेरा सबसे अच्छा इस पर जाना। लेकिन मुझे यह जानना पसंद है कि वास्तव में क्या होता है।

आप जो खोज रहे हैं उसका एक पुराना संस्करण यहां है: लिनक्स नेटवर्क स्टैक । मैं 2005 के विवरण की तुलना में कुछ नया खोजने की कोशिश कर रहा हूं क्योंकि तब से कुछ लीनियस हिम्मत बदल गई है। सॉकेट बफ़रिंग की अधिकांश जानकारी एक संरचना में रखी sk_buffजाती है, जिसे a कहा जाता है , जो एक linux संरचना होती है, जो TCP सॉकेट हैंडल पर पॉइंटर्स रखती है, साथ ही सभी सॉकेट पढ़ने / लिखने वाले बफ़र्स को रखती है।

जैसा कि लिनक्स एनआईसी ड्राइवर एनआईसी से किसी दिए गए सॉकेट पर जानकारी प्राप्त करता है, यह sk_buffउदाहरण (नाम skb) से बफर स्थान को देखता है , और बफ़र्स द्वारा डेटा को इंगित करता है skb

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.