ip vs ifconfig komutları artıları ve eksileri


28

Bir noktada, karşılaştığım Linux'taki bazı öğretim materyallerinde (Linux Foundation'dan), aşağıdakilerden bahsedilmiştir:

ipkomutu, ioctl sistem çağrıları yerine netlink soketleri ifconfigkullandığından daha çok yönlü ve daha etkilidir .

Bu konuda biraz detay çıkarabilir misiniz, çünkü kaputun altında neler olup bittiğini anlayamıyorum?

PS Bu araçlar hakkında bu konunun farkındayım, ancak nasıl çalıştıkları konusundaki bu özel farkı ele almıyor

Yanıtlar:


39

ifconfigFreeBSD ve OpenBSD olarak işletim sistemleri üzerinde komuta işletim sisteminin geri kalan doğrultusunda güncellendi. Günümüzde, bu işletim sistemlerinde her türlü ağ arabirimi ayarını yapılandırabilir ve bir dizi ağ protokolünü yönetebilir. BSD'ler ioctl()bu şeyleri destekliyor.

Bu Linux dünyasında olmadı. Bugün, üç ifconfigkomut var:

  • ifconfigdan GNU inetutils
    jdebp% inetutils-ifconfig -l
    enp14s0 enp15s0 lo
    jdebp% inetutils-ifconfig lo
    lo Bağlantı encap: Yerel Geri Döngü
          inet addr: 127.0.0.1 Yayın: 0.0.0.0 Maske: 255.0.0.0
          UP LOOPBACK ÇALIŞMA MTU: 65536 Metrik: 1
          RX paketleri: 9087 hataları: 0 bırakıldı: 0 aşıldı: 0 çerçeve: 0
          TX paketleri: 9087 hataları: 0 düştü: 0 taşma: 0 taşıyıcı: 0
          çarpışmalar: 0 txqueuelen: 1000
          RX bayt: 51214341 TX bayt: 51214341
    % jdebp
  • ifconfigdan NET-3 net-araçları
    jdebp% ifconfig -l
    ifconfig: option --help 'kullanım bilgisi verir.-l' not recognised.
    ifconfig:
    jdebp% ifconfig lo
    lo: bayraklar = 73 <YUKARI, LOOPBACK, RUNNING> mtu 65536
        127.0.0.1 ağ maskesini 255.0.0.0
        inet6 :: 1 ön ek 128 kapsamı 0x10 <host>
        inet6 :: 2 ön ek 128 kapsamı 0x80 <compat, global>
        inet6 fe80 :: prefixlen 10 kapsamı 0x20 <bağlantı>
        loop txqueuelen 1000 (Yerel Geridöngü)
        RX paketleri 9087 bayt 51214341 (48,8 MiB)
        RX hataları 0 düştü 0
        TX87 9087 by 51214341 paketleri (48,8 MiB)
        TX hataları 0 düştü 0 aşıldı 0 taşıyıcı 0 çarpışma 0
    % jdebp
  • ifconfignosh araç setinden (sürüm 1.40)
    jdebp% ifconfig -l
    enp14s0 enp15s0 lo
    jdebp% ifconfig lo
    bak
        çalışan geridöngü bağla
        bağlantı adresi 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00 
        inet4 adresi 127.0.0.1 ön eki 8 bdaddr 127.0.0.1 
        inet4 adresi 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255 
        inet6 address :: 2 kapsamı 0 öneki 128 
        inet6 adresi fe80 :: kapsam 1 öneki 10 
        inet6 address :: 1 kapsam 0 öneki 128
    jdebp% sudo ifconfig lo inet4 127.1.0.2 takma adı
    jdebp% sudo ifconfig lo inet6 :: 3/128 diğer adı
    jdebp% ifconfig lo
    bak
        çalışan geridöngü bağla
        bağlantı adresi 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00 
        inet4 adresi 127.0.0.1 ön eki 8 bdaddr 127.0.0.1 
        inet4 adresi 127.1.0.2 prefixlen 32 bdaddr 127.1.0.2 
        inet4 adresi 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255 
        inet6 address :: 3 kapsamı 0 öneki 128 
        inet6 address :: 2 kapsamı 0 öneki 128 
        inet6 adresi fe80 :: kapsam 1 öneki 10 
        inet6 address :: 1 kapsam 0 öneki 128 
    % jdebp 

