66618


[Wikipedia](https://ja.wikipedia.org/wiki/UNIX%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88)には、

> 内部実装  
>  LinuxにおけるUNIXドメインソケットは、バッファ（メモリ）への書き込みと読み込みという非常にシンプルな仕組みで実装されている。
>
> Linuxカーネルのlinux/net/unix/af_unix.c(GitHub
> mirror)に実装される。SOCK_STREAMの場合、カーネル内部ではソケットバッファへのメッセージコピー・peerがもつsk_receive_queueのtail、受信側のsk_data_ready呼び出し、を繰り返すことでデータを転送する。
>
>
> UNIXドメインソケットは単一マシン上のIPCが前提である。ゆえにTCPのようなプロトコルスイートは不要であり、プロトコルの重層が生むデータの入れ子構造を持たない。またネットワークに由来するパケットロスや到達順序保証の対応も必要ないため、バッファread/writeというシンプルな仕組みで実装されている。結果として高効率なIPCが可能となっている。

とありますが、再送や到達順序保証などTCPの一般的なそれが無いならば、SOCK_STREAMとSOCK_DGRAMの違いは何になりますか？


CC BY-SA 4.0
2020-05-13T02:27:28.177
66552
2020-05-15T01:55:02.680
2020-06-17T08:14:45.997
-1
37013
question
linux socket
AF_UNIXにおける、SOCK_STREAMとSOCK_DGRAMの違いはなんですか？


> 再送や到達順序保証などTCPの一般的なそれが無いならば、SOCK_STREAMとSOCK_DGRAMの違いは何になりますか？

ユーザプログラム側から見える通信路の挙動（セマンティクス）が異なります。

  * `SOCK_STREAM`：ストリーム指向。送受信ソケットは連続的なバイトデータとして扱うため、上位プロトコルを用いてメッセージ区切りを表現する必要があります。
  * `SOCK_DGRAM`：データグラム指向。送受信ソケットは一定の塊(データグラム)単位で扱うため、データ区切りを直接観測できます。

[BSDソケット](https://ja.wikipedia.org/wiki/%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88_\(BSD\))では「ユーザプログラムから見える通信路の振る舞い」と「実際の通信プロトコル」を分離しています。一般的なIPベースプロトコル(`AF_INET`など)では、`SOCK_STREAM`
を TCP で実現し、`SOCK_DGRAM` を UDP
で実現しています。UNIXドメインソケット(`AF_UNIX`)は下位レイヤをIPC(プロセス間通信)で実現しつつ、`SOCK_STREAM` と
`SOCK_DGRAM` の振る舞いをユーザプログラム側に提供しています。


CC BY-SA 4.0
2020-05-15T01:47:28.387
66618
2020-05-15T01:55:02.680
2020-05-15T01:55:02.680
49
49
66552
answer