ip vs ifconfigコマンドの長所と短所


28

ある時点で、私が出会ったLinuxに関するいくつかの教材(Linux Foundationから)で、次のことが言及されています。

ipこのコマンドは、ioctlシステムコールではなくnetlinkソケットをifconfig使用するため、より汎用的で効率的です。

私はボンネットの下で何が起こっているのか理解できないので、誰もこれについて少し詳しく説明できますか?

PS私はそれらのツールに関するこのトピックを知っていますが、それらが動作する方法に関するこの特定の違いに対処していません

回答:


39

ifconfigFreeBSDやOpenBSDなどのオペレーティングシステムのコマンドは、オペレーティングシステムの他の部分に合わせて更新されました。最近では、これらのオペレーティングシステムであらゆる種類のネットワークインターフェイス設定を構成し、さまざまなネットワークプロトコルを処理できます。BSD ioctl()はこれらのサポートを提供します。

これはLinuxの世界では起こりませんでした。現在、3つのifconfigコマンドがあります。

  • ifconfigGNU inetutilsから
    jdebp%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
          UPLOOPBACK RUNNING MTU:65536メトリック:1
          RXパケット:9087エラー:0ドロップ:0オーバーラン:0フレーム:0
          TXパケット:9087エラー:0ドロップ:0オーバーラン:0キャリア:0
          collisions:0 txqueuelen:1000
          RXバイト:51214341 TXバイト:51214341
    jdebp%
  • ifconfigNET-3のnet-tools
    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 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 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 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 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 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 ifconfigsができ、この新しいAPIを使用するように調整されています。そうすることに対する議論は、他のオペレーティングシステムに移植可能ではなかったということでしたが、これらのプログラムは実際には既に移植可能でなかっため、あまり議論になりませんでした。

しかし、それらは調整されておらず、今日まで先に示したままです。(長年にわたってさまざまな点で作業を行っていた人もいましたが、残念ながらその改善はプログラムに反映されませんでした。たとえば: Bernd Eckenfelsは、NET-3ネットツールにネットリンクAPI機能を追加するパッチ受け入れませんでしたifconfig、パッチの作成から4年後)

代わりに、ip新しいLinux APIを使用し、異なる構文を持ち、ファッショナブルなスタイルのインターフェースの背後にある他のいくつかの機能を組み合わせたコマンドとしてツールセットを完全に再発明した人もいます。command subcommand

ifconfigは、FreeBSDのコマンドライン構文と出力スタイルifconfig(GNUもNET-3もifconfig持ってipおらず、ほとんど確実に持っていない)が必要でした。だから私はそれを書いた。ifconfigLinuxでnetlink APIを使用するを作成できることの証明として、それが行われます。

ですから、ifconfigあなたが引用したような、について受け取った知恵は、もはや本当ではありません。「ネットリンクを使用しない」と言うのは今では事実ではありifconfigません。2枚を覆っていた毛布は3枚を覆っていません。

常にされている「ネットリンクは、より効率的である」と言って虚偽。で行うタスクについてはifconfig、netlink APIとAPIの間の効率に関してはあまり意味がありませんioctl()。特定のタスクに対してほぼ同じ数のAPI呼び出しを行います。

実際、各API呼び出しは、システム内の1つではなく、netlinkの場合2つのシステム呼び出しioctl()です。また、おそらく、ネットリンクAPIには、頻繁に使用されるシステムでは、API呼び出しの結果を通知する確認メッセージをツールが受信しない可能性が明示的に組み込まれているという欠点があります。

つまり、さらに、虚偽であるip「より汎用性」GNU及びNET-3よりもifconfigS 、それはネットリンク使用しているため。それはより多くのタスクを実行するため、より汎用性があり ifconfigます。これらの追加タスクを実行するために内部的に使用するAPIのおかげで、単純に汎用性が増すわけではありません。これについてはAPIに固有のものはありません。一つは、FreeBSDの使用オールインワンツール書くことができioctl()、それは「より汎用性の高い」個人よりであること例えば、APIを、と同様に良好な状態ifconfigroutearp、およびndpコマンド。

一つは書くことができroutearpndpあまりにも、ネットリンクAPIを使用Linux用のコマンド。

参考文献


「より汎用性の高い」主張を読み過ぎていると思います。私見では、ipLinuxでioctlを使用してあらゆる種類のクールな機能を実行することは単に不可能であるため、netlinkがより汎用性が高いと述べています(ioctlは存在せず、おそらく存在しないため)。
TooTea

1
である、「それはネットリンク使用しているため、IPは、より汎用性があります」と同じである「ネットリンクは、より汎用性の高いIP作るものです」質問にすぐそこ
JdeBP

8

ifconfig多くのディストリビューションにある標準は、いくつかの理由で廃止されています。時代遅れで限定された方法でカーネルと対話し、実際、もはやすべてのネットワーク構成を理解していません。使用できるifconfigバージョンなど、一部のネットワーク構成を操作 することはできませんip。さらに、ifconfigネットワーク名前空間のサポートは制限されています。

逸話として、私ipはSuSEにのみ表示され、表示されないインターフェースIPエイリアスを見つけましたifconfig

内部の違いについて:ifconfig vs ipから:違いとネットワーク構成の比較

けれどもは、ip最初のサイトは少し複雑に見えるかもしれませんが、それはifconfigコマンドより機能的にはるかに広いです。ネットワークスタックの2つのレイヤー、つまりレイヤー2(リンクレイヤー)、レイヤー3(IPレイヤー)で機能的に編成され、上記のすべてのnet-toolsパッケージのコマンドを処理します。

一方、ifconfig大部分のディスプレイまたは修正システムのインターフェースは、このコマンドは、以下のタスクを実行することが可能です。

  • インターフェイスプロパティの表示または変更。

  • ホストの新しい静的ARPエントリの作成に沿ったARPキャッシュエントリの追加、削除。

  • すべてのインターフェイスに関連付けられたMACアドレスを表示します。

  • カーネルルーティングテーブルの表示と変更。

それを古代のifconfigと区別する主なハイライトの1つは、後者がネットワーク構成にioctlを使用していることです。 rtnetlink(ネットワーク環境操作機能を追加)を使用したカーネルとユーザー空間間の相互通信のためのioctlの。

netlinkの使用/利点について:LJから-Kernel Korner-Netlinkソケットを使用する理由と方法

Netlinkソケットは、カーネルプロセスとユーザー空間プロセスの間で情報を転送するために使用される特別なIPCです。ユーザー空間プロセス用の標準ソケットAPIとカーネルモジュール用の特別なカーネルAPIを介して、2つの間の全二重通信リンクを提供します。Netlinkソケットは、アドレスファミリAF_NETLINKを使用します。

.....

上記の機能がユーザーとカーネルの世界間の通信にシステムコール、ioctl、またはprocファイルシステムの代わりにnetlinkを使用するのはなぜですか?システムコール、ioctl、または新機能用のprocファイルを追加するのは簡単な作業ではありません。カーネルを汚染し、システムの安定性を損なう危険があります。ただし、Netlinkソケットは簡単です。プロトコルタイプである定数のみをnetlink.hに追加する必要があります。その後、カーネルモジュールとアプリケーションは、ソケットスタイルのAPIを使用してすぐに通信できます。

....

Netlinkソケットは、ユーザー空間アプリケーションとカーネルモジュール間の通信用の柔軟なインターフェイスです。アプリケーションとカーネルの両方に使いやすいソケットAPIを提供します。他のカーネル/ユーザー空間IPCにはない全二重、バッファーI / O、マルチキャスト、非同期通信などの高度な通信機能を提供します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.