Unix Domain Socket 綁定,復用地址
如果我
bind()
是一個AF_INET
套接字(用於 TCP 連接),那麼稍後close()
,當我執行我的程序時,我可能會遇到問題,因為儘管有close()
,核心仍然可以擁有與打開的套接字關聯的資源。不過,我對 Unix Domain Sockets 的這個問題不是很清楚。
到目前為止我見過
- 我需要一個獨特的路徑來使用它
bind()
。呼叫時路徑必須不存在,bind()
文件將由bind()
. (但是,它可能在文件系統中可見也可能不可見。如果路徑以特殊字元開頭,則文件不會出現在文件系統中\0
。)- 如果文件不是
unlink()
-ed,即使在關閉之後,核心也會保留相關的資源,並且套接字是完全正常的。問題:
由於任何一個
close()
或unlink()
單獨一個都不能使 Unix 域套接字消失,他們兩個都會可靠地完成這個技巧/觸發核心放棄與套接字相關的所有資源嗎?如果兩者都被呼叫,我是否可能會遇到
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. 為真,由於 inode 有與之關聯的路徑,核心無法清理它,但它也不起作用,因為它缺少處理傳入連接的套接字資源。它甚至不會是一個普通的文件,只是一個繁忙的工作套接字的過去榮耀的死殼。
在 AF_INET 連接的情況下,地址重用問題是更好可用性的設計選擇。
在 AF_LOCAL 的情況下,剩余文件是先前設計選擇的產物,這會阻止核心本身在呼叫時自動清理它在 1 go 中創建的文件
close()
。沒有關聯的隱藏機制,因此核心希望在close()
呼叫 a 後保留此資源。
在這種情況下,了解核心為何具有
TIME_WAIT
TCP 連接狀態的基本原理非常重要。此狀態旨在允許與連接關聯的任何數據包(可能需要更長的路由或以其他方式延遲)在同一埠上建立新連接之前從網路中排出。這樣,您可以確保新連接不會收到與舊連接關聯的任何數據包。該reuseaddr
選項使開發人員能夠傳達“不要執行該等待”。Unix 域套接字沒有這個問題。
reuseaddr
在這種情況下並沒有真正的意義。