ip vs ifconfig命令的优缺点


28

在某种程度上,在我遇到的有关Linux的一些教材(来自Linux Foundation)中,提到了以下内容:

ip该命令比ifconfig使用Netlink套接字而不是ioctl系统调用更为通用和高效。

任何人都可以详细说明一下,因为我不了解幕后情况。

PS我知道这些工具上的这个主题,但没有解决它们在操作方式上的特定差异

Answers:


39

ifconfigFreeBSD和OpenBSD等操作系统上的命令已与其他操作系统一起更新。如今,它可以在那些操作系统上配置各种网络接口设置,并处理各种网络协议。BSD ioctl()为这些事情提供支持。

这在Linux世界中没有发生。今天有三个ifconfig命令:

  • ifconfig来自GNU inetutils
    jdebp%inetutils-ifconfig -l
    enp14s0 enp15s0低
    jdebp%inetutils-ifconfig lo
    lo链接封套:本地环回
          inet地址:127.0.0.1广播: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
          接收字节:51214341接收字节:51214341
    jdebp%
  • ifconfigNET-3网络工具
    jdebp%ifconfig -l
    ifconfig:选项--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 prefixlen 128作用域ID 0x10 <主机>
        inet6 :: 2 prefixlen 128范围ID 0x80 <compat,global>
        inet6 fe80 :: prefixlen 10作用域ID 0x20 <link>
        循环txqueuelen 1000(本地环回)
        RX数据包9087字节51214341(48.8 MiB)
        接收错误0掉线0超限0帧0
        TX数据包9087字节51214341(48.8 MiB)
        TX错误0掉线0超限0载波0冲突0
    jdebp%
  • ifconfig来自(nosh工具集的 1.40版)
    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 prefixlen 8 bdaddr 127.0.0.1 
        inet4地址127.53.0.1 prefixlen 8 bdaddr 127.255.255.255 
        inet6地址:: 2范围0前缀len 128 
        inet6地址fe80 ::范围1前缀10 
        inet6地址:: 1范围0前缀len 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 prefixlen 8 bdaddr 127.0.0.1 
        inet4地址127.1.0.2 prefixlen 32 bdaddr 127.1.0.2 
        inet4地址127.53.0.1 prefixlen 8 bdaddr 127.255.255.255 
        inet6地址:: 3范围0前缀len 128 
        inet6地址:: 2范围0前缀len 128 
        inet6地址fe80 ::范围1前缀10 
        inet6地址:: 1范围0前缀len 128 
    jdebp% 

如您所见,ifconfig就IPv6,具有多个地址的接口以及诸如之类的功能而言,GNU inetutils和NET-3网络工具存在明显的缺陷-l

IPv6问题部分是工具本身缺少一些代码。但主要是由于Linux没有(如其他操作系统那样)通过ioctl()接口提供IPv6功能而造成的。它仅允许程序通过网络查看和操纵IPv4地址ioctl()

相反,Linux通过不同的接口send()以及recv()特殊的(有些奇怪的)套接字地址族提供了此功能AF_NETLINK

在GNU和NET-3 ifconfig小号可能已经调整到使用这个新的API。反对这样做的理由是它不能移植到其他操作系统上,但是实际上这些程序实际上已经不能移植了,因此这并不是什么争论。

但它们并未进行调整,并保持到今天为止。(有些人在各点的工作对他们这些年来,而是改进,伤心地说,从未进入的程序,例如: 贝恩德Eckenfels从来没有接受一个补丁是增加了一些网络链路API能力,NET-3网络工具ifconfig,在编写补丁后的4年。)

取而代之的是,有人完全将工具集重新定义为ip命令,该命令集使用新的Linux API,具有不同的语法,并在时尚的样式界面后面合并了其他几个功能。command subcommand

我需要一种ifconfig具有FreeBSD的命令行语法和输出样式ifconfig(GNU和NET-3 ifconfig都没有,并且ip肯定没有)的样式。所以我写了一个。为了证明可以编写ifconfig在Linux上使用netlink API的程序,事实确实如此。

