ip vs ifconfig командує за і проти


28

В якийсь момент у деяких навчальних матеріалах (від Linux Foundation) про Linux, на які я потрапив, згадується таке:

ipКоманда є більш універсальною та ефективнішою, ніж ifconfigчерез те, що вона використовує мережеві розетки, а не виклики системи ioctl .

Хтось може детальніше розібратися в цьому, тому що я не можу зрозуміти, що відбувається під кришкою?

PS Я знаю цю тему щодо цих інструментів, але вона не стосується цієї конкретної різниці в тому, як вони працюють

Відповіді:


39

ifconfigКоманда операційних систем , таких як FreeBSD і OpenBSD був оновлений відповідно з іншою частиною операційної системи. На сьогоднішній день він може налаштувати всі види налаштувань мережевого інтерфейсу для цих операційних систем та обробляти цілий ряд мережевих протоколів. BSD ioctl()підтримують ці речі.

У світі Linux цього не сталося. Сьогодні є три ifconfigкоманди:

  • ifconfigвід 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 Маска: 255.0.0.0
          НАГОРОДЖЕННЯ РОЗВ'ЯЗУ MTU: 65536 Метріч: 1
          Пакети RX: 9087 помилок: 0 випали: 0 перевитрати: 0 кадр: 0
          TX-пакети: 9087 помилок: 0 випало: 0 перевитрат: 0 перевізник: 0
          зіткнення: 0 txqueuelen: 1000
          RX байт: 51214341 TX байт: 51214341
    jdebp%
  • ifconfigвід мережевих інструментів NET-3
    jdebp% ifconfig -l
    ifconfig: option --help 'дає інформацію про використання.-l' not recognised.
    ifconfig:
    jdebp% ifconfig lo
    lo: flags = 73 <UP, LOOPBACK, RUNNING> mtu 65536
        inet 127.0.0.1 маска мережі 255.0.0.0
        inet6 :: 1 префікс. 128 області 0x10 <host>
        inet6 :: 2 префікс 128, розмір 0x80 <compat, global>
        inet6 fe80 :: prefixlen 10 obseid 0x20 <посилання>
        петля txqueuelen 1000 (Local Loopback)
        RX пакети 9087 байт 51214341 (48,8 МіБ)
        Похибки RX 0 впали 0 перевищення 0 кадр 0
        TX-пакети 9087 байт 51214341 (48,8 МіБ)
        Похибки TX 0 впали 0 перевитрати 0 перевізник 0 зіткнення 0
    jdebp%
  • ifconfigз (версія 1.40) набору інструментів "noh"
    jdebp% ifconfig -l
    enp14s0 enp15s0 lo
    jdebp% ifconfig lo
    ло
        з'єднати циклічне виконання
        адреса посилання 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 address :: 2 область 0 префікс 128 
        inet6 адреса fe80 :: префікс області 1 
        inet6 address :: 1 область 0 префікс 128
    jdebp% sudo ifconfig lo inet4 127.1.0.2 псевдонім
    jdebp% sudo ifconfig lo inet6 :: 3/128 псевдонім
    jdebp% ifconfig lo
    ло
        з'єднати циклічне виконання
        адреса посилання 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 address :: 3 область 0 префікс 128 
        inet6 address :: 2 область 0 префікс 128 
        inet6 адреса fe80 :: префікс області 1 
        inet6 address :: 1 область 0 префікс 128 
    jdebp% 

Як бачимо, inetutils GNU та мережеві інструменти NET-3 ifconfigмають деякі помітні недоліки щодо IPv6 щодо інтерфейсів, які мають декілька адрес, та щодо функціональності -l.

Проблема IPv6 частково є деяким відсутнім кодом у самих інструментах. Але в основному це викликано тим, що Linux не забезпечує (як це роблять інші операційні системи) функціональність IPv6 через ioctl()інтерфейс. Це лише дозволяє програмам бачити та маніпулювати адресами IPv4 через мережу ioctl().

Linux , замість цього забезпечує цю функцію через інший інтерфейс, send()і recv()на спеціальному, і трохи дивно, сімейство адрес сокетов, AF_NETLINK.

GNU та NET-3 ifconfigs могли бути налаштовані для використання цього нового API. Аргумент проти робити це було те , що він не підходить для інших операційних систем, але ці програми були на практиці вже НЕ стерпні в будь-якому випадку , так що було не так багато аргументів.

Але вони не були налагоджені і залишаються такими, як раніше були показані. (Деякі люди працювали над ними в різні моменти протягом багатьох років, але вдосконалення, як це не сумно сказати, ніколи не входили в програми. Наприклад: Бернд Еккенфельс ніколи не приймав патч, який додав певну можливість API netlink до мережевих інструментів NET-3 ifconfig, Через 4 роки після написання виправлення.)

Натомість деякі люди повністю винаходили набір інструментів як ipкоманду, яка використовувала новий Linux API, мала інший синтаксис та поєднувала кілька інших функцій, що стоять за модним інтерфейсом стилю.command subcommand

Мені потрібен був ifconfigтой, що мав синтаксис командного рядка та стиль випуску FreeBSD ifconfig(якого немає ні в GNU, ні в NET-3 ifconfig, і якого, ipзвичайно, немає). Так я написав один. Як доказ того, що можна написати ifconfigантенну, яка використовує API netlink в Linux, це робить.

