汎用ソケットとは何ですか?それはネットワークデバイスとどのように関係しますか?


9

Linuxでネットワークドライバーがどのように機能するかを理解しようとしています。このQ&Aは、Linuxのネットワークデバイスがデバイスファイルで表されていないことを示しました。これは、ネットワークドライバーがで動作することを示していますsockets

たとえば、これioctlは通話を通じてネットワークデバイスをセットアップする方法を参照します。ioctlただし、ネットワークドライバー用のデバイスファイルがない場合、ファイル記述子必要です。渡すことができるファイル記述子は、ソケットからのものだけです。

これは私に質問のポイントをもたらします。これまでのところ、物理ネットワークカードのソフトウェア表現であるネットワークインターフェイスは、実際にはソケットよりも劣っているオブジェクトのようです。

  • しかし、この抽象的な意味でのソケットとは何ですか、それはプッシュ通知をサポートするデバイスファイルの別の名前ですか?ユーザースペースアプリによってネットワークインターフェースのアドレス:ポートのペアにバインドされた接続ポイントに関して、TCPソケットについて理解しています。ソケットをネットワークインターフェイスをセットアップするための前提条件として理解していません。

  • (のようなLinuxのネットワークインタフェースすることができますeth0によって記載されているがifconfig)ソケットなしでは存在しますか?

  • DOES ifconfigまたはいくつかのネットワーク・マネージャ・デーモンは、私たちはネットワーク・インタフェース・オプションを設定できるように開いたソケットを保ちますか?


回答:


5

デバイスファイルを簡単に確認してみましょう。Linuxでは、アプリケーションプログラムがradと書き込み操作をファイル記述子を通じてカーネルに伝達します。これはファイルに最適であり、文字のストリームを生成および消費するキャラクターデバイス、およびランダムアクセスアドレスで固定サイズのブロックを読み書きするデバイスブロックすることにより、同じAPIを使用できることがわかりましたファイルでもあります。

しかし、これらのデバイスを構成する方法(ボーレートの設定など)が必要であり、そのためにioctl呼び出しが発明されました。これは、デバイスに固有のデータ構造とカーネルに使用されるI / Oコントロールの種類を渡し、同じデータ構造で結果を返すだけなので、非常に汎用的な拡張可能なAPIであり、多くのことに使用できます。 。

では、ネットワーク運用はどのように適合するのでしょうか。典型的なネットワーク・サーバ・アプリケーションがしたい結合し、いくつかのネットワーク・アドレスに、聞く(例えばHTTPのための80、またはSSH用22)特定のポート上で、クライアントの場合コネクト、それがしたいの送信にデータをし、受け取るこのクライアントからのデータを。そして、クライアントのための二重の操作。

これをファイル操作に適合させる方法は明らかではありません(それは可能ですが、プラン9を参照してください)。これが、UNIXデザイナーが新しいAPIであるソケットを発明した理由です。あなたはのためのセクション2のmanページで詳細を見つけることができますsocketbindlistenconnectsendrecv。ファイルI / O APIとは異なりますが、socket呼び出しはファイル記述子も返します。Webでソケットを使用する方法に関するチュートリアルは多数あります。

これまでのところ、これはすべて純粋なUNIXであり、ソケットが発明された当時、誰もネットワークインターフェイスについて話していませんでした。また、このAPIは非常に古いため、インターネットプロトコル(AF_*定数を参照)以外のさまざまなネットワークプロトコル用に定義されていますが、Linuxでサポートされているのはごく一部です。

しかし、コンピューターが複数のネットワークカードを取得し始めたので、これに対するいくつかの抽象化が必要でした。Linuxでは、それがネットワークインターフェイス(NI)です。これは、ハードウェアの一部に使用されるだけでなく、さまざまなトンネル、OpenVPNなどのトンネルとして機能するユーザーアプリケーションエンドポイントにも使用されます。同様に、ネットワークインターフェースもファイルシステムに表示されません。ただし、NIは/proc/sysファイルシステム(およびその他のネットワーク調整パラメータ)で利用できます。

NIは、ネットワークパケットがカーネルに出入りするエンドポイントの単純なカーネル抽象化です。一方、ソケットは、アプリケーションとパケットを通信するために使用されます。パケットの処理にソケットを含める必要はありません。たとえば、転送が有効になっている場合、パケットはあるNIに入り、別のNIから出ることがあります。その意味で、ソケットとネットワークインターフェイスは完全に独立しています。

しかし、ブロックデバイスとキャラクターデバイスを構成する方法が必要だったのと同じように、NIを構成する方法が必要でした。そして、ソケットはすでにファイル記述子を返していたので、ioctlそのファイル記述子でonを許可することはいくぶん論理的でした。これが、リンクしたnetdeviceインターフェイスです。

パケットフィルタリング、パケットキャプチャなど、同様の方法でシステムコールが悪用されることは他にも多数あります。

これらすべてが次々に成長しており、多くの場所で特に論理的ではありません。それが一度にすべて設計されていれば、おそらくより直交するAPIを作成できたはずです。


Sockets as the network communications API were already not represented in the filesystem, so the NI didn't get one, either.これはタイプミスですか?
TheMeaningfulEngineer 2017年

あなたはどの部分がタイプミスだと思いますか?プレーンソケットには、ファイル名やiノードが関連付けられていません(Unixドメインソケットにはあります)。
dirkt

文章が意味的に理解できなかったので、ごめんなさい。
TheMeaningfulEngineer 2017年

申し訳ありませんが、私は英語を母国語としない人です。言い換えてみましたが、わかりやすくなりましたか?
dirkt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.