चलो डिवाइस फ़ाइलों की जल्दी से समीक्षा करते हैं: लिनक्स में, एप्लिकेशन प्रोग्राम रेड से संवाद करते हैं और फ़ाइल डिस्क्रिप्टर के माध्यम से कर्नेल को ऑपरेशन लिखते हैं । यह फ़ाइलों के लिए बहुत अच्छा काम करता है, और यह पता चला है कि एक ही एपीआई का उपयोग चरित्र उपकरणों के लिए किया जा सकता है जो पात्रों की धाराओं का उत्पादन और उपभोग करते हैं, और उन उपकरणों को ब्लॉक करते हैं जो एक यादृच्छिक एक्सेस पते पर निश्चित आकार के ब्लॉक को पढ़ते हैं और लिखते हैं, बस ये दिखावा करके फाइलें भी हैं।
लेकिन उन उपकरणों (बॉड दर आदि सेट) को कॉन्फ़िगर करने के लिए एक तरीके की आवश्यकता थी, और उसके लिए, ioctl कॉल का आविष्कार किया गया था। यह केवल एक डेटा संरचना को पारित करता है जो डिवाइस के लिए विशिष्ट है और कर्नेल के लिए उपयोग किए जाने वाले I / O नियंत्रण, और उसी डेटा संरचना में परिणाम वापस मिलता है, इसलिए यह एक बहुत ही सामान्य एक्स्टेंसिबल API है और इसका उपयोग बहुत सारी चीजों के लिए किया जा सकता है ।
अब, नेटवर्क ऑपरेशन कैसे फिट होते हैं? एक विशिष्ट नेटवर्क सर्वर एप्लिकेशन कुछ नेटवर्क पते से जुड़ना चाहता है , एक निश्चित पोर्ट (जैसे HTTP के लिए 80, या ssh के लिए 22) पर सुनता है , और यदि कोई क्लाइंट कनेक्ट होता है , तो वह इस क्लाइंट से डेटा भेजना और प्राप्त करना चाहता है । और ग्राहक के लिए दोहरी कार्रवाई।
यह स्पष्ट नहीं है कि इसे फ़ाइल संचालन के साथ कैसे फिट किया जाए (हालांकि यह किया जा सकता है, योजना 9 देखें ), यही कारण है कि यूनिक्स के डिजाइनरों ने एक नया एपीआई: सॉकेट का आविष्कार किया । आप के लिए धारा 2 आदमी पन्नों में जानकारी प्राप्त कर सकते socket
, bind
, listen
, connect
, send
और recv
। ध्यान दें कि यह I / O API फ़ाइल से अलग है, लेकिन socket
कॉल फिर भी फ़ाइल डिस्क्रिप्टर देता है। वेब पर सॉकेट का उपयोग करने के लिए कई ट्यूटोरियल हैं, Google थोड़ा सा।
अब तक यह सभी शुद्ध यूनिक्स है, जिस समय सॉकेट्स का आविष्कार किया गया था उस समय कोई भी नेटवर्क इंटरफेस के बारे में बात नहीं कर रहा था। और क्योंकि यह एपीआई वास्तव में पुराना है, इसलिए इसे इंटरनेट प्रोटोकॉल ( AF_*
स्थिरांक को देखें) से परे विभिन्न प्रकार के नेटवर्क प्रोटोकॉल के लिए परिभाषित किया गया है, हालांकि उनमें से कुछ ही लिनक्स में समर्थित हैं।
लेकिन जैसे-जैसे कंप्यूटरों को कई नेटवर्क कार्ड मिलने लगे, इसके लिए कुछ अमूर्त की जरूरत थी। लिनक्स में, वह नेटवर्क इंटरफ़ेस (NI) है। यह न केवल हार्डवेयर के टुकड़े के लिए उपयोग किया जाता है, बल्कि विभिन्न सुरंगों के लिए भी होता है, उपयोगकर्ता अनुप्रयोग एंडपॉइंट्स जो कि सर्वर जैसे कि OpenVPN इत्यादि। जैसा कि समझाया गया है, सॉकेट एपीआई (विशेष) फाइलों पर आधारित नहीं है और फाइल सिस्टम से स्वतंत्र है। उसी तरह, नेटवर्क इंटरफेस फ़ाइल सिस्टम में दिखाई नहीं देता है, या तो। हालाँकि, NIs को /proc
और /sys
फाइलसिस्टम (साथ ही साथ अन्य नेटवर्किंग ट्यूनल्स) में उपलब्ध कराया जाता है।
एक NI एक एंडपॉइंट का कर्नेल अमूर्त सरल है जहां नेटवर्क पैकेट प्रवेश करते हैं और कर्नेल को छोड़ देते हैं। दूसरी ओर, सॉकेट का उपयोग अनुप्रयोगों के साथ पैकेट संवाद करने के लिए किया जाता है। पैकेट के प्रसंस्करण के साथ किसी भी सॉकेट को शामिल करने की आवश्यकता नहीं है। उदाहरण के लिए, अग्रेषण सक्षम होने पर, एक पैकेट एक एनआई में प्रवेश कर सकता है और दूसरे पर छोड़ सकता है। उस अर्थ में, सॉकेट और नेटवर्क इंटरफेस पूरी तरह से स्वतंत्र हैं।
लेकिन एनआई को कॉन्फ़िगर करने का एक तरीका होना चाहिए, जैसे आपको ब्लॉक और चरित्र उपकरणों को कॉन्फ़िगर करने का एक तरीका चाहिए। और चूंकि सॉकेट्स ने पहले ही एक फाइल डिस्क्रिप्टर लौटा दिया था, इसलिए ioctl
उस फाइल डिस्क्रिप्टर पर सिर्फ अनुमति देना कुछ हद तक तर्कसंगत था । यह आपके द्वारा लिंक किए गए netdevice इंटरफ़ेस है।
एक समान तरीके से सिस्टम कॉल के कुछ अन्य दुरुपयोग हैं, उदाहरण के लिए पैकेट फ़िल्टरिंग, पैकेट कैप्चर आदि।
यह सब टुकड़े के बाद टुकड़ा हो गया है, और कई स्थानों पर विशेष रूप से तार्किक नहीं है। यदि यह एक ही बार में डिज़ाइन किया गया था, तो शायद एक अधिक ऑर्थोगोनल एपीआई बना सकता है।