2012-11-26 50 views
6

奇怪的是,我沒有通過谷歌搜索找到這個信息。使用Unix域套接字與TCP套接字建立連接的成本是多少?使用Unix域套接字與TCP套接字建立連接的成本是多少?

現在我必須做連接池與TCP套接字,因爲重新連接是非常昂貴的。我想知道是否可以通過簡單地切換到Unix域套接字並擺脫連接池來簡化客戶端。

回答

6

如果您查看代碼,您會發現Unix域套接字比TCP套接字執行的代碼少得多。

通過TCP套接字發送的消息必須一路通過網絡堆棧到達回送接口(這是一個虛擬網絡接口設備,在Unix樣式的系統上通常稱爲「lo」),然後備份到接收插座。網絡堆棧代碼粘貼在TCP和IP標頭上,做出路由決定,通過「lo」將數據包轉發給自己,然後執行更多路由並將報頭剝離。此外,由於TCP是一種網絡協議,因此它的連接建立部分會增加處理丟包的各種複雜性。最重要的是,TCP必須發送三條消息來建立連接(SYN,SYN-ACK和ACK)。

Unix域套接字只需查看虛擬文件系統(或「抽象名稱空間」)即可查找目標套接字對象(在RAM中)並直接對消息進行排隊。此外,即使您使用文件系統來命名目標套接字,如果該套接字最近被訪問過,它的文件系統結構也將被緩存在RAM中,因此您不必轉到磁盤。爲Unix域套接字建立連接涉及在RAM中創建一個新的套接字對象實例(即由accept()返回的套接字,這也是TCP所必須完成的),並在每個套接字中存儲一個指針兩個連接的套接字對象(以便它們在需要發送時以後每個套接字都有一個指向其他套接字的指針)。這是非常多的。不需要額外的數據包。

順便說一句,本文認爲,UNIX域套接字實際上快於甚至管道傳輸數據:

http://osnet.cs.binghamton.edu/publications/TR-20070820.pdf

不幸的是,他們沒有這樣做的連接建立成本特定的測量,但作爲我說過,我已經看過Linux源代碼,它比TCP連接建立代碼更簡單。

+0

很棒的回答。謝謝! – expert

3

使用TCP套接字連接到服務器可能涉及網絡流量以及TCP three-way handshake

本地套接字(以前稱爲Unix域套接字)都是本地的,但需要訪問磁盤上的物理文件。

如果您只進行本地通信,則本地套接字可能會更快,因爲協議的開銷較小。如果你的應用程序需要遠程連接,那麼你不能使用本地套接字。


順便說一句,如果你只在本地通信,而不是在網絡上,一對命名管道(或者如果你分叉匿名)可能會更好。