Answers:
ifconfig
FreeBSD和OpenBSD等操作系统上的命令已与其他操作系统一起更新。如今,它可以在那些操作系统上配置各种网络接口设置,并处理各种网络协议。BSD ioctl()
为这些事情提供支持。
这在Linux世界中没有发生。今天有三个ifconfig
命令:
ifconfig
来自GNU inetutilsjdebp%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%
ifconfig
从NET-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
不使用网络链路。” 覆盖两个的毯子不能覆盖三个。
它一直是不真实的说法是“网络链路更有效。” 对于ifconfig
netlink API和ioctl()
API 之间的效率而言,对于其中的任务而言,并没有太多内容。一个给定任务的API调用次数几乎相同。
实际上,在netlink情况下,每个API调用都是两个系统调用,而不是ioctl()
系统中的一个。可以说,netlink API的缺点在于,在一个频繁使用的系统上,它明确地包含了该工具永远不会收到向其通知API调用结果的确认消息的可能性。
据,此外,不真实地说,ip
是“更灵活”比GNU和NET-3 ifconfig
小号,因为它使用网络链路。它是更灵活,因为它更多的任务,做的事情在一个大的计划,一会用单独的程序做的比其他 ifconfig
。仅仅依靠内部使用的API来执行这些额外的任务,它就不会更加通用。API对此没有任何内在要求。人们可以写的所有功能于一身的工具,它使用的FreeBSD的ioctl()
API,例如,和同样出色的状态,这是“更灵活”不是个别ifconfig
,route
,arp
,和ndp
命令。
也可以为使用netlink API的Linux 编写route
,arp
和ndp
命令。
ifconfig
。 nosh指南。软件。由于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则没有。
ip
通用性更强的原因,因为在Linux上使用ioctl根本不可能实现各种炫酷功能(因为ioctl不存在,并且可能永远不会存在)。