आईपी ​​बनाम ifconfig पेशेवरों और विपक्षों को आदेश देता है


28

कुछ बिंदु पर, लिनक्स पर कुछ शिक्षण सामग्री (लिनक्स फाउंडेशन से) जो मेरे पास आया था, निम्नलिखित उल्लेख किया गया है:

ipकमांड अधिक बहुमुखी और अधिक कुशल है ifconfigक्योंकि यह ioctl सिस्टम कॉल के बजाय नेटलिंक सॉकेट्स का उपयोग करता है ।

क्या कोई इस पर थोड़ा विस्तार कर सकता है क्योंकि मैं नहीं समझ सकता कि हुड के नीचे क्या चल रहा है?

PS मुझे उन उपकरणों पर इस विषय के बारे में पता है लेकिन यह इस विशिष्ट अंतर को संबोधित नहीं करता है कि वे कैसे काम करते हैं

जवाबों:


39

ifconfigइस तरह के FreeBSD और OpenBSD के रूप में ऑपरेटिंग सिस्टम पर कमांड ऑपरेटिंग सिस्टम के बाकी के साथ लाइन में अद्यतन किया गया था। यह आजकल उन ऑपरेटिंग सिस्टम पर सभी प्रकार के नेटवर्क इंटरफ़ेस सेटिंग्स को कॉन्फ़िगर कर सकता है, और नेटवर्क प्रोटोकॉल की एक श्रृंखला को संभाल सकता है। बीएसडी ioctl()इन चीजों के लिए सहायता प्रदान करते हैं।

लिनक्स की दुनिया में ऐसा नहीं हुआ। आज, तीन ifconfigआज्ञाएँ हैं:

  • ifconfigसे जीएनयू inetutils
    jdebp% inetutils-ifconfig -l
    enp14s0 enp15s0 लो
    jdebp% inetutils-ifconfig लो
    लो लिंक एनकैप: लोकल लूपबैक
          inet addr: 127.0.0.1 Bcast: 0.0.0.0 मास्क: 255.0.0.0
          UP LOOPBACK रनिंग MTU: 65536 मीट्रिक: 1
          आरएक्स पैकेट: 9087 त्रुटियां: 0 गिरा: 0 ओवररन: 0 फ्रेम: 0
          TX पैकेट: 9087 त्रुटियां: 0 गिरा: 0 ओवररन: 0 वाहक: 0
          टकराव: 0 txqueuelen: 1000
          आरएक्स बाइट्स: 51214341 TX बाइट्स: 51214341
    jdebp%
  • ifconfigसे नेट -3 नेट उपकरण
    jdebp% ifconfig -l
    ifconfig: विकल्प --help 'उपयोग जानकारी देता है।-l' not recognised.
    ifconfig:
    jdebp% ifconfig लो
    lo: झंडे = 73 <UP, LOOPBACK, RUNNING> mtu 65536
        inet 127.0.0.1 नेटमास्क 255.0.0.0
        inet6 :: 1 प्रीफिक्सलीन 128 स्कोपिड 0x10 <होस्ट>
        inet6 :: 2 प्रीफिक्सलीन 128 स्कोपिड 0x80 <कंपेटिटर्स, ग्लोबल>
        inet6 fe80 :: प्रीफिक्सलेन 10 स्कोपिड 0x20 <लिंक>
        लूप txqueuelen 1000 (स्थानीय लूपबैक)
        RX पैकेट 9087 बाइट 51214341 (48.8 MiB)
        आरएक्स त्रुटियां 0 गिरा 0 ओवररन 0 फ्रेम 0
        TX पैकेट 9087 बाइट्स 51214341 (48.8 MiB)
        TX त्रुटियां 0 गिरा 0 ओवररन 0 वाहक 0 टकराव 0
    jdebp%
  • ifconfignosh टूलसेट से (संस्करण 1.40 का)
    jdebp% ifconfig -l
    enp14s0 enp15s0 लो
    jdebp% ifconfig लो
    आरे
        लिंक लूपबैक चल रहा है
        लिंक पता 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00 
        inet4 पता 127.0.0.1 प्रीफिक्सलेन 8 bdaddr 127.0.0.1 
        inet4 पता 127.53.0.1 प्रीफिक्सलेन 8 bdaddr 127.255.255.255 
        inet6 पता :: 2 स्कोप 0 उपसर्ग 128 
        inet6 पता fe80 :: स्कोप 1 प्रीफिक्सलेन 10 
        inet6 पता :: 1 स्कोप 0 उपसर्ग 128
    jdebp% sudo ifconfig lo inet4 127.1.0.2 उपनाम
    jdebp% sudo ifconfig lo inet6 :: 3/128 उपनाम
    jdebp% ifconfig लो
    आरे
        लिंक लूपबैक चल रहा है
        लिंक पता 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00 
        inet4 पता 127.0.0.1 प्रीफिक्सलेन 8 bdaddr 127.0.0.1 
        inet4 पता 127.1.0.2 प्रीफ़िक्सल 32 bdaddr 127.1.0.2 
        inet4 पता 127.53.0.1 प्रीफिक्सलेन 8 bdaddr 127.255.255.255 
        inet6 पता :: 3 स्कोप 0 प्रीफिक्सलेन 128 
        inet6 पता :: 2 स्कोप 0 उपसर्ग 128 
        inet6 पता fe80 :: स्कोप 1 प्रीफिक्सलेन 10 
        inet6 पता :: 1 स्कोप 0 उपसर्ग 128 
    jdebp% 

