ip vs ifconfig memerintahkan pro dan kontra

28

Pada titik tertentu, dalam beberapa bahan pengajaran (dari Linux Foundation) di Linux yang saya temui, berikut ini disebutkan:

ipperintah lebih fleksibel dan lebih efisien daripada ifconfigkarena menggunakan soket netlink daripada panggilan sistem ioctl .

Adakah yang bisa menjelaskan sedikit tentang ini karena saya tidak bisa mengerti apa yang terjadi di bawah tenda?

PS Saya mengetahui topik ini pada alat-alat itu tetapi tidak membahas perbedaan khusus ini tentang bagaimana mereka beroperasi

pkaramol
sumber

Jawaban:

39

The ifconfigperintah pada sistem operasi seperti FreeBSD dan OpenBSD telah diupdate sejalan dengan sisa dari sistem operasi. Saat ini dapat mengkonfigurasi semua jenis pengaturan antarmuka jaringan pada sistem operasi tersebut, dan menangani berbagai protokol jaringan. BSD memberikan ioctl()dukungan untuk hal-hal ini.

Ini tidak terjadi di dunia Linux. Ada, hari ini, tiga ifconfigperintah:

  • ifconfigdari GNU inetutils
    jdebp% inetutils-ifconfig -l
    enp14s0 enp15s0 lo
    jdebp% inetutils-ifconfig lo
    lo Link encap: Local Loopback
          inet addr: 127.0.0.1 Bcast: 0.0.0.0 Mask: 255.0.0.0
          MENJALANKAN LOOPBACK MTU: 65536 Metrik: 1
          Paket RX: Kesalahan 9087: 0 jatuh: 0 overruns: 0 bingkai: 0
          Paket TX: 9087 kesalahan: 0 jatuh: 0 overruns: 0 operator: 0
          tabrakan: 0 txqueuelen: 1000
          Bita RX: 51214341 Bita TX: 51214341
    jdebp%
  • ifconfigdari NET-3 net-tools
    jdebp% ifconfig -l
    ifconfig: option --help 'memberikan informasi penggunaan.-l' not recognised.
    ifconfig:
    jdebp% ifconfig lo
    lo: flags = 73 <UP, LOOPBACK, RUNNING> mtu 65536
        inet 127.0.0.1 netmask 255.0.0.0
        inet6 :: 1 prefixlen 128 scopeid 0x10 <host>
        inet6 :: 2 prefixlen 128 scopeid 0x80 <compat, global>
        inet6 fe80 :: prefixlen 10 scopeid 0x20 <link>
        loop txqueuelen 1000 (Loopback Lokal)
        Paket RX 9087 byte 51214341 (48,8 MiB)
        Kesalahan RX 0 turun 0 overruns 0 frame 0
        Paket TX 9087 byte 51214341 (48,8 MiB)
        Kesalahan TX 0 turun 0 overruns 0 operator 0 tumbukan 0
    jdebp%
  • ifconfigdari (versi 1.40 dari) nosh toolset
    jdebp% ifconfig -l
    enp14s0 enp15s0 lo
    jdebp% ifconfig lo
    lihat
        menghubungkan loopback yang sedang berjalan
        alamat tautan 00: 00: 00: 00: 00: bdaddr 00: 00: 00: 00: 00: 00 
        alamat inet4 127.0.0.1 awalan 8 bdaddr 127.0.0.1 
        alamat inet4 127.53.0.1 awalan 8 bdaddr 127.255.255.255 
        alamat inet6 :: 2 scope 0 prefixlen 128 
        alamat inet6 fe80 :: scope 1 prefixlen 10 
        alamat inet6 :: 1 scope 0 prefixlen 128
    jdebp% sudo ifconfig lo inet4 127.1.0.2 alias
    jdebp% sudo ifconfig lo inet6 :: 3/128 alias
    jdebp% ifconfig lo
    lihat
        menghubungkan loopback yang sedang berjalan
        alamat tautan 00: 00: 00: 00: 00: bdaddr 00: 00: 00: 00: 00: 00 
        alamat inet4 127.0.0.1 awalan 8 bdaddr 127.0.0.1 
        alamat inet4 127.1.0.2 awalan 32 bdaddr 127.1.0.2 
        alamat inet4 127.53.0.1 awalan 8 bdaddr 127.255.255.255 
        alamat inet6 :: 3 scope 0 prefixlen 128 
        alamat inet6 :: 2 scope 0 prefixlen 128 
        alamat inet6 fe80 :: scope 1 prefixlen 10 
        alamat inet6 :: 1 scope 0 prefixlen 128 
    jdebp% 

