Команда ifconfig
в операционных системах, таких как FreeBSD и OpenBSD, была обновлена в соответствии с остальной частью операционной системы. В настоящее время он может настраивать все виды параметров сетевого интерфейса в этих операционных системах и обрабатывать различные сетевые протоколы. BSD предоставляют ioctl()
поддержку для этих вещей.
Этого не произошло в мире Linux. Сегодня есть три ifconfig
команды:
ifconfig
из GNU inetutilsjdebp% inetutils-ifconfig -l
enp14s0 enp15s0 вот
jdebp% inetutils-ifconfig lo
lo Link encap: Local Loopback
адрес в сети: 127.0.0.1 Bcast: 0.0.0.0 Маска: 255.0.0.0
UP LOOPBACK RUNNING 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 net-tools jdebp% ifconfig -l
ifconfig: опция --help 'предоставляет информацию об использовании.-l' not recognised.
ifconfig:
jdebp% ifconfig lo
lo: flags = 73 <UP, LOOPBACK, RUNNING> mtu 65536
Инет 127.0.0.1 маска сети 255.0.0.0
inet6 :: 1 prefixlen 128 scopeid 0x10 <хост>
inet6 :: 2 prefixlen 128 scopeid 0x80 <compat, global>
inet6 fe80 :: prefixlen 10 scopeid 0x20 <ссылка>
loop txqueuelen 1000 (локальная петля)
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 из) набора инструментов nosh jdebp% ifconfig -l
enp14s0 enp15s0 вот
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 :: 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 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 :: 3 области видимости 0 префикс 128
адрес inet6 :: 2 область 0 префикс 128
inet6 адрес fe80 :: префикс 1 области видимости 10
адрес inet6 :: 1 область 0 префикс 128
jdebp%
Как видите, в GNU inetutils и NET-3 net-tools ifconfig
есть некоторые заметные недостатки, как в отношении IPv6, так и в отношении интерфейсов, которые имеют несколько адресов, и в отношении функциональных возможностей, подобных -l
.
Проблема IPv6 отчасти заключается в нехватке кода в самих инструментах. Но в основном это связано с тем, что Linux (как и другие операционные системы) не обеспечивает функциональность IPv6 через ioctl()
интерфейс. Он позволяет программам видеть и управлять IPv4-адресами только через сеть ioctl()
.
Вместо этого Linux предоставляет эту функциональность через другой интерфейс send()
и recv()
по специальному и несколько странному семейству сокетов адресов AF_NETLINK
.
ГНУ и NET-3 ifconfig
s может быть скорректирована , чтобы использовать этот новый API. Аргумент против делать это был то , что он не подходит для других операционных систем, но эти программы были на практике уже нет переносных все равно , так что была не так много аргументов.
Но они не были откорректированы и остаются такими же, как было показано по сей день. (Некоторые люди работали над ними в разные годы, но, к сожалению, усовершенствования так и не попали в программы. Например: Бернд Экенфельс никогда не принимал патч, который добавлял некоторые возможности netlink API к сетевым инструментам NET-3. ifconfig
Через 4 года после написания патча.)
Вместо этого некоторые люди полностью заново изобрели набор инструментов как ip
команду, которая использовала новый Linux API, имела другой синтаксис и объединила несколько других функций за модным интерфейсом в стиле.command subcommand
Мне нужно было ifconfig
иметь синтаксис командной строки и стиль вывода FreeBSD ifconfig
(чего нет ни у GNU, ни у NET-3 ifconfig
, а у которого ip
наверняка нет). Итак, я написал один. В качестве доказательства того, что можно написать ifconfig
API, который использует netlink API в Linux, это так.
Таким образом, полученная мудрость о том ifconfig
, что вы цитируете, больше не соответствует действительности. Это в настоящее время не соответствует действительности сказать , что « ifconfig
не использует NetLink.». Одеяло, которое покрывало два, не покрывает три.
Это всегда было бы неверно говорить о том , что «NetLink является более эффективным». Для задач, с которыми можно справиться ifconfig
, не так много, когда дело доходит до эффективности между netlink API и ioctl()
API. Один делает почти одинаковое количество вызовов API для любой задачи.
Действительно, каждый вызов API - это два системных вызова в случае netlink, а не один в ioctl()
системе. И, возможно, недостатком API netlink является то, что в интенсивно используемой системе он явно включает в себя возможность того, что инструмент никогда не получит подтверждающее сообщение, информирующее его о результате вызова API.
Он, кроме того, неверно говорить о том , что ip
является «более универсальным» , чем GNU и NET-3 ifconfig
s , потому что он использует NetLink . Он более универсален, потому что он выполняет больше задач, выполняя действия в одной большой программе, чем с другими программами ifconfig
. Он не более универсален, просто благодаря API, который он использует внутри для выполнения этих дополнительных задач. В этом нет ничего присущего API. Можно было бы написать инструмент все-в-одном , который использовал FreeBSD ioctl()
API, например, и в равной степени хорошо , что оно является «более универсальным» , чем отдельные ifconfig
, route
, arp
и ndp
команд.
Можно было бы написать route
, arp
и ndp
команды для Linux , которые использовали NETLINK API, тоже.
дальнейшее чтение
ip
более универсальным, потому что все виды интересных функций просто невозможно сделать с помощью ioctl в Linux (потому что ioctl не существует и, вероятно, никогда не будет).