出自这个答案:
https://stackoverflow.com/questions/2482411/is-this-pdo-bug-fixed-now/2482424#2482424
当主机为“localhost”时,MySQL Unix 客户端使用 Unix 套接字(又称 Unix 域套接字)而不是 TCP/IP 套接字进行连接,因此 TCP 端口无关紧要。
答案1
AUNIX 套接字,又名 Unix 域套接字,是一种进程间通信机制,允许在同一台机器上运行的进程之间进行双向数据交换。
IP 套接字(尤其是 TCP/IP 套接字)是一种允许进程通过网络进行通信的机制。在某些情况下,您可以使用 TCP/IP 套接字与在同一台计算机上运行的进程进行通信(通过使用环回接口)。
UNIX 域套接字知道它们在同一系统上执行,因此它们可以避免一些检查和操作(如路由);这使得它们比 IP 套接字更快、更轻量。因此,如果您计划与同一主机上的进程进行通信,这是一个比 IP 套接字更好的选择。
编辑:按照Nils Toedtmann 的评论:UNIX 域套接字受文件系统权限控制,而 TCP 套接字只能在数据包过滤器级别进行控制。
答案2
您可以使用以下命令列出您自己的机器本地 unix 套接字:
Linux:
netstat -a -p --unix
MacOS: [jbmeerkat 评论]
netstat -a -f unix
玩得开心!
答案3
Unix 套接字和 TCP/IP 套接字有什么区别?
TCP/IP 套接字用于跨 TCP/IP 网络进行通信。已连接的 TCP 套接字由本地 IP、本地端口、远程 IP 和远程端口的组合标识。正在监听的 TCP 套接字由本地端口和可能的本地 IP 标识。据我了解,至少在 Linux 上,TCP/IP 套接字总是会导致生成和解码 TCP/IP 数据包,即使客户端和服务器位于同一台计算机上。
另一方面,unix 域套接字(有时简称为 unix 套接字)在单台机器上运行。监听套接字位于文件系统层次结构中,可以通过文件系统权限控制对它们的访问。
此外,在 Unix 套接字上接受连接的进程可以确定连接进程的用户 ID。这样可以避免身份验证步骤。您无需为数据库服务器生成密码并将其副本包含在 Web 应用程序的代码中,只需告诉数据库服务器运行 Web 应用程序的用户可以访问数据库中的相应用户帐户即可。
TCP 套接字也由 Unix 处理吗?
当然
TCP 套接字是 TCP 协议规范的一部分
互联网协议规范往往只关注网络上发生的事情,TCP 规范包含 Socket 的定义,但该定义与“套接字 API”使用该术语的方式不同。TCP RFC 对 Socket 的定义更接近于 Sockets API 所称的 sockaddr_in。
我们所知的“套接字 API”是由 BSD 引入的,但后来被广泛复制,并被纳入 posix 标准。TCP 和 UDP 套接字的基本内容在不同平台上往往大致相同,但更高级的内容和与操作系统其他部分交互的内容有所不同,例如在类 unix 系统上,套接字由文件句柄标识,可以通过文件 API 读取/写入,而在 Windows 上并非如此。
一些对套接字 API 的扩展已在 rfcs 中记录,但这些 RFC 仅是“信息性的”。
或者任何协议都可以使用 IP 套接字?
当应用程序使用“socket”函数显式创建套接字时(套接字也由 accept 函数创建),它会传递三个参数:“域”、“类型”和“协议”。这三个参数可用于选择多种不同类型的套接字。
- 域选择正在使用的协议/地址系列,例如 ipv4 的 AF_INET、ipv6 的 AF_INET6、unix 文件系统路径的 AF_Unix 等。
- 类型选择通信语义,主要有数据报和流,但也有其他更专业的类型。
- 协议选择要使用的协议,如果设置为 0,则将使用域和类型组合的默认协议。