ある時点で、私が(Linux Foundationで)見つけたいくつかのLinux教科書では、次のことが言及されました。
ip
ifconfig
コマンドは、コマンドを使用するよりも多様で効率的です。インターネット接続代わりにソケットI/W制御システムコール。
後ろで何が起こっているのか理解できないので、誰でもこれについて詳しく説明できますか?
PS私も知っていますこのトピックただし、動作方法の具体的な違いは扱いません。
答え1
FreeBSDやOpenBSDなどのオペレーティングシステムのコマンドは、ifconfig
残りのオペレーティングシステムと一致するように更新されました。現在、これらのオペレーティングシステムでさまざまなネットワークインターフェイス設定を構成し、さまざまなネットワークプロトコルを処理できます。 BSDはioctl()
これらのものをサポートしています。
Linuxの世界ではこれは起こりません。今日は3つのコマンドがありますifconfig
。
ifconfig
~からGNU inetutilsidebp%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ネットワークツールはifconfig
IPv6、複数のアドレスとのインターフェース、および-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
ifconfig
FreeBSDのコマンドライン構文と出力スタイルが必要なものがありますifconfig
(GNUやNET-3にもなく、ifconfig
確かにip
ありません)。だから1つ書きました。ifconfig
Linuxでnetlink APIを使用して書くことができるという証拠です。
したがって、ifconfig
あなたが引用したようなものについて受け入れられた知恵はもはや真実ではありません。これは今は本物ではありません。「ifconfig
netlinkを使用しないでください」と言います。二人を覆う毛布は三人を覆うことはできません。
それいつも「ネットリンクがより効率的だ」と言うのは事実ではありません。 netlinkを使用して実行される操作の場合、ifconfig
netlink APIとAPIの間の効率に大きな違いはありませんioctl()
。特定のタスクに対して、人々はほぼ同じ数のAPI呼び出しを実行します。
実際、すべてのAPI呼び出しは二つioctl()
システムのシステムコールではなく、netlink ケースのシステムコールです。もちろん、netlink APIの欠点は、多くのシステムでツールがAPI呼び出しの結果を知らせる確認メッセージを受け取らない可能性を明示的に含むことです。
また、ip
GNUやNET-3よりも「より一般的な」と言うのはifconfig
事実ではありません。ネットリンクを使うので。別のプログラムが必要な1つの大規模プログラムでより多くのタスクを実行できるため、より汎用性があります。外の ifconfig
。これらの追加操作を実行するために内部的にAPIを使用するだけでは、より多様にはなりません。これに対して、APIには一意のコンテンツはありません。ioctl()
たとえば、FreeBSD APIを使用する一体型ツールを作成し、それがコマンドだけを使用するよりも「より一般的な」と同じように主張することがifconfig
できます。route
arp
ndp
netlink APIを使用してLinux用route
、arp
およびコマンドを作成することもできます。ndp
追加読書
- ジョナサンデボインポラード(2019)。
ifconfig
。 スナックガイド。ソフトウェア。 - エドゥアルド・フェロー(2009-04-16)。ifconfig:無効なIPアドレス/初期パッチレポート。 Debian のバグ #359676.
答え2
ifconfig
多くのディストリビューションで使用されている標準は、さまざまな理由で使用されなくなりました。実際、古い、制限された方法でカーネルと会話することは、もはやすべてのネットワーク構成を理解していません。ifconfig
利用可能なものなど、特定のネットワーク構成は操作できません ip
。また、ifconfig
ネットワーク名前空間のサポートも制限されています。
エピソードで、インターフェイスのIPエイリアスはSuSEでしか見えず、ip
SuSEでは見られないことがわかりました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では利用できない高度な通信機能を提供します。