जैसा कि आप देख सकते हैं, GNU inetutils और NET-3 नेट-टूल्स की ifconfigकुछ चिह्नित कमियां हैं, IPv6 के संबंध में, कई एड्रेस वाले इंटरफेस के संबंध में, और कार्यक्षमता के संबंध में -l

IPv6 समस्या कुछ टूल्स में स्वयं गायब कोड में है। लेकिन मुख्य में यह इस तथ्य के कारण होता है कि लिनक्स ioctl()इंटरफ़ेस के माध्यम से आईपीवी 6 कार्यक्षमता प्रदान नहीं करता है (जैसा कि अन्य ऑपरेटिंग सिस्टम करते हैं) । यह केवल कार्यक्रमों को नेटवर्किंग ioctl()s के माध्यम से IPv4 पतों को देखने और हेरफेर करने देता है ।

इसके बजाय लिनक्स एक अलग इंटरफ़ेस के माध्यम से send()और recv()एक विशेष, और कुछ हद तक अजीब, सॉकेट्स के परिवार को यह कार्यक्षमता प्रदान करता है AF_NETLINK

जीएनयू और NET -3 ifconfigरों सकता है इस नए एपीआई का उपयोग करने के लिए समायोजित किया गया है। ऐसा करने के खिलाफ तर्क यह था कि यह अन्य ऑपरेटिंग सिस्टम के लिए पोर्टेबल नहीं था, लेकिन ये कार्यक्रम पहले से ही पोर्टेबल नहीं थे, वैसे भी यह एक तर्क से ज्यादा नहीं था।

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

इसके बजाय, कुछ लोगों ने टूलसेट को पूरी तरह से एक ipकमांड के रूप में पुनर्निवेशित किया , जिसने नए लिनक्स एपीआई का उपयोग किया, एक अलग वाक्यविन्यास था, और एक फैशनेबल -स्टाइल इंटरफ़ेस के पीछे कई अन्य कार्यों को जोड़ा ।command subcommand

मुझे ifconfigFreeBSD की कमांड-लाइन सिंटैक्स और आउटपुट शैली की आवश्यकता थी ifconfig(जो न तो GNU है और न ही NET-3 ifconfigहै, और जो ipनिश्चित रूप से नहीं है)। तो मैंने एक लिखा। सबूत के तौर पर कि कोई ऐसा लिख ​​सकता है जो ifconfigलिनक्स पर नेटलिंक एपीआई का उपयोग करता है, यह करता है।

