web-dev-qa-db-ja.com

ネットワークプログラミングにおけるストリームとデータグラムの違いは何ですか?

ソケット(ストリーム)とソケット(データグラム)の違いは何ですか?なぜ他のものを使用するのですか?

122
RoR

ずいぶん前に、この2つの違いを説明するための大きな類推を読みました。どこで読んだのか覚えていないので、残念ながら著者にそのアイデアを信用することはできませんが、とにかくコアの類推に自分の多くの知識を追加しました。だからここに行きます:

ストリームソケットは電話のようなものです。一方が電話をかけ、もう一方が応答し、お互いに挨拶(TCPのSYN/ACK)を行い、情報を交換します。完了したら、さようなら(TCPのFIN/ACK)と言います。一方が別れを聞いていない場合、彼らは通常、もう一方に電話をかけます。これは予期しないイベントだからです。通常、クライアントはサーバーに再接続します。データが送信した順序と異なる順序で到着しないという保証があり、データが破損しないという合理的な保証があります。

データグラムソケットは、クラスでメモを渡すようなものです。メモを渡す相手のすぐ隣にいない場合を考えてください。メモは人から人へと移動します。目的地に到達しない場合があり、到着するまでに変更される場合があります。同じ人に2つのメモを渡すと、意図しない順序で届くことがあります。メモが教室を通るルートが同じではない場合や、ある人が別の人ほど早くメモを渡すことができない場合など。

そのため、情報を順番どおりに保持することが重要な場合は、ストリームソケットを使用します。ここでは、ファイル転送プロトコルが良い例です。内容がランダムにシャッフルされて破損しているファイルをダウンロードしたくありません!

順序がタイムリーな配信よりも重要でない場合(VoIPまたはゲームプロトコルを考える)、ストリームのオーバーヘッドを大きくしたくない場合(これがDNSが主にデータグラムプロトコルであるため、データグラムソケットを使用します。多数の要求に一度に非常に迅速に応答します)、またはデータが宛先に到達してもあまり気にしない場合。

VoIP /ゲームのケースを拡張するために、そのようなプロトコルには独自のデータ順序付けメカニズムが含まれています。ただし、1つのパケットが破損または失われた場合、再送信要求を発行するためにストリームプロトコル(通常はTCP)を待つ必要はありません。迅速に回復する必要があります。 TCP回復には数分かかる場合があり、ゲームやVoIPなどのリアルタイムプロトコルの場合、3秒でも許容できない場合があります!UDPのようなデータグラムプロトコルを使用すると、ソフトウェアを回復できます失われたデータを単に無視するか、TCPよりも早くデータを再要求することにより、非常に迅速にイベントを実行できます。

VoIPは、失われたデータを単純に無視するのに適した候補です。一方の当事者は、携帯電話で誰かと受信状態が悪いときに話しているときと同様に、短いギャップを聞くだけです。ゲーミングプロトコルは多くの場合、少し複雑ですが、通常、失われたデータを無視する(その後に受信したデータが失われたデータを置き換える場合)、失われたデータを再要求する、または状態の完全な更新を要求するアクションが実行されますクライアントの状態がサーバーの状態と同期していることを確認してください。

288
cdhowie

ストリームソケット:

  • サーバーとクライアント間の専用およびエンドツーエンドのチャネル。
  • TCPプロトコルをデータ送信に使用します。
  • 信頼性とロスレス。
  • 同様の順序で送受信されるデータ。
  • 失われた/誤ったデータを回復するための長い時間

データグラムソケット:

  • サーバーとクライアント間の専用ではなく、エンドツーエンドのチャネル。
  • データ送信にUDPを使用します。
  • 100%の信頼性はなく、データを失う可能性があります。
  • データの送受信順序は同じではない場合があります。
  • 失われた/誤ったデータを気にかけたり、迅速に回復したりしないでください。
26

ネットワークプログラミングの場合は、ソケットから開始することをお勧めします。
socket = ip + port
3種類のソケットがあります
ストリーム(TCP、順序と配信の保証、重複なし、データの長さまたは文字境界なし、接続指向、信頼性、同時実行性)
datagram(UDP、パケットベース、コネクションレス、データグラムのサイズ制限、データが失われたり複製されたりする可能性があり、順序が保証されない、信頼できない)
raw(下位層プロトコルIP、ICMPへの直接アクセス)
[。
UDPには存在しないトランスポートプロトコルとしてTCPを使用したシーケンス番号チェックがあるため、信頼性は配信の信頼性に類似しています。あなたのソフトウェアはまさにそうです;紙上の理論の検証や、実際の作業との融合。

0
hakkican