追加読書

追加読書

ある時点で、私が(Linux Foundationで)見つけたいくつかのLinux教科書では、次のことが言及されました。

ipifconfigコマンドは、コマンドを使用するよりも多様で効率的です。インターネット接続代わりにソケットI/W制御システムコール。

後ろで何が起こっているのか理解できないので、誰でもこれについて詳しく説明できますか?

PS私も知っていますこのトピックただし、動作方法の具体的な違いは扱いません。

答え1

FreeBSDやOpenBSDなどのオペレーティングシステムのコマンドは、ifconfig残りのオペレーティングシステムと一致するように更新されました。現在、これらのオペレーティングシステムでさまざまなネットワークインターフェイス設定を構成し、さまざまなネットワークプロトコルを処理できます。 BSDはioctl()これらのものをサポートしています。

Linuxの世界ではこれは起こりません。今日は3つのコマンドがありますifconfig

  • ifconfig~からGNU inetutils
    idebp%inetutils-ifconfig -l
    enp14s0 enp15s0 ルオ
    idebp%inetutils-ifconfig lo
    lo link encap: ローカルループバック
          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
    ジェッドBP%
  • ifconfig~からNET-3ネットワークツール
    jdebp% ifconfig -l
    ifconfig: オプション --help' は使用法情報を提供します。-l' not recognised.
    ifconfig:
    idebp%ifconfig lo
    lo:flags=73<UP,LOOPBACK,RUNNING> mtu 65536
        inet 127.0.0.1 ネットマスク 255.0.0.0
        inet6::1 prefixlen 128scopeid 0x10<ホスト>
        inet6::2 prefixlen 128scopeid 0x80<互換可能、グローバル>
        inet6 fe80:: prefixlen 10scopeid 0x20<リンク>
        Loop txqueuelen 1000(ローカルループバック)
        RXパケット9087バイト51214341(48.8MiB)
        RXエラー0ドロップ0オーバーフロー0フレーム0
        TXパケット9087バイト51214341(48.8MiB)
        TXエラー0ドロップ0オーバーフロー0キャリア0クラッシュ0
    ジェッドBP%
  • ifconfig(バージョン1.40)からNoshツールセット
    jdebp% ifconfig -l
    enp14s0 enp15s0 ルオ
    idebp%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 エイリアス
    idebp%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
    ジェッドBP%

ご覧のとおり、GNU inetutilsとNET-3ネットワークツールはifconfigIPv6、複数のアドレスとのインターフェース、および-l

IPv6の問題の1つは、ツール自体にいくつかのコードがないことです。しかし、主な理由は、Linuxが他のオペレーティングシステムと同様にインターフェイスを介してioctl()IPv6機能を提供していないことです。プログラムはネットワーク経由でIPv4アドレスを表示および操作することができますioctl()

代わりに、Linuxは他のインターフェースsend()recv()特別でやや奇妙なソケットアドレスファミリを通してこの機能を提供しますAF_NETLINK

GNUとNET ifconfig-3できるこの新しいAPIを使用するために調整が行われました。これに反対する主張は、他のオペレーティングシステムに移植することはできませんが、これらのプログラムは実際には機能しているということです。すでにポータブルではありませんそれでもだから議論の余地はありません。

しかし、彼らは調整されておらず、今日まで上記のように維持されています。 (一部の人々は長年にわたってさまざまなポイントで作業してきましたが、残念ながら改善はプログラムに統合されていません。 Bernd Eckenfelsはパッチを受け取りませんでした。ifconfigパッチが作成されてから4年後、いくつかのnetlink API機能がNET-3 net-toolsに追加されました。 )

代わりに、いくつかのip新しいLinux APIを使用し、異なる構文を使用し、スタイリッシュなインターフェイスの背後にいくつかの異なる機能を組み合わせて、ツールセットをコマンドで完全に再作成します。command subcommand

