web-dev-qa-db-ja.com

Unixドメインソケットは複数のクライアントをどのように区別しますか?

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

言い換えると、サーバーは/ tmp/socketなどのパスにバインドされたソケットを作成します。 2つ以上のクライアントが/ tmp/socketに接続します。 client1とclient2からのデータを追跡する下で何が起こっているのですか?ネットワークスタックはドメインソケットに関与しないので、カーネルはすべての作業をここで行っていると思いますか?

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

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

58

タイプPF_UNIXSOCK_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)。

88
rob mayoff