70

この質問は、STREAM タイプと DATAGRAM タイプの INTERNET ソケットの違いに関するものではありません。STREAM ソケットは TCP を使用し、データグラム ソケットは UDP を使用し、すべての TCP、UDP のもの、順番に到着するパケット、ACK、NACK などを使用することを知っています。インターネット上でこれらの重要性を理解しています。

Q1) ローカル ソケットである UNIX ドメイン ソケットを作成する場合、ソケットが STREAM ソケットであるか DATAGRAM ソケットであるかはどのように関係しますか? このタイプのソケットはデータをソケット ファイルに書き込みますが、ネットワーク経由でデータを送信していないため、この場合プロトコルは問題になりますか? この場合、UNIX ベースの DATAGRAM ソケットを使用すると、データが失われる可能性はありますか?

Q2) UNIX DATAGRAM ソケットは、UNIX STREAM ソケットよりも優れたパフォーマンスを提供しますか?

Q3) アプリケーションで STREAM/DATAGRAM UNIX ベースのソケットを決定する方法は?


ありがとう

4

4 に答える 4

81

マニュアルページにあるように、Unixソケットは常に信頼できます。SOCK_STREAMとの違いSOCK_DGRAMは、ソケットからデータを消費するセマンティクスにあります。

ストリームソケットでは、任意のバイト数を読み取ることができますが、バイトシーケンスは保持されます。つまり、送信者は4Kのデータをソケットに書き込み、受信者はそのデータをバイト単位で消費できます。逆もまた真です。送信者は、受信者が1回の読み取りで消費できるいくつかの小さなメッセージをソケットに書き込むことができます。ストリームソケットはメッセージ境界を保持しません。

一方、データグラムソケットは、これらの境界を保持します。送信者による1回の書き込みは、受信者による1回の読み取りに常に対応します(受信者のバッファがそのメッセージに与えられた、read(2)またはrecv(2)そのメッセージよりも小さい場合でも)。

したがって、アプリケーションプロトコルに、メッセージサイズの上限がわかっている小さなメッセージがある場合はSOCK_DGRAM、管理が簡単であるため、使用したほうがよいでしょう。

プロトコルが任意の長いメッセージペイロードを必要とする場合、または構造化されていないストリーム(生のオーディオなど)である場合SOCK_STREAMは、必要なバッファリングを選択して実行します。

どちらのタイプもローカルのカーネル内メモリを通過するだけで、バッファ管理だけが異なるため、パフォーマンスは同じである必要があります。

于 2012-12-19T14:31:16.930 に答える
28

主な違いは、一方が接続ベース( STREAM) で、もう一方が接続なし( DGRAM) であることです。通常、ストリームとパケット指向の通信の違いはそれほど重要ではありません。

SOCK_STREAMそれでもすべての接続処理、つまりlisten/を取得し、接続acceptが反対側で閉じられているかどうかを知ることができます。

まだ接続指向ですが、メッセージ境界を保持するソケット タイプもあることに注意してくださいSEQPACKET(これにより、ソケットの上にメッセージ指向のレイヤーを実装する必要がなくなる場合がありSTREAMます)。

これらすべてのタイプでデータ転送のパフォーマンスは似ていると思いますが、主な違いは、必要なセマンティクスです。

于 2012-12-19T15:59:41.490 に答える
2
  1. 考えられる違いの1つは、メッセージの境界です。データグラムは全体として配信され、データグラムは自然なメッセージ境界になります。ストリームソケットを使用すると、Nバイトを読み取ることができ、Nバイトの準備ができるまでソケットはブロックされます。しかし、これは明確なメッセージ境界がないことを意味します。

  2. 速度が懸念事項である場合、すべてが平等であり、手段と手段です。(ストリームソケットのみが組み込みの信頼性の高い順序どおりのトランスポートを提供し、データグラムソケットのみを使用して複数の受信者に送信できることをすでにご存知だと思います)。

于 2012-12-19T14:30:23.040 に答える
0

クライアントとサーバーが常に同じマシン上にあり、最小の遅延と最大の帯域幅を実現することが目標である場合は、共有メモリを使用します。

于 2012-12-20T05:51:38.550 に答える