तो आप के बारे में प्राप्त ज्ञान ifconfig, जैसे कि आप क्या उद्धृत करते हैं, वास्तव में किसी भी अधिक सच नहीं है। अब यह कहना असत्य है कि " ifconfigनेटलिंक का उपयोग न करें।" दो को कवर करने वाला कंबल तीन को कवर नहीं करता है।

यह कहना हमेशा असत्य रहा है कि "नेटलिंक अधिक कुशल है"। ifconfigनेटलिंक एपीआई और एपीआई के बीच दक्षता के लिए काम करने वाले कार्यों के लिए , इसमें बहुत कुछ नहीं ioctl()है। किसी भी दिए गए कार्य के लिए एपीआई कॉल की संख्या बहुत अधिक है।

वास्तव में, प्रत्येक एपीआई कॉल नेटलिंक मामले में दो सिस्टम कॉल है, जैसा कि ioctl()सिस्टम में एक के विपरीत है। और यकीनन नेटलिंक एपीआई का नुकसान यह है कि एक भारी इस्तेमाल की जाने वाली प्रणाली पर यह स्पष्ट रूप से उपकरण की संभावना को शामिल करता है जिससे एपीआई कॉल के परिणाम के बारे में सूचित करते हुए एक पावती संदेश प्राप्त नहीं होता है।

इसके अलावा, यह कहना असत्य है कि यह ipGNU और NET-3 ifconfigs से "अधिक बहुमुखी" है क्योंकि यह netlink का उपयोग करता है । यह अधिक बहुमुखी है क्योंकि यह अधिक कार्य करता है, एक बड़े कार्यक्रम में चीजें करता है जो एक के अलावा अन्य कार्यक्रमों के साथ करेगा ifconfig। यह केवल एपीआई के संकेत से अधिक बहुमुखी नहीं है कि यह उन अतिरिक्त कार्यों को करने के लिए आंतरिक रूप से उपयोग करता है। इस बारे में API में कुछ भी अंतर्निहित नहीं है। एक एक सब-इन-वन उपकरण है जो FreeBSD इस्तेमाल किया लिख सकता है ioctl()एपीआई, उदाहरण के लिए राज्य, और समान रूप से अच्छी तरह से है कि यह "अधिक बहुमुखी" की तुलना में अलग-अलग ifconfig, route, arp, और ndpआदेशों।

एक लिख सकता है route, arpऔर ndpलिनक्स के लिए आदेश होते हैं जो नेटलिंक एपीआई, भी इस्तेमाल किया।

आगे की पढाई


मुझे लगता है कि आप "अधिक बहुमुखी" दावे में बहुत अधिक पढ़ रहे हैं। IMHO यह केवल कहता है कि नेटलिंक वही है जो ipअधिक बहुमुखी बनाता है , क्योंकि सभी प्रकार की शांत विशेषताएं लिनक्स पर ioctls का उपयोग करने के लिए बस असंभव है (क्योंकि ioctls वहाँ नहीं हैं और संभावना कभी नहीं होगी)।
बहुत बार

1
"netlink वह है जो IP को अधिक बहुमुखी बनाता है" "ip is more versatile क्योंकि यह netlink का उपयोग करता है", जो कि प्रश्न में वहीं है
JdeBP

8

ifconfigहमारे पास कई वितरणों में मानक कई कारणों से हटाए गए हैं। कर्नेल के साथ एक पुराने और सीमित तरीके से बात करता है, और वास्तव में, अब सभी नेटवर्क कॉन्फ़िगरेशन को नहीं समझता है। आप कुछ नेटवर्क कॉन्फ़िगरेशन को ऐसे ifconfigसंस्करणों में हेरफेर करने में सक्षम नहीं होंगे जो आप के साथ करने में सक्षम हैं ip। इसके अलावा, ifconfigनेटवर्क नेमस्पेस का समर्थन सीमित है।

