Linux

ip vs ifconfig 命令的優缺點

  • January 8, 2020

在某些時候,在我遇到的一些關於 Linux 的教材(來自 Linux Foundation)中,提到了以下內容:

ip``ifconfigcommand 比使用netlink套接字而不是ioctl系統呼叫更通用和更有效。

誰能詳細說明一下,因為我無法理解引擎蓋下發生了什麼?

PS 我知道關於這些工具的這個主題,但它沒有解決它們如何操作的具體差異

FreeBSD 和 OpenBSD 等作業系統上的ifconfig命令已根據作業系統的其餘部分進行了更新。如今,它可以在這些作業系統上配置各種網路介面設置,並處理一系列網路協議。BSDioctl()為這些事情提供了支持。

這在 Linux 世界中沒有發生。今天有三個ifconfig命令:

jdebp%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%
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%
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-toolsifconfig在 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 沒有任何內在的東西。例如,可以編寫一個使用 FreeBSD ioctl()API 的一體化工具,並且同樣可以說它比單獨ifconfig的 、routearpndp命令“更通用”。

也可以為使用 netlink API 的 Linux 編寫routearpndp命令。

進一步閱讀

引用自:https://unix.stackexchange.com/questions/504063