Unix 套接字和 TCP/IP 套接字有什么区别?

apa*_*che 185 networking ip tcp socket

它来自这个答案:

/sf/ask/173768801/#2482424

当主机为“localhost”时,MySQL Unix 客户端使用 Unix 套接字,AKA Unix Domain Socket,而不是 TCP/IP 套接字进行连接,因此 TCP 端口无关紧要。

pQd*_*pQd 283

UNIX插座,AKA Unix域套接字,是一个进程间通信机制,允许在相同的机器上运行的进程之间的双向数据交换。

IP 套接字(尤其是 TCP/IP 套接字)是一种允许进程间通过网络进行通信的机制。在某些情况下,您可以使用 TCP/IP 套接字与运行在同一台计算机上的进程对话(通过使用环回接口)。

UNIX 域套接字知道它们在同一个系统上执行,因此它们可以避免一些检查和操作(如路由);这使得它们比 IP 套接字更快、更轻。因此,如果您计划与同一主机上的进程通信,这是比 IP 套接字更好的选择。

编辑:根据Nils Toedtmann 的评论:UNIX 域套接字受文件系统权限的约束,而 TCP 套接字只能在数据包过滤器级别进行控制。

  • 也许补充一点,UNIX 域套接字受文件系统权限的约束,而 TCP 套接字则不受。因此,与 TCP 套接字相比,管理哪些用户可以访问 UNIX 域套接字要容易得多。 (25认同)
  • @Pacerier Unix sockets只是实现unix IPC(共享进程间内存等)的一种方法,因此调用unix sockets unix IPC 是不正确的。 (7认同)

The*_*tor 37

您可以使用以下命令列出您自己的机器本地 unix 套接字:

Linux:

netstat -a -p --unix
Run Code Online (Sandbox Code Playgroud)

MacOS:[jbmeerkat 评论]

netstat -a -f unix
Run Code Online (Sandbox Code Playgroud)

玩得开心!

  • @expert,Windows 中的命名管道等同于 Unix 中的命名管道。Unix 中的 IPC 套接字在 Windows 中没有等价物 (11认同)
  • Windows 上不存在 Unix 套接字。然而,`netstat` 确实适用于 Windows。 (9认同)
  • Linux 上也存在命名管道。 (7认同)
  • Windows 10 支持 Unix 套接字。有一些限制,但它是可用的:https://blogs.msdn.microsoft.com/commandline/2017/12/19/af_unix-comes-to-windows/ (6认同)
  • @apache,Windows 中类似的东西称为“命名管道”。 (5认同)
  • 或 MacOS 上的“netstat -a -f unix” (4认同)
  • 请注意,一个区别是命名管道一次只能连接一个客户端(总共有 2 个进程通信)。UNIX 套接字与 IP 套接字一样,可以同时连接多个客户端,每个客户端都得到单独的响应。 (3认同)
  • Ejoso 在那篇文章中说,为了进行双向通信,您必须创建两个单独的管道,就像在 linux 上做管道一样。您也无法区分连接到一个服务器地址的多个客户端。Unix 域套接字允许双向通信和多个客户端,与 IP 套接字相同。命名管道与套接字不同。 (2认同)

Pet*_*een 25

Unix 套接字和 TCP/IP 套接字有什么区别?

TCP/IP 套接字用于跨 TCP/IP 网络进行通信。连接的 TCP 套接字由本地 IP、本地端口、远程 IP 和远程端口的组合标识。侦听 TCP 套接字由本地端口和可能的本地 IP 标识。AIUI 至少在 linux TCP/IP 套接字上总是导致 TCP/IP 数据包的生成和解码,即使客户端和服务器在同一台机器上。

另一方面,unix 域套接字(有时缩写为 unix 套接字)在单台机器上运行。侦听套接字位于文件系统层次结构中,对它们的访问可以由文件系统权限控制。

此外,接受 Unix 套接字连接的进程可以确定连接的进程的用户 ID。这可以避免对身份验证步骤的需要。无需为您的数据库服务器生成密码并将其副本包含在您的 webapp 代码中,您只需告诉数据库服务器运行 webapp 的用户有权访问数据库中的相应用户帐户。


TCP 套接字也由 Unix 处理?

当然

TCP 套接字是 TCP 协议规范的一部分

Internet 协议规范仅倾向于关注线路上发生的情况,TCP 规范包含 Socket 的定义,但该定义与“套接字 API”使用该术语的方式不同。

我们所知道的“套接字 API”是由 BSD 引入的,但后来被到处复制并作为 posix 标准的一部分包含在内。TCP 和 UDP 套接字的基本内容在不同平台上趋于相同,但更高级的内容和与操作系统其他部分交互的内容各不相同,例如在类 Unix 系统上,套接字由文件句柄标识,并且可以由文件 API 读取/写入,在 Windows 上不是这种情况。

rfcs 中记录了套接字 API 的一些扩展,但这些 RFC 只是“信息性的”。

或任何协议都可以使用 IP 套接字?

当应用程序使用“socket”函数显式创建套接字(套接字也由接受函数创建)时,它传递三个参数,“域”、“类型”和“协议”。在它们之间,这三个参数可用于选择许多不同类型的套接字。

  • domain 选择正在使用的协议/地址系列,例如 AF_INET 用于 ipv4,AF_INET6 用于 ipv6,AF_Unix 用于 unix 文件系统路径等。
  • type 选择通信语义,主要是数据报和流,但也有其他更专业的类型。
  • protocol 选择要使用的协议,如果它设置为 0,则将使用域和类型组合的默认协议。

  • 不幸的是AIUI没有。https://superuser.com/questions/352263/ssh-sharing-control-sockets-over-nfs (2认同)