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

时间:2014-01-09 22:28:43

标签: sockets unix network-protocols

当我正在阅读AF_INET的含义时,我了解到另一个家庭叫UNIX domain socket。这是我读到的wiki link

我不明白这意味着什么:

  

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

如果我想SSH or FTP,我会使用哪个家庭AF_INET or AF_UNIX。我实际上有点困惑。

2 个答案:

答案 0 :(得分:37)

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

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

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

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

答案 1 :(得分:2)

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