एक वास्तविक कहानी के रूप में, मुझे इंटरफ़ेस आईपी उर्फ ​​मिला जो केवल एसईएसई में दिखाई देता है ipऔर इसमें नहीं ifconfig

हुड के तहत अंतर के लिए के रूप में: ifconfig बनाम आईपी से: क्या अंतर और तुलना नेटवर्क विन्यास है

हालाँकि ipयह पहली साइट पर थोड़ा जटिल लग सकता है लेकिन यह ifconfig की तुलना में कार्यक्षमता में अधिक व्यापक है। यह कार्यात्मक रूप से नेटवर्किंग स्टैक यानी लेयर 2 (लिंक लेयर), लेयर 3 (आईपी लेयर) की दो परतों पर व्यवस्थित है और नेट-टूल पैकेज से उपर्युक्त सभी कमांडों का काम करता है।

जबकि ifconfigज्यादातर सिस्टम के इंटरफेस को प्रदर्शित या संशोधित करता है, यह कमांड निम्नलिखित कार्यों को करने में सक्षम है:

  • इंटरफ़ेस गुणों को प्रदर्शित या संशोधित करना।

  • एक मेजबान के लिए नए स्टेटिक एआरपी प्रविष्टि बनाने के साथ एआरपी कैश प्रविष्टियों को जोड़ना, हटाना।

  • सभी इंटरफेस के साथ जुड़े मैक पते प्रदर्शित करना।

  • कर्नेल राउटिंग टेबल को प्रदर्शित करना और संशोधित करना।

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

नेटलिंक के उपयोग / लाभ के बारे में: एलजे - कर्नेल कोर्नर से - नेटलिंक सॉकेट का उपयोग क्यों और कैसे करें

नेटलिंक सॉकेट एक विशेष आईपीसी है जिसका उपयोग कर्नेल और उपयोगकर्ता-अंतरिक्ष प्रक्रियाओं के बीच सूचना के हस्तांतरण के लिए किया जाता है। यह उपयोगकर्ता-अंतरिक्ष प्रक्रियाओं के लिए मानक सॉकेट एपीआई और कर्नेल मॉड्यूल के लिए एक विशेष कर्नेल एपीआई के माध्यम से दोनों के बीच एक पूर्ण-द्वैध संचार लिंक प्रदान करता है। नेटलिंक सॉकेट पता परिवार AF_NETLINK का उपयोग करता है।

.....

उपर्युक्त विशेषताएं उपयोगकर्ता और कर्नेल दुनिया के बीच संचार के लिए सिस्टम कॉल, ioctls या proc फाइल सिस्टम के बजाय नेटलिंक का उपयोग क्यों करते हैं? सिस्टम कॉल, ioctls को जोड़ना या नई सुविधाओं के लिए फाइलों को खरीदना एक अनौपचारिक कार्य है; हम कर्नेल को प्रदूषित करने और सिस्टम की स्थिरता को नुकसान पहुंचाने का जोखिम उठाते हैं। नेटलिंक सॉकेट सरल है, हालांकि: केवल एक स्थिर, प्रोटोकॉल प्रकार, को netlink.h में जोड़ना होगा। फिर, कर्नेल मॉड्यूल और एप्लिकेशन सॉकेट-शैली एपीआई का उपयोग करके तुरंत बात कर सकते हैं।

....

नेटलिंक सॉकेट उपयोगकर्ता-अंतरिक्ष अनुप्रयोगों और कर्नेल मॉड्यूल के बीच संचार के लिए एक लचीला इंटरफ़ेस है। यह एप्लिकेशन और कर्नेल दोनों को एक आसान-से-उपयोग सॉकेट एपीआई प्रदान करता है। यह उन्नत संचार सुविधाएँ प्रदान करता है, जैसे कि पूर्ण-द्वैध, बफ़र्ड I / O, मल्टीकास्ट और अतुल्यकालिक संचार, जो अन्य कर्नेल / उपयोगकर्ता-स्थान IPCs में अनुपस्थित हैं।

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