因此,关于ifconfig您所引用的知识(例如您引用的内容)不再是真的。这是现在不真实的说法是“ ifconfig不使用网络链路。” 覆盖两个的毯子不能覆盖三个。

一直是不真实的说法是“网络链路更有效。” 对于ifconfignetlink API和ioctl()API 之间的效率而言,对于其中的任务而言,并没有太多内容。一个给定任务的API调用次数几乎相同。

实际上,在netlink情况下,每个API调用都是两个系统调用,而不是ioctl()系统中的一个。可以说,netlink API的缺点在于,在一个频繁使用的系统上,它明确地包含了该工具永远不会收到向其通知API调用结果的确认消息的可能性。

据,此外,不真实地说,ip是“更灵活”比GNU和NET-3 ifconfig小号,因为它使用网络链路。它是更灵活,因为它更多的任务,做的事情在一个大的计划,一会用单独的程序做的比其他 ifconfig。仅仅依靠内部使用的API来执行这些额外的任务,它就不会更加通用。API对此没有任何内在要求。人们可以写的所有功能于一身的工具,它使用的FreeBSD的ioctl()API,例如,和同样出色的状态,这是“更灵活”不是个别ifconfigroutearp,和ndp命令。

也可以为使用netlink API的Linux 编写routearpndp命令。

进一步阅读


我认为您对“更多用途”的主张读得太多了。恕我直言,它只是说netlink是使ip通用性更强的原因,因为在Linux上使用ioctl根本不可能实现各种炫酷功能(因为ioctl不存在,并且可能永远不会存在)。
TooTea

1
“ netlink是使ip更加通用的原因”与“ ip更加通用,因为它使用了netlink”相同,这就是问题所在
JdeBP

8

由于ifconfig许多原因,我们不赞成使用许多发行版中的标准。与内核进行过时且有限的对话,实际上,它不再了解所有网络配置。您将无法操纵某些网络配置,例如可以使用的 ifconfig版本ip。此外,ifconfig对网络名称空间的支持是有限的。

作为一个轶事,我发现接口IP别名仅ip在SuSE中可见,而在SuSE 中不可见ifconfig

至于内在的区别:从ifconfig与ip:有什么区别和比较网络配置

尽管ip乍看之下似乎有些复杂,但是它的功能比ifconfig宽得多。它在功能上组织在两层网络堆栈中,即第2层(链路层),第3层(IP层),并执行来自net-tools软件包的所有上述命令。

尽管ifconfig主要显示或修改系统的接口,但此命令能够执行以下任务:

  • 显示或修改接口属性。

  • 添加,删除ARP缓存条目以及为主机创建新的静态ARP条目。

  • 显示与所有接口关联的MAC地址。

  • 显示和修改内核路由表。

它与古老的ifconfig区别的主要亮点之一是后者使用ioctl进行网络配置,这是与内核交互的一种不太受人欢迎的方式,而前者则利用netlink套接字机制来实现相同的功能,后者是一个灵活得多的继承者irtl用于使用rtnetlink(增加了网络环境操作能力)在内核和用户空间之间进行相互通信。

关于netlink的使用/优点:从LJ-内核Korner-为什么和如何使用Netlink套接字

Netlink套接字是一种特殊的IPC,用于在内核进程和用户空间进程之间传输信息。它通过用于用户空间进程的标准套接字API和用于内核模块的特殊内核API,在两者之间提供了全双工通信链接。Netlink套接字使用地址族AF_NETLINK。

.....

为什么上述功能为什么使用netlink而不是系统调用,ioctl或proc文件系统在用户和内核世界之间进行通信?为新功能添加系统调用,ioctl或proc文件是一项艰巨的任务。我们冒着污染内核并损害系统稳定性的风险。但是,Netlink套接字很简单:只需将一个常量(协议类型)添加到netlink.h中。然后,内核模块和应用程序可以立即使用套接字样式的API进行通信。

....

Netlink套接字是用于用户空间应用程序和内核模块之间通信的灵活接口。它为应用程序和内核提供了易于使用的套接字API。它提供了高级通信功能,例如全双工,缓冲的I / O,多播和异步通信,而其他内核/用户空间IPC则没有。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.