ifconfigFreeBSDのコマンドライン構文と出力スタイルが必要なものがありますifconfig(GNUやNET-3にもなく、ifconfig確かにipありません)。だから1つ書きました。ifconfigLinuxでnetlink APIを使用して書くことができるという証拠です。

したがって、ifconfigあなたが引用したようなものについて受け入れられた知恵はもはや真実ではありません。これは今は本物ではありません。ifconfignetlinkを使用しないでください」と言います。二人を覆う毛布は三人を覆うことはできません。

それいつも「ネットリンクがより効率的だ」と言うのは事実ではありません。 netlinkを使用して実行される操作の場合、ifconfignetlink APIとAPIの間の効率に大きな違いはありませんioctl()。特定のタスクに対して、人々はほぼ同じ数のAPI呼び出しを実行します。

実際、すべてのAPI呼び出しは二つioctl()システムのシステムコールではなく、netlink ケースのシステムコールです。もちろん、netlink APIの欠点は、多くのシステムでツールがAPI呼び出しの結果を知らせる確認メッセージを受け取らない可能性を明示的に含むことです。

また、ipGNUやNET-3よりも「より一般的な」と言うのはifconfig事実ではありません。ネットリンクを使うので。別のプログラムが必要な1つの大規模プログラムでより多くのタスクを実行できるため、より汎用性があります。外の ifconfig。これらの追加操作を実行するために内部的にAPIを使用するだけでは、より多様にはなりません。これに対して、APIには一意のコンテンツはありません。ioctl()たとえば、FreeBSD APIを使用する一体型ツールを作成し、それがコマンドだけを使用するよりも「より一般的な」と同じように主張することがifconfigできます。routearpndp

netlink APIを使用してLinux用routearpおよびコマンドを作成することもできます。ndp

追加読書

答え2

ifconfig多くのディストリビューションで使用されている標準は、さまざまな理由で使用されなくなりました。実際、古い、制限された方法でカーネルと会話することは、もはやすべてのネットワーク構成を理解していません。ifconfig利用可能なものなど、特定のネットワーク構成は操作できません ip。また、ifconfigネットワーク名前空間のサポートも制限されています。

エピソードで、インターフェイスのIPエイリアスはSuSEでしか見えず、ipSuSEでは見られないことがわかりましたifconfig

裏面の違いは次のとおりです。ifconfigとip:違いは何であり、ネットワーク構成の比較

ip一見すると多少複雑に見えるかもしれませんが、機能はifconfigよりはるかに広範です。これは、ネットワークスタックの2つの層、つまり層2(リンク層)、層3(IP層)で機能的に構成され、net-toolsパッケージで上記のすべてのコマンド操作を実行します。

ifconfig主にシステムインターフェイスを表示または変更しますが、このコマンドは次の操作を実行できます。

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

  • ARPキャッシュエントリを追加および削除し、ホスト用の新しい静的ARPエントリを作成します。

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

  • カーネルルーティングテーブルを表示して変更します。

ifconfigと古代バージョンの主な違いの1つは、後者はネットワーク構成にioctlを使用することです。これはカーネルと対話するあまり一般的ではありませんが、前者はネットワーク構成にnetlinkソケットメカニズムを使用します。より柔軟な将来のバージョンでは、カーネルとユーザースペース間のioctl相互通信にrtnetlink(ネットワーク環境で機能する機能を追加)を使用します。

netlinkの使用/利点について:fromLJ - カーネルコーナー - Netlinkソケットを使用する理由と方法

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

上記の関数がユーザーとカーネル間の通信にシステムコール、ioctl、またはprocファイルシステムの代わりにnetlinkを使用するのはなぜですか?新機能のためにシステムコール、ioctl、またはprocファイルを追加するのは簡単ではありません。カーネルを汚染し、システムを不安定にする危険があります。しかし、Netlinkソケットは簡単です。 netlink.hに定数(つまりプロトコルタイプ)を追加するだけです。これにより、カーネルモジュールとアプリケーションはソケットスタイルのAPIを使用してすぐに通信できます。

....

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

関連情報