web-dev-qa-db-ja.com

UNIXドメインSTREAMとDATAGRAMソケットの違いは?

この質問は ない STREAMタイプとDATAGRAMタイプのインターネットソケットの違いについて。 STREAMソケットはTCPを使用し、DatagramソケットはUDPを使用し、すべてのTCP、UDPスタッフ、順番に到着するパケット、ACK、NACKなどを使用することを知っています。インターネット上のこれらの重要性を理解しています。

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

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

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


ありがとう

53
Manik Sidana

manual page がUnixソケットは常に信頼できると言っているように。 _SOCK_STREAM_と_SOCK_DGRAM_の違いは、ソケットからデータを消費するセマンティクスにあります。

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

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

そのため、アプリケーションプロトコルにメッセージサイズの上限がわかっている小さなメッセージがある場合は、_SOCK_DGRAM_を使用するほうが管理が容易になるため、より適しています。

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

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

59

主な違いは、1つは接続ベースSTREAM)で、もう1つは接続なしDGRAM)-の違いです通常、ストリームおよびパケット指向の通信はそれほど重要ではありません。

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

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

データ転送のパフォーマンスは、これらすべてのタイプでほぼ同じになると予想されますが、主な違いは、必要なセマンティクスだけです。

17
cmeerw
  1. 考えられる違いの1つは、メッセージの境界です。データグラムは全体として配信され、データグラムは自然なメッセージ境界になります。ストリームソケットを使用すると、Nバイトを読み取ることができ、ソケットはNバイトの準備ができるまでブロックされます。しかし、これは明らかなメッセージ境界がないことを意味します。
  2. 多分。 TCPのあるストリームソケットは、接続を確立するために少なくとも最初の3ウェイハンドシェイクが必要です。UDPソケットは必要ありません。
  3. 速度が問題である場合は、すべてのものが同じであること、機器および測定。 (TCPストリームソケットは組み込みの信頼性の高い順序付きトランスポートを提供し、データグラムソケットのみが複数受信者への送信に使用できることを既に知っていると仮定します)。
3
Jens

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

0
Arun Taylor