Unix-Sockets

Unix Domain Socket 綁定,復用地址

  • April 1, 2019

如果我bind()是一個AF_INET套接字(用於 TCP 連接),那麼稍後close(),當我執行我的程序時,我可能會遇到問題,因為儘管有close(),核心仍然可以擁有與打開的套接字關聯的資源。

不過,我對 Unix Domain Sockets 的這個問題不是很清楚。

到目前為止我見過

  1. 我需要一個獨特的路徑來使用它bind()。呼叫時路徑必須不存在,bind()文件將由bind(). (但是,它可能在文件系統中可見也可能不可見。如果路徑以特殊字元開頭,則文件不會出現在文件系統中\0。)
  2. 如果文件不是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. 某些東西使它保持打開狀態(套接字未關閉),或
  2. 它有關聯的路徑

如果只有 1. 為真,我們有一個打開的套接字和一個 inode,一切正常。

如果只有 2. 為真,由於 inode 有與之關聯的路徑,核心無法清理它,但它也不起作用,因為它缺少處理傳入連接的套接字資源。它甚至不會是一個普通的文件,只是一個繁忙的工作套接字的過去榮耀的死殼。

在 AF_INET 連接的情況下,地址重用問題是更好可用性的設計選擇。

在 AF_LOCAL 的情況下,剩余文件是先前設計選擇的產物,這會阻止核心本身在呼叫時自動清理它在 1 go 中創建的文件close()。沒有關聯的隱藏機制,因此核心希望在close()呼叫 a 後保留此資源。

在這種情況下,了解核心為何具有TIME_WAITTCP 連接狀態的基本原理非常重要。此狀態旨在允許與連接關聯的任何數據包(可能需要更長的路由或以其他方式延遲)在同一埠上建立新連接之前從網路中排出。這樣,您可以確保新連接不會收到與舊連接關聯的任何數據包。該reuseaddr選項使開發人員能夠傳達“不要執行該等待”。

Unix 域套接字沒有這個問題。reuseaddr在這種情況下並沒有真正的意義。

引用自:https://unix.stackexchange.com/questions/509861