使用Unix域套接字与TCP套接字建立连接的成本有何区别?

10

奇怪的是,我在谷歌上没有找到这个信息。使用Unix域套接字与TCP套接字建立连接的成本是多少?

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

2个回答

11

如果你查看代码,你会发现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连接建立代码简单得多。


2
使用TCP套接字连接服务器可能涉及网络流量,以及TCP三次握手。
本地套接字(以前称为Unix域套接字)都是本地的,但需要访问磁盘上的物理文件。
如果您只进行本地通信,则本地套接字可能更快,因为协议的开销较小。如果您的应用程序需要远程连接,则无法使用本地套接字。
顺便提一下,如果您只在本地通信而不是通过网络,使用一对命名管道(如果您正在分叉,则使用匿名管道)可能会更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接