2009-12-03 30 views
5

我试图弄清楚为什么mysql默认使用Unix套接字(/tmp/mysql.sock),而不是普通的TCP/IP套接字。是否有任何合法的理由通过TCP/IP与MySQL使用Unix套接字?

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

当然,所有的操作系​​统都依赖高性能的TCP/IP,以至于它不能比Unix套接字慢得多 - 即使对于网络流量,Linux也会执行各种零复制技巧,所以它肯定必须快速地进行环回。

那么,有没有在这里使用Unix套接字任何正当的理由,还是仅仅是一些奇怪的历史事件?

+0

这属于serverfault。 – monksy 2009-12-03 08:04:53

回答

6

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

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

8

虽然在通过本地主机时没有击中整个IP堆栈,但您仍然会遇到很大一部分问题。 unix套接字本质上只是一个双向管道。它更快,更轻。

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

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

+0

任何文件描述符都可以使用sendmsg()从一个进程发送到另一个进程,并使用receivemsg()接收,请参阅http://stackoverflow.com/questions/2358684/can-i-share-a-file-descriptor-to-另外,上处理的Linux或-是,他们本地到吨。这不是特定于UNIX套接字。 – damjan 2015-10-27 16:33:14

+0

@damjan不,事实并非如此。您不能通过管道,UDP套接字或TCP套接字发送文件描述符,也不能发送除unix套接字以外的任何文件描述符。你可以尝试,但它不会起作用。 – nos 2015-10-27 18:04:59