デバイスファイルを簡単に確認してみましょう。Linuxでは、アプリケーションプログラムがradと書き込み操作をファイル記述子を通じてカーネルに伝達します。これはファイルに最適であり、文字のストリームを生成および消費するキャラクターデバイス、およびランダムアクセスアドレスで固定サイズのブロックを読み書きするデバイスをブロックすることにより、同じAPIを使用できることがわかりましたファイルでもあります。
しかし、これらのデバイスを構成する方法(ボーレートの設定など)が必要であり、そのためにioctl呼び出しが発明されました。これは、デバイスに固有のデータ構造とカーネルに使用されるI / Oコントロールの種類を渡し、同じデータ構造で結果を返すだけなので、非常に汎用的な拡張可能なAPIであり、多くのことに使用できます。 。
では、ネットワーク運用はどのように適合するのでしょうか。典型的なネットワーク・サーバ・アプリケーションがしたい結合し、いくつかのネットワーク・アドレスに、聞く(例えばHTTPのための80、またはSSH用22)特定のポート上で、クライアントの場合コネクト、それがしたいの送信にデータをし、受け取るこのクライアントからのデータを。そして、クライアントのための二重の操作。
これをファイル操作に適合させる方法は明らかではありません(それは可能ですが、プラン9を参照してください)。これが、UNIXデザイナーが新しいAPIであるソケットを発明した理由です。あなたはのためのセクション2のmanページで詳細を見つけることができますsocket
、bind
、listen
、connect
、send
とrecv
。ファイルI / O APIとは異なりますが、socket
呼び出しはファイル記述子も返します。Webでソケットを使用する方法に関するチュートリアルは多数あります。
これまでのところ、これはすべて純粋なUNIXであり、ソケットが発明された当時、誰もネットワークインターフェイスについて話していませんでした。また、このAPIは非常に古いため、インターネットプロトコル(AF_*
定数を参照)以外のさまざまなネットワークプロトコル用に定義されていますが、Linuxでサポートされているのはごく一部です。
しかし、コンピューターが複数のネットワークカードを取得し始めたので、これに対するいくつかの抽象化が必要でした。Linuxでは、それがネットワークインターフェイス(NI)です。これは、ハードウェアの一部に使用されるだけでなく、さまざまなトンネル、OpenVPNなどのトンネルとして機能するユーザーアプリケーションエンドポイントにも使用されます。同様に、ネットワークインターフェースもファイルシステムに表示されません。ただし、NIは/proc
、/sys
ファイルシステム(およびその他のネットワーク調整パラメータ)で利用できます。
NIは、ネットワークパケットがカーネルに出入りするエンドポイントの単純なカーネル抽象化です。一方、ソケットは、アプリケーションとパケットを通信するために使用されます。パケットの処理にソケットを含める必要はありません。たとえば、転送が有効になっている場合、パケットはあるNIに入り、別のNIから出ることがあります。その意味で、ソケットとネットワークインターフェイスは完全に独立しています。
しかし、ブロックデバイスとキャラクターデバイスを構成する方法が必要だったのと同じように、NIを構成する方法が必要でした。そして、ソケットはすでにファイル記述子を返していたので、ioctl
そのファイル記述子でonを許可することはいくぶん論理的でした。これが、リンクしたnetdeviceインターフェイスです。
パケットフィルタリング、パケットキャプチャなど、同様の方法でシステムコールが悪用されることは他にも多数あります。
これらすべてが次々に成長しており、多くの場所で特に論理的ではありません。それが一度にすべて設計されていれば、おそらくより直交するAPIを作成できたはずです。