【问题标题】:Is there any legitimate reason for using Unix sockets over TCP/IP with mysql?在 mysql 上使用 TCP/IP 上的 Unix 套接字有什么正当理由吗?
【发布时间】:2009-12-03 08:01:26
【问题描述】:

我试图弄清楚为什么 mysql 默认使用 Unix 套接字 (/tmp/mysql.sock),而不是普通的 TCP/IP 套接字。

这似乎不是一个安全的事情,因为你只能在 127.0.0.1 上监听,这应该是同样安全的(套接字文件是世界可写的,所以你不会得到基于 Unix 帐户的保护)。

当然,所有操作系统都非常依赖高性能 TCP/IP,以至于它不会比 Unix 套接字慢很多——Linux 甚至对网络流量也做了各种零复制技巧,所以它肯定必须很快才能进行环回。

那么在这里使用 Unix 套接字有什么正当理由,还是只是一些奇怪的历史事故?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    虽然您在访问 localhost 时不会访问整个 IP 堆栈,但您仍然会访问其中的很大一部分。 unix 套接字本质上只是一个 2 路管道。它更快更轻。

    Unix 套接字还允许您在不管理防火墙规则的情况下控制访问,因为可以通过文件系统权限授予访问权限。

    unix 套接字提供的另一个功能是将文件描述符从一个进程传递到另一个进程的能力。

    【讨论】:

    • 任何文件描述符都可以使用 sendmsg() 从一个进程发送到另一个进程并使用 receivemsg() 接收,请参阅stackoverflow.com/questions/2358684/…。这并非特定于 UNIX 套接字。
    • @damjan 不,事实并非如此。您不能通过管道、UDP 套接字、TCP 套接字或除 unix 套接字之外的任何东西发送文件描述符。你可以试试,但是不行。
    【解决方案2】:

    使用 Unix 套接字而不是 TCP/IP 的开销更少,因为这基本上是一个字节流,没有额外的网络记录。请参阅wikipedia 了解更多信息。

    Unix 域连接显示为字节流,很像网络连接,但所有数据都保留在本地计算机中。 UNIX 域套接字使用文件系统作为地址名称空间,即它们被进程引用为文件系统中的 inode。这允许两个不同的进程打开同一个套接字以进行通信。但是,实际的通信(数据交换)并不使用文件系统,而是使用内核内存中的缓冲区。

    【讨论】:

      猜你喜欢
      • 2015-03-26
      • 2016-05-08
      • 2017-07-30
      • 2011-10-21
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 2011-07-25
      相关资源
      最近更新 更多