Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Unix域套接字与TCP套接字建立连接的成本是多少?_Tcp_Connection Pooling_Unix Socket - Fatal编程技术网

使用Unix域套接字与TCP套接字建立连接的成本是多少?

使用Unix域套接字与TCP套接字建立连接的成本是多少?,tcp,connection-pooling,unix-socket,Tcp,Connection Pooling,Unix Socket,奇怪的是,我没有通过谷歌搜索找到这些信息。使用Unix域套接字与TCP套接字建立连接的成本是多少 现在我必须使用TCP套接字进行连接池,因为重新连接非常昂贵。我想知道是否可以通过简单地切换到Unix域套接字并摆脱连接池来简化我的客户端。使用TCP套接字连接到服务器可能涉及网络流量以及TCP 本地套接字(以前称为Unix域套接字)都是本地的,但需要访问磁盘上的物理文件 如果只进行本地通信,那么本地套接字可能会更快,因为协议的开销更小。如果应用程序需要远程连接,则不能使用本地套接字 顺便说一句,如

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


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

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

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

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



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

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

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

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

顺便说一句,本文认为Unix域套接字实际上比数据传输的管道还要快:


不幸的是,他们没有对连接建立成本进行具体测量,但正如我所说,我已经看过Linux源代码,它确实比TCP连接建立代码简单得多。

回答得很好。谢谢!