Тож отримана мудрість щодо ifconfigтакого, як ви цитуєте, вже не справді. Це в даний час НЕ відповідає дійсності сказати , що « ifconfigне використовує NetLink.». Ковдра, яка накрила два, не охоплює трьох.

Це завжди було б невірно говорити про те , що «NetLink є більш ефективним». Щодо завдань, з якими ви ifconfigпрацюєте, насправді в ньому не так багато, коли справа стосується ефективності між netlink API та ioctl()API. Один робить однакову кількість викликів API для будь-якого завдання.

Дійсно, кожен виклик API - це два системні виклики у випадку netlink, на відміну від одного в ioctl()системі. І, мабуть, недолік API netlink має те, що у широко використовуваній системі він явно включає можливість інструменту ніколи не отримувати повідомлення про підтвердження, що інформує його про результат виклику API.

Крім того, неправда сказати, що ipвона "більш універсальна", ніж GNU та NET-3 ifconfigs, оскільки вона використовує мережеве посилання . Він більш універсальний, тому що він виконує більше завдань, виконуючи речі в одній великій програмі, яку можна було б зробити з окремими програмами, крім яких ifconfig . Він не є більш універсальним просто за допомогою фарби API, який він використовує внутрішньо для виконання цих додаткових завдань. Про це нічого не властиве API. Можна було б написати інструмент все-в-одному , який використовував FreeBSD ioctl()API, наприклад, і в рівній мірі добре , що воно є «більш універсальним» , ніж окремі ifconfig, route, arpі ndpкоманд.

Можна писати route, arpі ndpкоманди для Linux, які також використовували API netlink.

Подальше читання


Я думаю, ви занадто багато читаєте в "більш універсальній" заяві. IMHO говорить лише про те, що netlink - це те, що робить ipбільш універсальним, тому що всі види класних функцій просто неможливо зробити за допомогою ioctls в Linux (тому що йоктлів немає і, швидше за все, не буде).
TooTea

1
"netlink - це те, що робить ip більш універсальним", це те саме, що "ip є більш універсальним, оскільки він використовує netlink", про що саме йдеться в питанні .
JdeBP

8

Стандарт, який ifconfigми маємо у багатьох дистрибутивах, застарілий з кількох причин. Розмовляє застарілим і обмеженим способом з ядром, а насправді вже не розуміє всіх конфігурацій мережі. Ви не зможете маніпулювати деякими мережевими конфігураціями таких ifconfigверсій, з якими ви можете виконати ip. Крім того, ifconfigпідтримка просторів мережних імен обмежена.

Як анекдотична казка, я знайшов псевдоніми інтерфейсу IP, які видно лише ipв SuSE ifconfig.

Щодо відмінностей під кришкою: From ifconfig vs ip: у чому різниця та порівняння конфігурації мережі

Хоча це ipможе здатися трохи складним на першому сайті, але він набагато ширший за функціональністю, ніж ifconfig. Він функціонально організований на двох шарах Networking Stack, тобто Layer 2 (Link Layer), Layer 3 (IP Layer) і виконує роботу всіх вищезазначених команд з пакету net-tools.

Хоча ifconfigздебільшого відображає або модифікує інтерфейси системи, ця команда здатна виконувати наступні завдання:

  • Відображення або зміна властивостей інтерфейсу.

  • Додавання, видалення записів кешу ARP разом зі створенням нового статичного запису ARP для хоста.

  • Відображення MAC-адрес, пов'язаних з усіма інтерфейсами.

  • Відображення та модифікація таблиць маршрутизації ядра.

Однією з головних родзинок, що відокремлює його від стародавнього аналога ifconfig, є те, що останній використовує ioctl для конфігурації мережі, що є менш цінуваним способом взаємодії з ядром, тоді як колишній користується перевагою механізму розетки netlink для того ж, що є набагато гнучкішим наступником ioctl для взаємозв'язку між ядром та користувацьким простором за допомогою rtnetlink (що додає можливості маніпулювання мережевим середовищем).

Про використання / переваги netlink: Від LJ - Kernel Korner - Чому і як користуватися Netlink Socket

Netlink socket - це спеціальна IPC, яка використовується для передачі інформації між процесами ядра та простору користувача. Він забезпечує повнодуплексний зв’язок між двома способами стандартних API сокетів для процесів у просторі користувача та спеціальним API ядра для модулів ядра. Сокет Netlink використовує сімейство адрес AF_NETLINK.

.....

Чому вищевказані функції використовують мережеве посилання замість системних викликів, файлів йоктлів або файлових систем proc для зв'язку між світами користувача та ядра? Нетривіальне завдання - додавати системні виклики, ioctls або файли proc для нових функцій; ми ризикуємо забруднити ядро ​​і пошкодити стабільність системи. Хоча Netlink socket простий: до netlink.h потрібно додавати лише константу, тип протоколу. Потім модуль ядра та додаток можуть негайно спілкуватися, використовуючи API стилю socket.

….

Netlink socket - це гнучкий інтерфейс для зв'язку між програмами користувача та просторами ядра. Він забезпечує простий у використанні API сокета як для програм, так і для ядра. Він надає вдосконалені комунікаційні функції, такі як повнодуплексний, захищений введення / вивід, багатоадресна передача та асинхронна комунікація, які відсутні в інших IPC ядер / користувальницького простору.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.