この質問は ない 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ベースのソケットを決定する方法は?
ありがとう
manual page がUnixソケットは常に信頼できると言っているように。 _SOCK_STREAM
_と_SOCK_DGRAM
_の違いは、ソケットからデータを消費するセマンティクスにあります。
ストリームソケットでは、任意のバイト数を読み取ることができますが、バイトシーケンスは保持されます。言い換えると、送信者は4Kのデータをソケットに書き込み、受信者はそのデータをバイト単位で消費できます。他の方法も当てはまります。送信者は、受信者が1回の読み取りで消費できるいくつかの小さなメッセージをソケットに書き込むことができます。ストリームソケットはメッセージの境界を保持しません。
一方、データグラムソケットはこれらの境界を保持します-送信者による1回の書き込みは常に受信者による1回の読み取りに対応します(受信者のバッファが read(2)
または- recv(2)
はそのメッセージよりも小さい)。
そのため、アプリケーションプロトコルにメッセージサイズの上限がわかっている小さなメッセージがある場合は、_SOCK_DGRAM
_を使用するほうが管理が容易になるため、より適しています。
プロトコルが任意の長いメッセージペイロードを呼び出す場合、または単なる構造化されていないストリーム(生のオーディオなど)の場合は、_SOCK_STREAM
_を選択して必要なバッファリングを行います。
両方のタイプがローカルのカーネル内メモリを通過するだけで、バッファー管理が異なるため、パフォーマンスは同じである必要があります。
主な違いは、1つは接続ベース(STREAM
)で、もう1つは接続なし(DGRAM
)-の違いです通常、ストリームおよびパケット指向の通信はそれほど重要ではありません。
SOCK_STREAM
あなたはまだすべての接続処理、つまりlisten
/accept
を取得し、接続が反対側で閉じられているかどうかを知ることができます。
接続指向のままであるSEQPACKET
ソケットタイプもありますが、メッセージの境界は保持されることに注意してください(STREAM
ソケットの上にメッセージ指向レイヤーを実装する手間を省くかもしれません)。
データ転送のパフォーマンスは、これらすべてのタイプでほぼ同じになると予想されますが、主な違いは、必要なセマンティクスだけです。
クライアントとサーバーが常に同じマシン上にあり、目標が最小の遅延と最大の帯域幅を持つことである場合、共有メモリを使用します。