ある時点で、私が出会ったLinuxに関する(Linux Foundationからの)教材では、次のことが言及されています。
ip
コマンドはioctlシステムコールではなくnetlinkソケットを使用するため、ifconfig
よりも用途が広く効率的です。
フードの下で何が起こっているのか理解できないので、誰かがこれについて少し詳しく説明できますか?
追伸私はそれらのツールで このトピック を認識していますが、それらがどのように動作するかについてのこの特定の違いには対処していません
FreeBSDやOpenBSDなどのオペレーティングシステムのifconfig
コマンドは、他のオペレーティングシステムに合わせて更新されました。今日では、これらのオペレーティングシステムであらゆる種類のネットワークインターフェイス設定を構成し、さまざまなネットワークプロトコルを処理できます。 BSDは、これらのioctl()
サポートを提供します。
これはLinuxの世界では起こりませんでした。今日、3つのifconfig
コマンドがあります。
ifconfig
from GNU inetutilsjdebp%inetutils-ifconfig -l enp14s0 enp15s0 lo jdebp%inetutils-ifconfig lo lo Link encap:Local Loopback inet addr:127.0.0.1 Bcast: 0.0.0.0 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RXパケット:9087エラー:0ドロップ:0オーバーラン:0フレーム:0 TXパケット:9087エラー:0ドロップ済み:0オーバーラン:0キャリア:0 コリジョン:0 txqueuelen:1000 RXバイト:51214341 TXバイト:51214341 jdebp%
ifconfig
from NET-3 net-toolsjdebp%ifconfig -l
ifconfig:オプション_-l' not recognised.
ifconfig:
_-- help 'は、使用方法の情報を提供します。
jdebp%ifconfig lo
lo:flags = 73 <UP、LOOPBACK、 RUNNING> mtu 65536
inet 127.0.0.1 netmask 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(Local Loopback)
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
from(バージョン1.40 of) noshツールセットjdebp%ifconfig -l enp14s0 enp15s0 lo jdebp%ifconfig lo lo link up loopback running link address 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 address :: 2 scope 0 prefixlen 128 inet6 address fe80 :: scope 1 prefixlen 10 inet6 address :: 1 scope 0 prefixlen 128 jdebp%Sudo ifconfig lo inet4 127.1.0.2 alias jdebp%Sudo ifconfig lo inet6 :: 3/128 alias jdebp%ifconfig lo lo link up loopback running リンクアドレス00:00:00:00:00:00 bdaddr 00:00:00:00:00:00 inet4 address 127.0.0.1 prefixlen 8 bdaddr 127.0.0.1 inet4 address 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 scope 0 prefixlen 128 inet6 address :: 2 scope 0 prefixlen 128 inet6 address fe80 :: scope 1 prefixlen 10 inet6 address :: 1 scope 0 prefixlen 128 jdebp%
ご覧のとおり、GNU inetutilsおよびNET-3 net-tools ifconfig
sには、IPv6に関して、複数のアドレスを持つインターフェースに関して、および以下のような機能に関して、いくつかのマークされた欠陥があります。 _-l
_。
IPv6の問題の一部は、ツール自体に欠けているコードです。しかし、それは主に、Linuxが(他のオペレーティングシステムが提供するように)ioctl()
インターフェースを介してIPv6機能を提供しないという事実が原因です。プログラムは、ネットワーキングioctl()
sを介してIPv4アドレスを表示および操作するだけです。
Linuxは代わりに、ソケットの特殊な、やや奇妙なアドレスファミリ_AF_NETLINK
_の異なるインターフェイスsend()
およびrecv()
を介してこの機能を提供します。
GNUおよびNET-3 ifconfig
s couldは、この新しいAPIを使用するように調整されました。これを行うことに対する反対論は、他のオペレーティングシステムに移植できないことでしたが、これらのプログラムは実際にはalready移植性がありませんanywayだったため、あまり議論の余地はありませんでした。
しかし、それらは調整されておらず、今日まで予測されたままです。 (何人かの人々は何年にもわたってさまざまな時点でそれらに取り組みましたが、悲しいことに、改善はプログラムに取り入れられませんでした。例: Bernd Eckenfelsはパッチを受け入れませんでした いくつかのnetlink API機能を追加しましたNET-3 net-tools ifconfig
へ、パッチが作成されてから4年後。)
代わりに、新しいLinux APIを使用するip
コマンドが異なる構文を持ち、ファッショナブルな_commandsubcommand
_スタイルのインターフェイスの背後にいくつかの他の関数を組み合わせたため、一部の人々はツールセットを完全に再発明しました。
FreeBSDのifconfig
(GNUもNET-3 ifconfig
も、ifconfig
にもないこと)のコマンドライン構文と出力スタイルを持つip
が必要でした。 Linuxでnetlink APIを使用するifconfig
を作成できることの証明として、それを作成しました。
したがって、引用したようなifconfig
について受け取られた知恵は、もはや真実ではありません。 「ifconfig
はnetlinkを使用しない」と言うのはnow untrueです。 2つをカバーした毛布は3つをカバーしません。
これまでずっと「netlinkの方が効率的」と言うのは誤りです。 ifconfig
を使用して行うタスクの場合、netlink APIとioctl()
APIの間の効率に関しては、それほど多くはありません。特定のタスクに対してほぼ同じ数のAPI呼び出しを行います。
実際、各API呼び出しは、ioctl()
システムの場合とは異なり、netlinkの場合はtwoシステムコールです。また、netlink APIには、使用頻度の高いシステムでは、ツールがAPI呼び出しの結果を通知する確認メッセージを受信しない可能性があることを明示的に組み込んでいるという欠点があることは間違いありません。
さらに、ip
がGNUおよびNET-3 ifconfig
s netlinkを使用しているためよりも「より用途が広い」と言っているのは事実ではありません。より多くのタスクを実行し、1つの大きなプログラムで別のプログラムで行うようなことを行います以外ifconfig
。これらの追加のタスクを実行するために内部で使用するAPIの機能だけでは、より汎用性が高くありません。これについては、APIに固有のことは何もありません。たとえば、FreeBSD ioctl()
APIを使用するオールインワンツールを記述して、個々のifconfig
よりも「用途が広い」と同様に述べることができます。 route
、arp
、およびndp
コマンド。
Netlink APIを使用するLinux用のroute
、arp
、およびndp
コマンドも記述できます。
ifconfig
。 noshガイド。ソフトウェア。多くのディストリビューションにある標準のifconfig
は、いくつかの理由で廃止されています。カーネルとの古くて限られた方法での対話、そして実際には、もはやすべてのネットワーク構成を理解していません。 ifconfig
を使用して実行できるip
バージョンなどの一部のネットワーク構成を操作することはできません。さらに、ネットワーク名前空間のifconfig
サポートは制限されています。
逸話として、ip
でのみ表示され、SuSE ifconfig
では表示されないインターフェイスIPエイリアスを見つけました。
内部の違いについて:From ifconfig vs ip:What’s Difference and Comparing Network Configuration
ip
は最初のサイトでは少し複雑に見えるかもしれませんが、ifconfigよりも機能がはるかに広いです。これは、ネットワークスタックの2つのレイヤー、つまりレイヤー2(リンクレイヤー)、レイヤー3(IPレイヤー)で機能的に編成され、net-toolsパッケージからの上記のすべてのコマンドの機能を実行します。
ifconfig
は主にシステムのインターフェースを表示または変更しますが、このコマンドは次のタスクを実行できます。
インターフェイスプロパティの表示または変更。
ホストの新しい静的ARPエントリの作成に沿ったARPキャッシュエントリの追加、削除。
すべてのインターフェースに関連付けられたMACアドレスの表示。
カーネルルーティングテーブルの表示と変更。
それを古代の対応するifconfigと区別する主なハイライトの1つは、後者がネットワーク構成にioctlを使用することです。これはカーネルとの相互作用のあまり評価されない方法ですが、前者ははるかに柔軟な後継である同じためにnetlinkソケットメカニズムを利用します。 rtnetlink(ネットワーク環境操作機能を追加)を使用してカーネルとユーザー空間間の相互通信のためのioctlの使用。
Netlinkの使用/利点について:From LJ-Kernel Korner-Why and How to Use Netlink Socket
Netlinkソケットは、特別なIPCカーネルとユーザースペースプロセス間で情報を転送するために使用されます。ユーザースペースプロセス用の標準ソケットAPIを介して2つの間に全二重通信リンクを提供します。カーネルモジュール用の特別なカーネルAPI Netlinkソケットは、アドレスファミリーAF_NETLINKを使用します。
.....
上記の機能が、ユーザーワールドとカーネルワールド間の通信に、システムコール、ioctl、またはprocファイルシステムの代わりにnetlinkを使用する理由システムコール、ioctl、またはprocファイルを追加して新しい機能を追加するのは簡単なことではありません。カーネルを汚染し、システムの安定性を損なう恐れがあります。ただし、netlinkソケットは単純です。netlink.hに追加する必要があるのは、プロトコルタイプである定数だけです。その後、カーネルモジュールとアプリケーションは、ソケットスタイルのAPIを使用してすぐに通信できます。
....
Netlinkソケットは、ユーザー空間アプリケーションとカーネルモジュール間の通信のための柔軟なインターフェイスです。アプリケーションとカーネルの両方に使いやすいソケットAPIを提供します。全二重、バッファI/O、マルチキャスト、非同期通信など、他のカーネル/ユーザー空間IPCにはない高度な通信機能を提供します。