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

eag*_*arn 21 unix sockets network-protocols

当我正在阅读什么AF_INET方式时,我了解到还有另一个家庭UNIX domain socket.这是我读到的关于此的维基链接.

我不明白这意味着什么:

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

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

Ste*_*ppo 40

如果要与远程主机通信,则可能需要一个INET套接字.

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

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

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

  • 在编程中,让进程彼此交换数据是非常常见的,尤其是同一个应用程序的多个实例,或者一组相关的应用程序.使用套接字进行交换只是可用于进程间通信的许多不同机制之一. (3认同)
  • @eagertoLearn - 我很高兴您有兴趣了解差异而不是盲目地编写代码。使用“域套接字”的应用程序代码的一个完美示例是“X 服务器组件”。如果你在你的 linux 上使用 `GNOME` 或 `KDE`,你会看到 `/tmp` 中有套接字。`ls -la /tmp` 将显示套接字,或者您甚至可以`find /tmp -type s`。Remy 的解释是“X 服务器组件”使用“域套接字”的原因。 (2认同)