Gördüğünüz gibi, GNU girişleri ve NET-3 ağ araçları ifconfig, IPv6 ile ilgili olarak, birden fazla adrese sahip arayüzlere ve benzer fonksiyonlara ilişkin bazı belirgin eksikliklere sahiptir -l.

IPv6 sorunu kısmen araçların kendisinde bazı eksik kodlardır. Fakat asıl olarak, Linux'un (diğer işletim sistemlerinin yaptığı gibi) ioctl()arabirim aracılığıyla IPv6 işlevselliği sağlamadığı gerçeğinden kaynaklanmaktadır . Yalnızca programların IPv4 adreslerini ağlar üzerinden görmesini ve değiştirmesini sağlar ioctl().

Linux bunun yerine bu işlevselliği farklı bir arabirim aracılığıyla send()ve recv()özel ve biraz tuhaf bir adres ailesi soketinde sunar AF_NETLINK.

GNU ve NET-3 ifconfigler olabilir , bu yeni API kullanmak üzere ayarlanmıştır. Bunu yaparken karşı argüman diğer işletim sistemlerine portatif olmadığını, ancak bu programlar pratikte vardı zaten taşınabilir değil zaten bu kadar bir argüman değildi.

Ancak düzeltilmediler ve bugüne kadar gösterildiği gibi kaldılar. (Bazı insanlar onlar üzerinde yıllar boyunca çeşitli noktalarda çalıştılar, ancak söylenen üzücü gelişmeler hiçbir zaman programlara dahil edilmedi. Örneğin: Bernd Eckenfels , NET-3 ağ araçlarına bazı netlink API özelliği ekleyen bir yamayı kabul etmedi. ifconfig, Yamanın yazıldığından 4 yıl sonra.)

Bunun yerine, bazı insanlar araç setini ip, yeni Linux API'sini kullanan, farklı bir sözdizimine sahip bir komut olarak tamamen yeniden icat ettiler ve modaya uygun bir arayüzün arkasında birkaç başka işlevi birleştirdiler .command subcommand

Bir ihtiyaç ifconfigFreeBSD komut satırı sözdizimi ve çıkış tarzı vardı o ifconfig(GNU ne de NET-3 ne ifconfigvardır ve hangi ipkesinlikle yoktur). Bu yüzden bir tane yazdım. ifconfigLinux'ta netlink API'sini kullanan bir kişinin yazabileceğinin kanıtı olarak yazıyor.

Dolayısıyla, ifconfigne alıntı yaptığınız gibi edinilen bilgelik artık doğru değil. Öyle Şimdi yanlış olduğunu söylemek " ifconfignetlink kullanmaz.". İkiyi örten battaniye üçü kapsamaz.

Her zaman "netlink'in daha verimli olduğunu" söylemek yanlış olmuştur . Birinin yaptığı işlerde ifconfignetlink API ve API arasında verimlilik söz konusu olduğunda çok fazla bir şey yok ioctl(). Biri, verilen herhangi bir görev için hemen hemen aynı sayıda API çağrısını yapar.

Gerçekten de, her bir API çağrısı, sistemdeki bir çağrıya göre, netlink durumunda iki sistem çağrısıdır ioctl(). Ve tartışılabilir bir şekilde netlink API, yoğun olarak kullanılan bir sistemde, takımın API çağrısının sonucunu bildiren hiçbir zaman bir onay mesajı alma olasılığını açıkça içermemesi dezavantajına sahiptir.

Yine aynı şekilde, gerçek dışı olduğunu söylemek olan ipGNU "daha çok yönlü" dır ve NET-3 ifconfigler o netlink kullanması nedeniyle . Daha çok yönlüdür çünkü daha fazla görev yapar, büyük bir programda birinin başka programlarla yapacağı şeyleri yapar ifconfig. Bu fazladan görevleri yerine getirmek için dahili olarak kullandığı API'nin bir ifadesiyle çok yönlü değildir. API ile ilgili bu konuda hiçbir şey yoktur. Bir FreeBSD kullanılan hepsi-bir araç yazabiliriz ioctl()bu "çok yönlü" bireysel fazla olduğunu eşit ölçüde iyi durum, örneğin, API ve ifconfig, route, arpve ndpkomutlar.

Bir yazabilirsiniz route, arpve ndpde netlink API kullanılan Linux için komutlar.

daha fazla okuma


