10

奇怪的是,我没有通过谷歌搜索找到此信息。使用 Unix 域套接字与 TCP 套接字建立连接的成本是多少?

现在我必须使用 TCP 套接字进行连接池,因为重新连接非常昂贵。我想知道是否可以通过简单地切换到 Unix 域套接字并摆脱连接池来简化我的客户端。

4

2 回答 2

10

如果您查看代码,您会发现 Unix Domain 套接字执行的代码远少于 TCP 套接字。

通过 TCP 套接字发送的消息必须一路通过网络堆栈到达环回接口(在 Unix 风格的系统上通常称为“lo”的虚拟网络接口设备),然后返回到接收套接字。网络堆栈代码添加 TCP 和 IP 标头,做出路由决策,通过“lo”将数据包转发给自己,然后执行更多路由并将标头剥离。此外,由于 TCP 是一种网络协议,它的连接建立部分对于处理丢弃的数据包具有各种额外的复杂性。对您来说最重要的是,TCP 必须发送三个消息才能建立连接(SYN、SYN-ACK 和 ACK)。

Unix 域套接字只需查看虚拟文件系统(或“抽象名称空间”)即可找到目标套接字对象(在 RAM 中)并直接将消息排队。此外,即使您使用文件系统来命名目标套接字,如果该套接字最近被访问过,它的文件系统结构将缓存在 RAM 中,因此您不必转到磁盘。为 Unix 域套接字建立连接涉及在 RAM 中创建一个新的套接字对象实例(即,由 accept() 返回的套接字,这也是 TCP 必须完成的事情)并在每个套接字中存储一个指针两个连接的套接字对象(因此当它们需要发送时,它们每个都有一个指向另一个套接字的指针)。差不多就是这样。不需要额外的数据包。

By the way, this paper suggests that Unix Domain sockets are actually faster than even Pipes for data transfers:

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

Unfortunately, they didn't do specific measurements of connection establishment costs, but as I have said, I've looked at the Linux source code and it's really quite a lot simpler than the TCP connection establishment code.

于 2013-09-16T18:40:27.040 回答
2

使用 TCP 套接字连接到服务器可能涉及网络流量以及 TCP三向握手

本地套接字(以前称为 Unix 域套接字)都是本地的,但需要访问磁盘上的物理文件。

如果您只进行本地通信,那么本地套接字可能会更快,因为协议的开销更少。如果您的应用程序需要远程连接,那么您不能使用本地套接字。


顺便说一句,如果您只是在本地进行通信,而不是通过网络进行通信,那么一对命名管道(或者如果您正在分叉,则为匿名管道)可能会更好。

于 2012-11-26T08:30:44.270 回答