奇怪的是,我没有通过谷歌搜索找到此信息。使用 Unix 域套接字与 TCP 套接字建立连接的成本是多少?
现在我必须使用 TCP 套接字进行连接池,因为重新连接非常昂贵。我想知道是否可以通过简单地切换到 Unix 域套接字并摆脱连接池来简化我的客户端。
奇怪的是,我没有通过谷歌搜索找到此信息。使用 Unix 域套接字与 TCP 套接字建立连接的成本是多少?
现在我必须使用 TCP 套接字进行连接池,因为重新连接非常昂贵。我想知道是否可以通过简单地切换到 Unix 域套接字并摆脱连接池来简化我的客户端。
如果您查看代码,您会发现 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.
使用 TCP 套接字连接到服务器可能涉及网络流量以及 TCP三向握手。
本地套接字(以前称为 Unix 域套接字)都是本地的,但需要访问磁盘上的物理文件。
如果您只进行本地通信,那么本地套接字可能会更快,因为协议的开销更少。如果您的应用程序需要远程连接,那么您不能使用本地套接字。
顺便说一句,如果您只是在本地进行通信,而不是通过网络进行通信,那么一对命名管道(或者如果您正在分叉,则为匿名管道)可能会更好。