Seperti yang Anda lihat, inetutils GNU dan NET-3 net-tools ifconfigmemiliki beberapa kekurangan, sehubungan dengan IPv6, sehubungan dengan antarmuka yang memiliki banyak alamat, dan sehubungan dengan fungsionalitas seperti -l.

Masalah IPv6 sebagian adalah beberapa kode yang hilang dalam alat itu sendiri. Tetapi pada dasarnya itu disebabkan oleh fakta bahwa Linux tidak (seperti sistem operasi lain lakukan) menyediakan fungsionalitas IPv6 melalui ioctl()antarmuka. Itu hanya memungkinkan program melihat dan memanipulasi alamat IPv4 melalui jaringan ioctl().

Linux malah menyediakan fungsionalitas ini melalui antarmuka yang berbeda, send()dan recv()pada keluarga soket yang khusus, dan agak aneh AF_NETLINK,.

GNU dan NET-3 ifconfigs bisa telah disesuaikan untuk menggunakan API baru ini. Argumen yang menentang hal itu adalah bahwa itu tidak portabel untuk sistem operasi lain, tetapi program-program ini dalam praktiknya sudah tidak portabel sehingga toh tidak banyak bertengkar.

Tetapi mereka tidak disesuaikan, dan tetap seperti yang disebutkan sebelumnya sampai hari ini. (Beberapa orang mengerjakannya di berbagai titik selama bertahun-tahun, tetapi perbaikannya, sayangnya, tidak pernah berhasil masuk ke dalam program. Misalnya: Bernd Eckenfels tidak pernah menerima tambalan yang menambahkan beberapa kemampuan API netlink ke NET-3 net-tools ifconfig, 4 tahun setelah tambalan ditulis.)

Sebagai gantinya, beberapa orang sepenuhnya menciptakan kembali toolset sebagai suatu ipperintah, yang menggunakan Linux API baru, memiliki sintaks yang berbeda, dan menggabungkan beberapa fungsi lain di belakang antarmuka gaya- modis .command subcommand

Saya membutuhkan ifconfigyang memiliki sintaks baris perintah dan gaya keluaran dari FreeBSD ifconfig(yang tidak dimiliki oleh GNU maupun NET-3 ifconfig, dan yang iptentunya tidak memiliki). Jadi saya menulis satu. Sebagai bukti bahwa seseorang dapat menulis sebuah ifconfigyang menggunakan API netlink di Linux, ia melakukannya.

Jadi kebijaksanaan yang diterima tentang ifconfig, seperti apa yang Anda kutip, tidak benar lagi. Hal ini sekarang tidak benar untuk mengatakan bahwa " ifconfigtidak menggunakan netlink.". Selimut yang menutupi dua tidak mencakup tiga.

Itu selalu tidak benar untuk mengatakan bahwa "netlink lebih efisien". Untuk tugas-tugas yang dilakukan seseorang ifconfig, sebenarnya tidak ada banyak hal terkait efisiensi antara API netlink dan ioctl()API. Seseorang membuat jumlah panggilan API yang hampir sama untuk setiap tugas yang diberikan.

Memang, setiap panggilan API adalah dua panggilan sistem dalam kasus netlink, berbeda dengan panggilan dalam ioctl()sistem. Dan bisa dibilang netlink API memiliki kelemahan bahwa pada sistem yang banyak digunakan itu secara eksplisit menggabungkan kemungkinan alat tidak pernah menerima pesan pengakuan yang menginformasikan hasil panggilan API.

Hal ini, lebih jauh lagi, tidak benar untuk mengatakan bahwa ipadalah "lebih fleksibel" dari GNU dan NET-3 ifconfigs karena menggunakan netlink . Itu lebih fleksibel karena melakukan lebih banyak tugas, melakukan hal-hal dalam satu program besar yang satu akan dilakukan dengan program terpisah selain ifconfig . Ini tidak lebih fleksibel hanya dengan berkat API yang digunakan secara internal untuk melakukan tugas-tugas ekstra. Tidak ada yang melekat pada API tentang ini. Satu bisa menulis alat all-in-one yang menggunakan FreeBSD ioctl()API, misalnya, dan sama-sama baik negara bahwa itu adalah "lebih fleksibel" dari individu ifconfig, route, arp, dan ndpperintah.

