1. ホーム
  2. linux

[解決済み] Unixドメインソケットは複数のクライアントをどのように区別するのですか?

2023-06-17 10:09:35

質問

TCPはタプルペア(IPアドレス/ポート/タイプ)で、あるクライアントと別のクライアントを区別しています。 UDPはクライアントのIPとポートを渡します。 Unix ドメインはどのように異なるクライアントを追跡するのでしょうか。

言い換えれば、サーバーは、/tmp/socketのようなパスにバインドされたソケットを作成します。 2 つ以上のクライアントが /tmp/socket に接続します。 クライアント 1 とクライアント 2 からのデータを追跡するために、その下で何が起こっているのでしょうか? 私は、ネットワーク スタックがドメイン ソケットで何の役割も果たさず、カーネルがここですべての作業を行っていると想像しています。

IPプロトコル形式とTCP/UDP形式があるように、unixドメインプロトコルフォーマットがありますか? ドメインソケットデータグラムプロトコルのフォーマットは、どこかで公開されていますか? すべての unix は異なっていますか、それとも POSIX のようなものがそれを標準化しますか?

どんな照明でもありがとうございます。 私は、これを説明するいかなる情報も見つけることができませんでした。 すべてのソースは、ドメイン ソケットを使用する方法について説明しています。

どのように解決するのですか?

を作成すると PF_UNIX 型のソケットを作成すると SOCK_STREAM で、接続を受け付けると、接続を受け付けるたびに新しいファイルディスクリプタを(このメソッドの戻り値として) 取得します。 accept システム コールの戻り値として)新しいファイル記述子を取得します。 このファイル記述子は、クライアントプロセスのファイル記述子からデータを読み取り、クライアントプロセスのファイル記述子にデータを書き込む。 このように、TCP/IP 接続と同様に機能します。

unixドメインプロトコルフォーマット」は存在しません。 Unixドメインソケットはネットワーク接続でピアに接続することができないので、ある必要はありません。 カーネルでは、ファイルディスクリプタに含まれる SOCK_STREAM Unixドメインソケットは、カーネルにどのファイルディスクリプタが接続のもう一方の端にあるかを伝えるデータ構造を指します。 ファイルディスクリプタにデータを書き込むと、カーネルは接続の相手側のファイルディスクリプタを探し、そのデータを他のファイルディスクリプタの読み込みバッファに追加します。 カーネルは、宛先を記述するヘッダーを持つパケット内にデータを置く必要はありません。

に対して SOCK_DGRAM ソケットでは、データを受信するソケットのパスをカーネルに伝える必要があり、カーネルはそれを使って受信ソケットのファイルディスクリプタを探します。

サーバソケットに接続する前に(あるいは SOCK_DGRAM を使用している場合はデータを送信する前に)、 サーバプロセスは getpeername (例えば SOCK_STREAM ). に対して SOCK_DGRAM を指定した場合、受信側では recvfrom を使って送信側ソケットのパスを取得することができます。

パスをバインドしない場合、受信側のプロセスは相手を一意に識別するidを取得することができません。 少なくとも、私が実行している Linux カーネルでは ( 2.6.18-238.19.1.el5 ).