Unixドメインソケットバインディング、アドレスの再利用

Unixドメインソケットバインディング、アドレスの再利用

TCP接続用のソケットがあり、後でbind()プログラムを実行すると問題が発生する可能性があります。それにもかかわらず、カーネルはまだオープンソケットに関連するリソースを所有できるからです。AF_INETclose()close()

しかし、Unixドメインソケットに関するこの問題についてはよくわかりません。

これまで私が見た

  1. それを使用するには一意のパスが必要ですbind()。呼び出し時にパスは存在しないでください。ファイルはbind()でマークされますbind()。 (ただし、ファイルシステムに表示される場合と表示されない場合があります。パスが特殊文字で始まると、ファイルはファイルシステムに表示されません。\0

  2. ファイルがunlink()-edでない場合、カーネルは閉じた後も関連リソースを保持し、ソケットは完全に機能します。

質問:

どちらもUnixドメインソケットを消去できないclose()ため、unlink()両方の人がこの操作を確実に実行したり、ソケットに関連するすべてのリソースを放棄したりするためにカーネルをトリガーできますか?

reuseaddrとが同時に呼び出されるとエラーが発生する可能性close()がありますか?unlink()


編集(コメントと回答後):

したがって、バインドされたAF_LOCALソケットは次のようになります。

unix_domain_socket_inode
-> binded to a socket
-> associated with a file (path)

寿命はunix_domain_socket_inode次の場合まで続きます。

  1. 何かがソケットを開いたままにしたり(ソケットが閉じていない)
  2. 関連パスがあります

1.だけ真ならオープンソケットとinodeがあり、すべてが正常です。

2.のみtrueの場合、inodeに接続されたパスがあるため、カーネルはそれをクリーンアップできませんが、着信接続を処理するためのソケットリソースが不足しているため機能しません。それは普通のファイルでもなく、忙しく動作するソケットの過去の栄光の死んだ殻です。

AF_INET接続の場合、アドレスの再利用はより良い可用性のための設計選択です。

AF_LOCALの場合、残りのファイルは以前のデザイン選択のアーティファクトであるため、カーネル自体がclose()呼び出し時に一度に生成されたファイルを自動的にクリーンアップするのを防ぎます。関連する隠しメカニズムがないため、カーネルはclose()aを呼び出した後にこのリソースを保持することを期待しています。

ベストアンサー1

この場合、TIME_WAITカーネルのTCP接続状態の背後にある理論的根拠を理解することが重要です。この状態の目的は、同じポートに新しい接続が確立される前に、その接続に関連付けられているすべてのパケット(より長いパスがかかるか遅延する可能性がある)がネットワークから排出されることを許可することです。これにより、新しい接続が古い接続に関連付けられたパケットを受信しないようにすることができます。このreuseaddrオプションを使用すると、開発者は「待機しない」メッセージを渡すことができます。

Unixドメインソケットにはこの問題はありません。reuseaddrこの場合、実際には意味がありません。

おすすめ記事