ip vs ifconfig 命令的優缺點
在某些時候,在我遇到的一些關於 Linux 的教材(來自 Linux Foundation)中,提到了以下內容:
ip``ifconfig
command 比使用netlink套接字而不是ioctl系統呼叫更通用和更有效。誰能詳細說明一下,因為我無法理解引擎蓋下發生了什麼?
PS 我知道關於這些工具的這個主題,但它沒有解決它們如何操作的具體差異
FreeBSD 和 OpenBSD 等作業系統上的
ifconfig
命令已根據作業系統的其餘部分進行了更新。如今,它可以在這些作業系統上配置各種網路介面設置,並處理一系列網路協議。BSDioctl()
為這些事情提供了支持。這在 Linux 世界中沒有發生。今天有三個
ifconfig
命令:
ifconfig
來自GNU inetutilsjdebp%inetutils-ifconfig -l enp14s0 enp15s0 lo 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 RX 字節:51214341 TX 字節:51214341 jdebp%
ifconfig
來自NET-3 網路工具jdebp % ifconfig -l ifconfig: option --help' 提供使用資訊。-l' not recognised. ifconfig: jdebp % ifconfig 羅 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 網路遮罩 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<link> loop txqueuelen 1000(本地環回) RX 數據包 9087 字節 51214341 (48.8 MiB) RX 錯誤 0 丟棄 0 溢出 0 幀 0 TX 數據包 9087 字節 51214341 (48.8 MiB) TX 錯誤 0 丟棄 0 超限 0 載波 0 衝突 0 jdebp%
ifconfig
來自(版本 1.40)nosh 工具集jdebp % ifconfig -l enp14s0 enp15s0 lo jdebp % ifconfig 羅 它 連接環回執行 連結地址 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 prefixlen 128 inet6 地址 fe80:: 範圍 1 prefixlen 10 inet6 地址 ::1 範圍 0 prefixlen 128 jdebp % sudo ifconfig lo inet4 127.1.0.2 別名 jdebp % sudo ifconfig lo inet6 ::3/128 別名 jdebp % ifconfig 羅 它 連接環回執行 連結地址 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 prefixlen 32 bdaddr 127.1.0.2 inet4 地址 127.53.0.1 前綴 8 bdaddr 127.255.255.255 inet6 地址 ::3 範圍 0 prefixlen 128 inet6 地址 ::2 範圍 0 prefixlen 128 inet6 地址 fe80:: 範圍 1 prefixlen 10 inet6 地址 ::1 範圍 0 prefixlen 128 jdebp%
如您所見,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 網路工具添加一些 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
命令。進一步閱讀
- 喬納森·德博因·波拉德 (2019)。
ifconfig
. 小吃指南。軟體。- 愛德華多·費羅 (2009-04-16)。ifconfig:報告錯誤的 IP 地址/初始更新檔。Debian 錯誤 #359676。