ソケットパスの長さが100文字に制限されるのはなぜですか?

ソケットパスの長さが100文字に制限されるのはなぜですか?

Unixシステムでは、通常、パス名に長さ制限はありません(Linuxでは4096文字)。長さ制限を持つソケットファイルパスは除外されます。約100文字(107文字Linux)。

  • 最初の質問:限界はなぜこんなに低いのですか?

確認した結果、現在の作業ディレクトリを変更し、各ディレクトリで同じパスを使用して複数のソケットファイルを作成すると、この制限を解決できるようです。./myfile.sockクライアントアプリケーションは、予想されるサーバープロセスに正しく接続されているようです。lsof同じソケットファイルパス。

  • このソリューションは信頼できますか?それとも幸運なのでしょうか?
  • この動作はLinuxに固有のものですか、それともこの回避策は他のUnixにも当てはまりますか?

答え1

snprintf()と使用時のオーバーフローを防ぐために、他のプラットフォームとの互換性または以前のバージョンとの互換性strncpy()

マイケル・ケリスクが説明する彼の本存在するページ 1165- 57章、ソケット:Unixドメイン:

SUSv3 は sun_path フィールドのサイズを指定しません。初期のBSD実装では108バイトと104バイトを使用しましたが、最新の実装(HP-UX 11)では92バイトを使用しました。ポータブルアプリケーションはこの低い値でコーディングし、snprintf()またはstrncpy()を使用してこのフィールドに書き込むときにバッファオーバーフローを防ぐ必要があります。

Dockerの人々は一部のソケットの長さが110文字であるため、これを嘲笑することもあります。

これがLINUXが108個の文字ソケットを使用する理由です。これは変わりますか?確かに。これが、以前のオペレーティングシステムで最初にこの制限が作成された理由です。

答えを引用するには:

便利なカーネルデータ構造で使用可能なスペースを一致させることを目的としています。

McKusickらの「4.4BSDオペレーティングシステムの設計と実装」を引用してください。他。 (ページ369):

メモリ管理機能は、mbufs というデータ構造を中心に行われます。 Mbuf、つまりメモリバッファの長さは128バイトで、そのうち100または108バイトはデータ保存用に予約されています。

その他のオペレーティングシステム(Unixドメインソケット):

答え2

その理由について、nwildnerは記事を書いた。良い答え

ここでは、これを使用する方法と相対パスの使用に焦点を当てます。

内部的には、ソケットファイルは通常inodeとして照会されますが、名前で照会することもできます。 Linuxでは、このクエリはunix_find_socket_byinode()次に定義されています。ネット/Unix/af_unix.c

これは次のように簡単に確認できます。

  • 2つのディレクトリを作成します。ㅏ/そして第二/
  • 各ディレクトリの下に同じ名前のソケットファイルをリッスンするプロセスがあります。そしてsocat次のコマンドを使用できます。
$ socat UNIX-LISTEN:./my.sock -
  • ソケットファイルは移動して交換されます。A/my.sock到着第二/その逆。
  • これからクライアントアプリケーションに接続するとA/my.sockサーバーに接続します第二、次に接続した場合B/my.sockサーバーに接続します(ただし、通信が終了すると、サーバープロセスは、独自のソケットファイルの内容と見なされるものを合法的に削除できます。)

私はいくつかのUnixシステム(いくつかの異なる場合はLinux Debian、FreeBSD、およびOpenIndiana)でこの動作を確認しました。したがって、標準ではありませんが、この動作は少なくとも広く普及しています。

絶対パスは、クライアントプロセスがサーバーとの初期通信を確立する方法を知ることができないため、クライアントとサーバープロセス間の規則として頻繁に使用されます。

ただし、この初期通信が問題にならない場合は、相対パスを使用してソケットファイルを生成するのが安全なようです。したがって、サーバープロセスがソケットファイルの場所を直接制御しない場合のパス長の問題を回避できます。

関連情報