在某些时候,在我遇到的一些关于 Linux 的教材(来自 Linux Foundation)中,提到了以下内容:
ip
ifconfig
command 比使用netlink套接字而不是ioctl系统调用更通用和更有效。
谁能详细说明一下,因为我无法理解引擎盖下发生了什么?
PS 我知道关于这些工具的这个主题,但它没有解决它们如何操作的具体差异
在某些时候,在我遇到的一些关于 Linux 的教材(来自 Linux Foundation)中,提到了以下内容:
ip
ifconfig
command 比使用netlink套接字而不是ioctl系统调用更通用和更有效。
谁能详细说明一下,因为我无法理解引擎盖下发生了什么?
PS 我知道关于这些工具的这个主题,但它没有解决它们如何操作的具体差异
FreeBSD 和 OpenBSD 等操作系统上的
ifconfig
命令已根据操作系统的其余部分进行了更新。如今,它可以在这些操作系统上配置各种网络接口设置,并处理一系列网络协议。BSDioctl()
为这些事情提供了支持。这在 Linux 世界中没有发生。今天有三个
ifconfig
命令:ifconfig
来自GNU inetutilsifconfig
来自NET-3 网络工具ifconfig
来自(版本 1.40)nosh 工具集如您所见,GNU inetutils 和 NET-3 net-tools
ifconfig
在 IPv6、具有多个地址的接口以及诸如-l
.IPv6 问题的部分原因是工具本身缺少一些代码。但主要是因为 Linux 没有(像其他操作系统那样)通过
ioctl()
接口提供 IPv6 功能。它只允许程序通过网络查看和操作 IPv4 地址ioctl()
。相反,Linux 通过不同的接口提供此功能,
send()
并recv()
在一个特殊的、有点奇怪的套接字地址系列上,AF_NETLINK
.GNU 和 NET-3可以调整为使用这个新的 API
ifconfig
。反对这样做的理由是它不能移植到其他操作系统,但实际上这些程序无论如何都已经不能移植,所以这没什么大不了的。但它们并没有被调整,一直保持到今天。(多年来,有些人在各个方面都在研究它们,但遗憾的是,这些改进从未进入程序。例如: Bernd Eckenfels 从未接受向 NET-3 net-tools 添加一些 netlink API 功能的补丁
ifconfig
,在编写补丁 4 年后。)取而代之的是,有些人将工具集彻底改造为
ip
命令,它使用新的 Linux API,具有不同的语法,并在时尚风格的界面后面结合了其他几个功能。command subcommand
我需要一个
ifconfig
具有 FreeBSD 的命令行语法和输出风格的工具ifconfig
(GNU 和 NET-3ifconfig
都没有,而且ip
肯定没有)。所以我写了一个。作为可以ifconfig
在 Linux 上编写使用 netlink API 的证明,它确实如此。因此,关于 的公认智慧
ifconfig
,例如您引用的内容,不再是真的。现在说“不使用netlink”是不真实的。ifconfig
盖两个的毯子不盖三个。“netlink更高效”的说法向来是不真实的。对于使用 .netlink API 执行的任务,
ifconfig
在涉及到 netlink API 和 API 之间的效率时,它并没有太多的好处ioctl()
。一个人对任何给定任务进行几乎相同数量的 API 调用。实际上,每个 API 调用在 netlink 案例中是两个系统调用,而在
ioctl()
系统中是一个。并且可以说,netlink API 的缺点是在一个频繁使用的系统上,它明确地包含了该工具永远不会收到通知它 API 调用结果的确认消息的可能性。此外,说它
ip
比 GNU 和 NET-3 更“通用”是不真实ifconfig
的,因为它使用 netlink。它更通用,因为它可以完成更多任务,在一个大程序中做事,而不是ifconfig
. 仅仅依靠它在内部用于执行这些额外任务的 API 并没有变得更加通用。API 没有任何内在的东西。例如,可以编写一个使用 FreeBSDioctl()
API 的一体化工具,并且同样可以说它比单独ifconfig
的 、route
、arp
和ndp
命令“更通用”。也可以为使用 netlink API 的 Linux 编写
route
、arp
和ndp
命令。进一步阅读
ifconfig
. 小吃指南。软件。ifconfig
由于几个原因,我们在许多发行版中使用的标准已被弃用。以过时且有限的方式与内核交谈,事实上,不再了解所有网络配置。您将无法操作某些网络配置,例如ifconfig
您可以使用的版本ip
。此外,ifconfig
对网络命名空间的支持是有限的。作为一个轶事,我发现接口 IP 别名仅在 SuSE 中可见
ip
而不在 SuSE中可见ifconfig
。至于引擎盖下的差异:来自ifconfig vs ip: What's Difference and Comparing Network Configuration
关于netlink的使用/优点:来自LJ - Kernel Korner - 为什么以及如何使用Netlink Socket