Orang bisa menulis route,, arpdan ndpperintah untuk Linux yang menggunakan API netlink juga.

Bacaan lebih lanjut

JdeBP
sumber
Saya pikir Anda terlalu banyak membaca klaim "lebih fleksibel". IMHO itu hanya mengatakan bahwa netlink adalah apa yang membuat iplebih fleksibel, karena semua jenis fitur keren tidak mungkin dilakukan dengan menggunakan ioctls di Linux (karena ioctl tidak ada dan kemungkinan tidak akan pernah ada).
TooTea
1
"netlink adalah apa yang membuat ip lebih fleksibel" sama dengan "ip lebih fleksibel karena menggunakan netlink", yang ada di pertanyaan itu .
JdeBP
8

Standar yang ifconfigkami miliki di banyak distribusi sudah usang karena beberapa alasan. Pembicaraan dengan cara yang lama dan terbatas dengan kernel, dan pada kenyataannya, tidak mengerti lagi semua konfigurasi jaringan. Anda tidak akan dapat memanipulasi beberapa konfigurasi jaringan ifconfigversi yang dapat Anda lakukan ip. Selain itu, ifconfigdukungan untuk ruang nama jaringan terbatas.

Sebagai kisah anekdotal, saya menemukan alias antarmuka IP yang hanya terlihat ipdan tidak di SuSE ifconfig.

Adapun perbedaan di bawah tenda: Dari ifconfig vs ip: Apa Perbedaan dan Membandingkan Konfigurasi Jaringan

Meskipun ipmungkin tampak sedikit rumit pada situs pertama tetapi fungsinya jauh lebih luas daripada ifconfig. Secara fungsional diatur pada dua lapisan Networking Stack yaitu Layer 2 (Link Layer), Layer 3 (IP Layer) dan melakukan pekerjaan semua perintah yang disebutkan di atas dari paket net-tools.

Meskipun ifconfigsebagian besar menampilkan atau memodifikasi antarmuka suatu sistem, perintah ini mampu melakukan tugas-tugas berikut:

  • Menampilkan atau Memodifikasi properti Antarmuka.

  • Menambah, Menghapus entri Cache ARP bersama menciptakan entri ARP Statis baru untuk host.

  • Menampilkan alamat MAC yang terkait dengan semua antarmuka.

  • Menampilkan dan memodifikasi tabel routing kernel.

Salah satu sorotan utama yang memisahkannya dari ifconfig tandingan sebelumnya adalah bahwa ioctl menggunakan konfigurasi jaringan, yang merupakan cara interaksi yang kurang dihargai dengan kernel sementara yang terdahulu memanfaatkan mekanisme soket netlink untuk hal yang sama yang merupakan penerus yang jauh lebih fleksibel ioctl untuk komunikasi antar kernel dan ruang pengguna menggunakan rtnetlink (yang menambah kemampuan manipulasi lingkungan jaringan).

Tentang penggunaan / keunggulan netlink: Dari LJ - Kernel Korner - Mengapa dan Cara Menggunakan Netlink Socket

Netlink socket adalah IPC khusus yang digunakan untuk mentransfer informasi antara proses kernel dan ruang pengguna. Ini menyediakan tautan komunikasi dupleks penuh antara keduanya melalui API soket standar untuk proses ruang pengguna dan API kernel khusus untuk modul kernel. Soket Netlink menggunakan keluarga alamat AF_NETLINK.

.....

Mengapa fitur di atas menggunakan netlink alih-alih panggilan sistem, ioctls atau sistem file proc untuk komunikasi antara pengguna dan dunia kernel? Ini adalah tugas non-pribadi untuk menambahkan panggilan sistem, ioctls atau file proc untuk fitur baru; kami berisiko mencemari kernel dan merusak stabilitas sistem. Soket Netlink sederhana, meskipun: hanya konstanta, tipe protokol, perlu ditambahkan ke netlink.h. Kemudian, modul dan aplikasi kernel dapat berbicara menggunakan API gaya socket dengan segera.

....

Netlink socket adalah antarmuka yang fleksibel untuk komunikasi antara aplikasi ruang pengguna dan modul kernel. Ini menyediakan API socket yang mudah digunakan untuk kedua aplikasi dan kernel. Ia menyediakan fitur-fitur komunikasi tingkat lanjut, seperti full-duplex, I / O buffered, komunikasi multicast dan asinkron, yang tidak ada dalam IPC kernel / ruang pengguna lainnya.

Rui F Ribeiro
sumber