当我正在阅读AF_INET
的含义时,我了解到另一个家庭叫UNIX domain socket
。这是我读到的wiki link。
我不明白这意味着什么:
Unix域套接字使用文件系统作为其地址名称空间。 它们被进程引用为文件系统中的inode。这个 允许两个进程打开同一个套接字以进行通信。 但是,通信完全在操作系统内发生 内核。
如果我想SSH or FTP
,我会使用哪个家庭AF_INET or AF_UNIX
。我实际上有点困惑。
答案 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(可以获得长度)模式进行非阻塞,但您可以选择自己的模式。确保在退出时删除临时文件(它将具有零字节但仍将显示在文件系统目录中)