Bence "çok yönlü" iddiasını çok okuyorsun. IMHO sadece netlink'in ipdaha çok yönlü kılan şey olduğunu söylüyor , çünkü her türlü harika özellik Linux'ta ioctls kullanarak yapmak imkansızdır (çünkü ioctls orada değildir ve asla olmayacaktır).
TooTea

1
olan "o netlink kullandığı için ip daha çok yönlüdür" aynıdır "netlink daha çok yönlü ip kılan" Söz konusu orada .
JdeBP

8

ifconfigPek çok dağıtımda sahip olduğumuz standart , çeşitli nedenlerle kullanımdan kaldırılmıştır. Çekirdek ile modası geçmiş ve sınırlı bir şekilde görüşüyor ve aslında, tüm ağ yapılandırmalarını anlamıyor. ifconfigYapabileceğiniz sürümler gibi bazı ağ yapılandırmalarını değiştiremezsiniz ip. Ek olarak, ifconfigağ ad alanları için destek sınırlıdır.

Bir fıkra hikayesi olarak, sadece ipSuSE’de görülebilen ve görünmeyen IP takma adını buldum ifconfig.

Başlık altındaki farklara gelince: From ifconfig vs ip: Farkı ve Ağ Yapılandırmasını Karşılaştırma

Her ne kadar ipilk sitesinde biraz karmaşık görünebilir ama ifconfig daha işlevsellik çok daha geniştir olabilir. İki Ağ Yığını katmanında, yani Katman 2'de (Bağlantı Katmanı), Katman 3'te (IP Katmanı) işlevsel olarak düzenlenir ve yukarıda belirtilen komutların hepsini net-tools paketinden gerçekleştirir.

İken ifconfigçoğunlukla görüntüler veya değiştirir bir sistemin arayüzleri bu komut aşağıdaki görevleri yapma yeteneğine sahiptir:

  • Arabirim özelliklerini görüntüleme veya değiştirme.

  • Bir ana bilgisayar için yeni Statik ARP girişi oluştururken ARP Önbelleği girişlerini ekleme, kaldırma.

  • Tüm arayüzlerle ilişkili MAC adreslerini görüntüleme.

  • Çekirdek yönlendirme tablolarını görüntüleme ve değiştirme.

İfconfig'i eski muadili ifconfig'ten ayıran en önemli noktalardan biri, ağ yapılandırması için ioctl'yi kullanmasıdır; bu, çekirdeği ile etkileşimin daha az kabul görmüş bir yoludur; ioctl 'nin çekirdek ve kullanıcı alanı arasındaki iletişim için rtnetlink (ağ ortamı manipülasyon kabiliyeti ekler) kullanarak.

Netlink kullanımı / avantajları hakkında: LJ'den - Kernel Korner - Netlink Soketinin Neden ve Nasıl Kullanılacağı

Netlink soketi, çekirdek ve kullanıcı alanı işlemleri arasında bilgi aktarımı için kullanılan özel bir IPC'dir. Kullanıcı alanı işlemleri için standart soket API'leri ile ikisi arasında tam çift yönlü bir iletişim bağlantısı ve çekirdek modülleri için özel bir çekirdek API sağlar. Netlink soketi, AF_NETLINK adres ailesini kullanır.

.....

Yukarıdaki özellikler neden kullanıcı ve çekirdek dünyalar arasındaki iletişim için sistem çağrıları, ioctls veya proc dosya sistemleri yerine netlink kullanıyor? Yeni özellikler için sistem çağrıları, ioctls veya proc dosyaları eklemek önemsiz bir iştir; çekirdeği kirletme ve sistemin istikrarına zarar verme riskini alıyoruz. Netlink soketi basittir, ancak: sadece bir sabit olan protokol türünün netlink.h dosyasına eklenmesi gerekir. Ardından, çekirdek modülü ve uygulama hemen soket tarzı API'leri kullanarak konuşabilir.

....

Netlink soketi, kullanıcı alanı uygulamaları ve çekirdek modülleri arasındaki iletişim için esnek bir arayüzdür. Hem uygulamalar hem de çekirdeğe kullanımı kolay bir soket API'si sağlar. Diğer çekirdek / kullanıcı alanı IPC'lerinde bulunmayan tam çift yönlü, arabellekli G / Ç, çok noktaya yayın ve eşzamansız iletişim gibi gelişmiş iletişim özellikleri sunar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.