web-dev-qa-db-ja.com

Unixドメインソケットとネットワークソケットの違いは?

私は正しいですか

  • 2つのプロセスがネットワークソケットによって通信する場合、各プロセスはソケットを作成し(各ソケットは1つのプロセスに属します)、プロセスはそれらのソケットによって通信します。

  • 2つのプロセスがUnixドメインソケットで通信する場合、1つのソケットのみが作成され(どのプロセスにも属していません)、両方のプロセスが同じソケットに接続しますか?

3
Tim

ここで2つのことを混同しています。

ソケットは、プログラムに与えられるファイル記述子(ハンドル)であり、ファイルを使用するのとほぼ同じ方法でネットワーク接続を使用できます。ソケットAPIはプロトコルに依存しません。ソケットは、IPv4接続またはIPv6接続用に作成できますが、(カーネルサポートがあれば)DECnet、AppleTalk、または読み取りイーサネットなど用にも作成できます。

ソケットAPIはかなり使いやすいですが、実際のネットワークプロトコルを使用して同じマシン上のプロセスと通信するのはかなり非効率的であるため、ある時点でUNIXドメインソケットが作成され、その非効率性なしにソケットAPIを使用できるようになりました。また、いくつかの追加機能を追加します。たとえば、UNIXドメインソケットを介してファイル記述子を別のプロセスに渡すことができます。

UNIXドメインソケットを使用する場合でも、両方のプロセスが接続の両側に1つずつソケットを保持します。ソケットの使用法は、初期接続設定を除けば、たとえばIPv4ソケットと同じです。

ソケットAPIなしでは実行できないことの1つは、アドレスです。話すアドレスを渡さずにソケットを作成することはできません。これはUNIXドメインソケットでも同じです。とにかくすべてがファイルであるUNIXなので、これらのアドレスをファイル名のように見せることにしました。そして、すでにそれを行っているので、これらのアドレスをファイルシステムに表示することは理にかなっています。そうすることで、それらを簡単に見つけることができるからです。

残念ながら、ファイルシステムでこれらのものに付けられた名前はまた 'UNIXドメインソケット'(または少なくとも、人々がそれらを呼び始めたものです)でした。ただし、ソケットAPIの意味では実際のソケットではありません。それらは単なる数字であるため、そうすることはできませんでした。そのため、IPv4ソケットの対応するものはその番号ではなく、代わりに、話しているピアのIPアドレスとポート番号です。

ときどき、ソケットAPIはファイルを直接処理しないため、これらのファイルシステム表現は厳密には必要ないことを付け加えておきます。実際、Linuxには「匿名のUNIXドメインソケット」という概念があります。これはまさに次のとおりです。ファイルシステムにリンクのないUNIXドメインソケット...

7
Wouter Verhelst