「UNIX ドメインソケット」と「ソケット」について理解出来てなかったので簡単ですがメモ。
違っている部分があればご指摘頂けますと幸いです。
まとめ
- UNIX ドメインソケットもソケットもいずれもプロセス間のデータのやり取りを行うための手法の一つ
- UNIX ドメインソケットではプロセス間通信にファイルシステムを利用する(拡張子 .sock という場合が多い)その為、 同じホストでのプロセス間通信 として利用される
- ソケット通信は 異なるホスト で TCP や UDP を使ってプロセス間のやり取りが可能
そもそも UNIX ドメインソケットとソケットはどんな時に使う?
いずれもプロセス間のデータのやり取りを行う仕組みの一つである。
プロセス間通信(IPC、英: interprocess communication)はコンピュータの動作において、複数プロセス(の複数スレッド)間でデータをやりとりする仕組み。通信プロセスは、同一コンピュータ内で帰結するローカル、ネットワーク接続された別のコンピュータと相互にリモート、などのほかに多様な観点で分類され、スレッド間の通信帯域幅とレイテンシや扱うデータの種類も多種多様である
今回は取り扱わないが「パイプ」もプロセス間通信(IPC interprocess communication)の一つ。
UNIX ドメインソケットって何?
UNIXドメインソケット(英: UNIX domain socket)や IPCソケット とは、単一のオペレーティングシステム内で実行されるプロセス間でデータを交換するためのデータ通信の終点
UNIXドメインソケットは、アドレス・名前空間としてファイルシステムを使用している。これらは、ファイルシステム内のinodeとしてプロセスから参照される。これは、2つのプロセスが通信するために、同じソケットを開くことができる。しかし、コミュニケーションは、完全にオペレーティングシステムのカーネル内で発生する
自分の経験だと同じホストで nginx から php-fpm に対して UNIX ドメインソケットで連携するというのをやったことがある。
検索してみると nginx の記事も見つかった。
UNIX ドメインソケットによるプロセス間通信ではファイルシステムを利用し、上記例では「/var/run/php-fpm.sock」を利用して nginx プロセスと php-fpm プロセスの通信を行っている。
上記要件がある為、通信をするプロセス同士は基本的に同じホストである必要があると思われる。(NFS とか使った時にどうなるとかは不明ですが。。。)
ソケットって何?
BSDソケットは、ホスト間の通信や1つのコンピュータ上のプロセス間の通信を可能とする
ソケットは ホスト間の通信 が出来る事が大きな違いとして挙げられる。
以前、以下を参考に Python を使って異なるホスト間でのソケット通信も確認済み
- Python3 で実行
-
bind
は「0.0.0.0」に変更 -
connect
は server.py が動作する PrivateIP を指定