91531
同一マシンで動作するプロセス間通信にソケットを使うとき、AF_UNIXとAF_INETに機能や性能の大きな差はないと考え、システム内のプロセス間通信にもAF_INETを使うことが多いです。  
これまでトラブルはなかったのですが、もし問題になるような違いがあれば知っておきたく、質問をする次第です。
CC BY-SA 4.0
2020-05-15T05:35:07.253
66624
2022-10-10T16:11:36.643
2022-10-10T16:11:36.643
3060
35558
question
linux socket
Linuxシステム内のソケット通信で、AF_UNIXとAF_INETの機能や性能に、どんな違いがありますか？
`AF_INET`はIPv4＋ポート番号で識別します。ですので、通信相手はIPv4が必要です。対して`AF_UNIX`はファイル名で識別します。ですので通信相手は同一マシン上で動作するプロセスとなります。（例えばXサーバーとXクライアントなど）  
両者は全く別物です。
CC BY-SA 4.0
2020-05-15T05:46:31.097
66625
2020-05-15T05:46:31.097
4236
66624
answer
ローカルマシン内での通信 という意味ではどちらも似たようなものだけど, (それなり)異なります。

#### パフォーマンス

`AF_INET`の `localhost`はループバックインターフェイスを介した通信であり, IPヘッダーや TCPヘッダーなど付加され
そのためのデータコピーも発生, セグメンテーションも行われ なんなら輻輳制御まで行われる, はずです。  
UDPの場合(必要に応じて)フラグメンテーションが行われるでしょう。

ループバックだからといってどこかの処理がバイパスされるなどは(普通は)ない。

それに対し UNIXドメインソケットは それぞれの OS用の (本来の) IPCであり, 速度と信頼性が高いものです。

#### 問題になるような違い

問題になるかどうかは 対策してるかどうかにも依るけれど UDPでは違いがでる可能性が高いかも

基本的に TCP/IP ＆ Ethernetでは, 通信相手の状況を見ることなく送りっぱなし,
受け手は自分のノードに関係あるなら受信するといったところ。特に UDP 及び IP はそういったプロトコルです。

  * パケットが到達する保証がない
  * (ネットワークに複数の経路がある場合などに) パケットの順序の保証がない

やたらと大量にデータ送信を行った場合など, 送信側・受信側 ともにパケットを廃棄する可能性があります。ルーターの輻輳でパケットが廃棄されるように
ループバックでも送信バッファーあふれなどで。受信についても処理が追いつかなければ捨てることに。

(TCPでは, 各種状況のやり取りが行われ **比較的** ロストすることは少ないはず。失われても再送するし)

(参考)ロストの例:
[https://ja.stackoverflow.com/questions/24265/udpによるデータ送信のパケットロスを減らす方法について](https://ja.stackoverflow.com/questions/24265/udp%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E9%80%81%E4%BF%A1%E3%81%AE%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E3%83%AD%E3%82%B9%E3%82%92%E6%B8%9B%E3%82%89%E3%81%99%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

UNIXドメインソケットでは, 受信側が忙しいようなら(読み取らなければ)  
送信側のブロッキングが行われ (アプリも気付かないうちに渋滞緩和され) 取りこぼすことはないはず

* * *

ちなみに (質問の)Linux環境での [UNIX ドメインソケット](https://linuxjm.osdn.jp/html/LDP_man-
pages/man7/unix.7.html)では 3種類のアドレスが区別される

  * pathname (パス名)付き
  * unnamed (名前なし)
  * abstract (抽象) (抽象ソケット)

(それぞれ性能に違いはあるかどうかは不明)
CC BY-SA 4.0
2022-10-10T12:08:58.663
91531
2022-10-10T12:08:58.663
43025
66624
answer