解释unix域套接字的示例 - AF_INET vs AF_UNIX

问题描述 投票:19回答:2

当我在阅读AF_INET的意思时,我了解到还有另一个家庭叫做UNIX domain socket。这是我读到的wiki link

我不明白这意味着什么:

Unix域套接字使用文件系统作为其地址名称空间。它们被进程引用为文件系统中的inode。这允许两个进程打开同一个套接字以进行通信。但是,通信完全在操作系统内核中进行。

如果我想做SSH or FTP,我用什么家庭AF_INET or AF_UNIX。我实际上有点困惑。

sockets unix network-protocols
2个回答
39
投票

如果你想与远程主机通信,那么你可能需要一个INET套接字。

区别在于INET套接字绑定到IP地址端口元组,而UNIX套接字“绑定”到文件系统上的特殊文件。通常,只有在同一台机器上运行的进程才能通过后者进行通信。

那么,为什么要使用UNIX插座呢?正是由于上述原因:同一主机上的进程之间的通信,通过环回作为INET套接字的轻量级替代。

实际上,INET套接字位于完整TCP / IP堆栈的顶部,具有流量拥塞算法,退避等等。 UNIX套接字不必处理任何这些问题,因为一切都设计为机器的本地,因此其代码更简单,通信更快。当然,您可能会注意到仅在重负载下的差异,例如:当反向代理Nginx等后面的应用服务器(Node.js,Tornado ......)时


2
投票

AF_UNIX套接字提供了良好的进程间通信。打开一个套接字对socketpair(..)“并绑定到一个临时文件名。写入其中一个到达另一个。内核路由消息没有协议或文件系统开销。可以使用阻塞i / o或选择(.. 。)以FIFO方式同步线程和进程。我喜欢使用select和datagram(可以获得长度)模式的非阻塞,但你可以选择自己的模式。确保在退出时删除临时文件(它将具有零字节但仍会出现在filesystem目录中)

© www.soinside.com 2019 - 2024. All rights reserved.