2009-12-03 9 views
5

私は、mysqlが通常のTCP/IPソケットの代わりにUnixソケット(/ tmp/mysql.sock)をデフォルトで使用する理由を理解しようとしています。TCP/IP経由のUnixソケットをmysqlで使用する正当な理由はありますか?

127.0.0.1だけで安全です(ソケットファイルは世界的に書き込み可能なので、Unixアカウントベースの保護を得られません)ので、セキュリティのようには見えません。

確かに、すべてのオペレーティングシステムは高性能のTCP/IPに依存しているので、UNIXソケットよりも大幅に遅くなることはありません.Linuxはネットワークトラフィックに対しても何らかのゼロコピートリックを実行するので、必ずループバック。

ここに、Unixソケットを使用する正当な理由があるのですか、それとも奇妙な歴史的事故ですか?

+0

これはserverfaultに属します。 – monksy

答えて

6

TCP/IPの代わりにUnixソケットを使用する際のオーバーヘッドは少なくなります。これは、基本的に余分なネットワークの簿記がないバイトストリームであるためです。もう少し詳しくは、wikipediaを参照してください。

UNIXドメイン接続はネットワーク接続と同様にバイトストリームとして表示されますが、すべてのデータはローカルコンピュータ内に残ります。 UNIXドメインソケットは、ファイルシステムをアドレス空間として使用します。つまり、プロセスによってファイルシステムのinodeとして参照されます。これにより、2つの異なるプロセスが通信するために同じソケットを開くことができます。しかし、実際の通信(データ交換)はファイルシステムを使用せず、カーネルメモリにバッファリングします。

8

ローカルホストを経由するときにIPスタック全体をヒットしないうちに、依然として大きな部分がヒットします。 UNIXソケットは基本的に単方向のパイプです。より速くて軽いです。

UNIXソケットでは、ファイアウォールルールを管理せずにアクセスを制御することもできます。アクセスはファイルシステムのアクセス許可で行うことができます。

UNIXソケットの1つの機能は、ファイルディスクリプタをあるプロセスから別のプロセスに渡すことです。

+0

sendmsg()を使用して1つのプロセスから別のプロセスにファイルディスクリプタを送信し、receivemsg()を使用して受信できます。http://stackoverflow.com/questions/2358684/can-i-share-a-file-descriptor-to- Linux上でもう1つのプロセスを実行するか、またはそれらのプロセスをローカルからtにします。これはUNIXソケットに固有のものではありません。 – damjan

+0

@damjanいいえ、そうではありません。パイプ、UDPソケット、TCPソケット、またはUNIXソケット以外のものでファイル記述子を送ることはできません。試してみることもできますが、うまくいかないでしょう。 – nos

関連する問題