汎用ソケットとは何ですか? ネットワークデバイスとはどのような関係がありますか?

汎用ソケットとは何ですか? ネットワークデバイスとはどのような関係がありますか?

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

例えば、これioctl電話でネットワークデバイスを設定する方法を参照してください。ioctlしかし、ファイル記述子が必要です、ネットワークドライバのデバイスファイルがない場合に渡すことができる唯一のファイル記述子は、ソケットのファイル記述子です。

これが問題の核心に近づきます。現時点では、ネットワークインタフェース(物理ネットワークカードのソフトウェア表現)は実際にはソケットよりも下位のオブジェクトです。

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

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

  • 一部のネットワーク管理者デーモンは、ifconfigネットワークインタフェースオプションを設定できるようにソケットを開いたままにしますか?

答え1

デバイスファイルをすばやく確認しましょう。 Linux では、アプリケーションは次の方法で読み書き操作をカーネルに渡します。ファイル記述子。これはファイルに効果的であり、同じAPIがファイルでも機能することがわかりました。キャラクターデバイス文字ストリームを生成して消費します。ブロックデバイスランダムアクセスアドレスから固定サイズのブロックを読み書きします。ファイルのように偽装してください。

ただし、これらのデバイスを構成する方法(転送速度の設定など)が必要です。I/W制御電話が発明されました。カーネルのデバイス固有のデータ構造と入出力制御タイプを渡し、同じデータ構造で結果を返すため、多くの用途に使用できる非常に一般的でスケーラブルなAPIです。

今、ネットワーク運用はどのように適応しますか?一般的なWebサーバーアプリケーションは次のとおりです。製本特定のネットワークアドレスで、聞く特定のポート(HTTPの場合は80、SSHの場合は22)でクライアントつながる、それがほしい送る平和のためのデータ受け取るこのクライアントのデータです。そして顧客のために二重義務を遂行しなさい。

これをファイル操作に適用する方法は明確ではありません。 (できますが、計画9)これがUNIXデザイナーが新しいAPIを発明した理由です。ソケットsocket、、、bindおよびlistenのパート2のマニュアルページで詳細を確認できます。ファイルI / O APIとは異なりますが、この呼び出しはまだファイル記述子を返します。オンラインでソケットを使用する方法に関する多くのチュートリアルがあります。 Googleで見つけてください。connectsendrecvsocket

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

しかし、コンピュータに複数のネットワークカードが提供され始めると、いくつかの抽象化が必要でした。 Linuxではそうです。ネットワークインターフェース(あなた)。ハードウェアだけでなくさまざまなトンネルでも使用され、OpenVPNなどのトンネルのユーザーアプリケーションエンドポイントとしても機能します。説明したように、ソケットAPIは(特殊)ファイルベースではなく、ファイルシステムに依存しません。同様に、ネットワークインタフェースはファイルシステムには表示されません。ただし、NIはファイル/procシステム/sys(およびその他のネットワーク調整可能)で使用できます。

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

ただし、ブロックデバイスとキャラクタデバイスの設定方法が必要な場合と同様に、NIを設定する方法も必要です。ソケットはすでにファイルディスクリプタを返すので、ioctlそのファイルディスクリプタに1つだけを許可するのはかなり論理的です。これはインターネット機器接続したインターフェースです。

パケットフィルタリング、パケットキャプチャなど、同様の方法でシステムコールを乱用することがよくあります。

これらすべては少しずつ進化し、多くの場所では特に論理的ではありません。一度設計すると、より直交的なAPIを作成できます。

関連情報