El ifconfig
comando en sistemas operativos como FreeBSD y OpenBSD se actualizó en línea con el resto del sistema operativo. Hoy en día puede configurar todo tipo de configuraciones de interfaz de red en esos sistemas operativos y manejar una variedad de protocolos de red. Los BSD proporcionan ioctl()
soporte para estas cosas.
Esto no sucedió en el mundo de Linux. Hay, hoy, tres ifconfig
comandos:
ifconfig
de GNU inetutilsjdebp% inetutils-ifconfig -l
enp14s0 enp15s0 lo
jdebp% inetutils-ifconfig lo
lo Link encap: Loopback local
inet addr: 127.0.0.1 Bcast: 0.0.0.0 Máscara: 255.0.0.0
UP LOOPBACK MTU EN EJECUCIÓN: 65536 Métrica: 1
Paquetes RX: 9087 errores: 0 descartados: 0 desbordamientos: 0 trama: 0
Paquetes TX: 9087 errores: 0 descartados: 0 desbordamientos: 0 operador: 0
colisiones: 0 txqueuelen: 1000
RX bytes: 51214341 TX bytes: 51214341
jdebp%
-
ifconfig
de NET-3 net-tools jdebp% ifconfig -l
ifconfig: la opción --help 'proporciona información de uso.-l' not recognised.
ifconfig:
jdebp% ifconfig lo
lo: flags = 73 <ARRIBA, LOOPBACK, RUNNING> mtu 65536
inet 127.0.0.1 máscara de red 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 <enlace>
loop txqueuelen 1000 (Loopback local)
Paquetes RX 9087 bytes 51214341 (48.8 MiB)
Errores RX 0 caídos 0 desbordamientos 0 fotograma 0
Paquetes TX 9087 bytes 51214341 (48.8 MiB)
Errores de TX 0 descartados 0 desbordamientos 0 transportista 0 colisiones 0
jdebp%
-
ifconfig
de (versión 1.40 de) el conjunto de herramientas nosh jdebp% ifconfig -l
enp14s0 enp15s0 lo
jdebp% ifconfig lo
lo
enlace loopback corriendo
dirección de enlace 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00
dirección inet4 127.0.0.1 prefijo 8 bdaddr 127.0.0.1
dirección inet4 127.53.0.1 prefijo 8 bdaddr 127.255.255.255
dirección inet6 :: 2 alcance 0 prefijo 128
dirección inet6 fe80 :: alcance 1 prefijo 10
dirección inet6 :: 1 alcance 0 prefijo 128
jdebp% sudo ifconfig lo inet4 127.1.0.2 alias
jdebp% sudo ifconfig lo inet6 :: 3/128 alias
jdebp% ifconfig lo
lo
enlace loopback corriendo
dirección de enlace 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00
dirección inet4 127.0.0.1 prefijo 8 bdaddr 127.0.0.1
dirección inet4 127.1.0.2 prefijo 32 bdaddr 127.1.0.2
dirección inet4 127.53.0.1 prefijo 8 bdaddr 127.255.255.255
dirección inet6 :: 3 alcance 0 prefijo 128
dirección inet6 :: 2 alcance 0 prefijo 128
dirección inet6 fe80 :: alcance 1 prefijo 10
dirección inet6 :: 1 alcance 0 prefijo 128
jdebp%
Como puede ver, los inetutils de GNU y las herramientas de red NET-3 ifconfig
tienen algunas deficiencias marcadas, con respecto a IPv6, con respecto a las interfaces que tienen múltiples direcciones, y con respecto a funcionalidades similares -l
.
El problema de IPv6 es, en parte, algún código faltante en las herramientas mismas. Pero, en general, se debe al hecho de que Linux no proporciona (como lo hacen otros sistemas operativos) la funcionalidad IPv6 a través de la ioctl()
interfaz. Solo permite que los programas vean y manipulen direcciones IPv4 a través de las redes ioctl()
.
En cambio, Linux proporciona esta funcionalidad a través de una interfaz diferente send()
y recv()
en una familia de sockets de direcciones especial y algo extraña AF_NETLINK
.
Los GNU y NET-3 ifconfig
s podrían se han ajustado para utilizar esta nueva API. El argumento en contra de hacerlo fue que no era portátil para otros sistemas operativos, pero estos programas en la práctica ya no eran portátiles de todos modos, por lo que no era un gran argumento.
Pero no fueron ajustados, y permanecen como se mencionó hasta el día de hoy. (Algunas personas trabajaron en ellos en varios puntos a lo largo de los años, pero las mejoras, por desgracia , nunca llegaron a los programas. Por ejemplo: Bernd Eckenfels nunca aceptó un parche que agregara alguna capacidad de API de enlace de red a las herramientas de red NET-3 ifconfig
, 4 años después de que se haya escrito el parche).
En cambio, algunas personas reinventaron completamente el conjunto de herramientas como un ip
comando, que usaba la nueva API de Linux, tenía una sintaxis diferente y combinaba varias otras funciones detrás de una interfaz de estilo moderno .command subcommand
Necesitaba una ifconfig
que tuviera la sintaxis de línea de comandos y el estilo de salida de FreeBSD ifconfig
(que ni el GNU ni el NET-3 ifconfig
tienen, y que ip
ciertamente no tiene). Entonces escribí uno. Como prueba de que uno podría escribir un ifconfig
que usa la API de netlink en Linux, lo hace.
Entonces, la sabiduría recibida sobre ifconfig
, como lo que usted cita, ya no es realmente cierta. Ahora no es cierto decir que " ifconfig
no usa netlink". La manta que cubría dos no cubre tres.
Es siempre ha sido falso decir que "netlink es más eficiente". Para las tareas que uno realiza ifconfig
, en realidad no hay mucho en cuanto a la eficiencia entre la API de netlink y la ioctl()
API. Uno realiza casi el mismo número de llamadas a la API para cualquier tarea dada.
De hecho, cada llamada a la API son dos llamadas al sistema en el caso de netlink, a diferencia de una en el ioctl()
sistema. Y podría decirse que la API de netlink tiene la desventaja de que en un sistema muy utilizado incorpora explícitamente la posibilidad de que la herramienta nunca reciba un mensaje de confirmación informándole del resultado de la llamada a la API.
Está, además, falso decir que ip
es "más versátil" que el GNU y NET-3 ifconfig
s , ya que utiliza enlace de red . Es más versátil porque realiza más tareas, haciendo cosas en un gran programa que se haría con otros programas distintosifconfig
. No es más versátil simplemente a fuerza de la API que utiliza internamente para realizar esas tareas adicionales. No hay nada inherente a la API sobre esto. Se podría escribir una herramienta todo-en-uno que utiliza el FreeBSD ioctl()
API, por ejemplo, e igualmente bien estado que es "más versátil" que las individuales ifconfig
, route
, arp
, y ndp
comandos.
Se podría escribir route
, arp
y ndp
los comandos de Linux que utilizan la API de enlace de red, también.
Otras lecturas
ip
más versátil, porque todo tipo de características interesantes son simplemente imposibles de hacer usando ioctls en Linux (porque los ioctls no están allí y probablemente nunca lo estarán).