TCP接続用のソケットがあり、後でbind()
プログラムを実行すると問題が発生する可能性があります。それにもかかわらず、カーネルはまだオープンソケットに関連するリソースを所有できるからです。AF_INET
close()
close()
しかし、Unixドメインソケットに関するこの問題についてはよくわかりません。
これまで私が見た
それを使用するには一意のパスが必要です
bind()
。呼び出し時にパスは存在しないでください。ファイルはbind()
でマークされますbind()
。 (ただし、ファイルシステムに表示される場合と表示されない場合があります。パスが特殊文字で始まると、ファイルはファイルシステムに表示されません。\0
)ファイルが
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.だけ真ならオープンソケットとinodeがあり、すべてが正常です。
2.のみtrueの場合、inodeに接続されたパスがあるため、カーネルはそれをクリーンアップできませんが、着信接続を処理するためのソケットリソースが不足しているため機能しません。それは普通のファイルでもなく、忙しく動作するソケットの過去の栄光の死んだ殻です。
AF_INET接続の場合、アドレスの再利用はより良い可用性のための設計選択です。
AF_LOCALの場合、残りのファイルは以前のデザイン選択のアーティファクトであるため、カーネル自体がclose()
呼び出し時に一度に生成されたファイルを自動的にクリーンアップするのを防ぎます。関連する隠しメカニズムがないため、カーネルはclose()
aを呼び出した後にこのリソースを保持することを期待しています。
答え1
この場合、TIME_WAIT
カーネルのTCP接続状態の背後にある理論的根拠を理解することが重要です。この状態の目的は、同じポートに新しい接続が確立される前に、その接続に関連付けられているすべてのパケット(より長いパスがかかるか遅延する可能性がある)がネットワークから排出されることを許可することです。これにより、新しい接続が古い接続に関連付けられたパケットを受信しないようにすることができます。このreuseaddr
オプションを使用すると、開発者は「待機しない」メッセージを渡すことができます。
Unixドメインソケットにはこの問題はありません。reuseaddr
この場合、実際には意味がありません。
答え2
ファイルが unlink() でない場合、カーネルは閉じた後も関連リソースを保持し、ソケットは完全に機能します。
いいえ、ソケットへの最後のオープンハンドルがclose()の場合、カーネルはソケットに関連するすべてのリソースを解放します。再バインディング()パスを切断()するだけです。
close() や unlink() だけでは Unix ドメインソケットを消すことができないので、両方ともこのタスクを確実に実行したり、ソケットに関連するすべてのリソースを放棄するようにカーネルをトリガーできますか?
検索してください;-)
unix_domain_socket_inodeの寿命は次のとおりです。
- 何かがソケットを開いたままにしたり(ソケットが閉じていない)
- 関連パスがあります
いいえ二人用。対応する「接続パス」は削除(unlink()されます)され、ソケットは他のハードリンクを介して引き続きアクセスできます。
私の他のものを見て回答デモンストレーションして説明してください。
ソケットinode(ソケットfdが指すノード、「エントリポイント」の役割を介してアクセスすることもできます)を/proc/PID/fd/FD
実際に/tmp/.X11-unix/X0
パスが特殊文字\ 0で始まる場合、ファイルはファイルシステムに表示されません。 )
.sun_path
で始まる\0
パスはなく、パスとは異なり、追加の\0
バイトを含めることができ、まったく異なる意味を持つ「抽象」Unixドメインアドレスです(パスとは異なり、誰でもソケットに接続できます)。従来のUnixドメインソケットとは異なり、接続は先行パスによって決定されるファイルアクセス権の対象となります。
この「抽象ソケット」機能はLinuxにのみ存在します。