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


131

ソケット(ストリーム)とソケット(データグラム)の違いは何ですか?なぜどちらを使うのか?

回答:


304

昔、私は両者の違いを説明するための素晴らしいアナロジーを読みました。どこで読んだか覚えていないので、残念ながら作者の功績は認められませんが、とにかく自分の知識の多くをコアのアナロジーに追加しました。だからここに行く:

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

データグラムソケットは、クラスでメモを渡すようなものです。メモを渡す相手のすぐ隣にいない場合を考えてみましょう。メモは人から人へ移動します。宛先に到達しない場合があり、到達するまでに変更される場合があります。2人のノートを同じ人に渡すと、それらが意図しない順序で到着する可能性があります。これは、ノートが教室を通過する経路が同じでない場合があり、1人の人が別の人ほど速くノートを渡すことができないなどです。 。

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

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

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

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


3
SYNACKのディテールを含めるのに最適です。
LazerSharks 2014

2
この例または非常によく似た例は、Linuxプログラミングインターフェースのものです。2010年版は、ページ1155と1159にこれらの例が含まれています
ジョシュ

30

ストリームソケット:

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

データグラムソケット:

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

データは同じ順序で送信されていませんか(単なる「類似」ではない)?すなわち。それは、ストリームソケットにパケット順序メカニズムを構築する意味がありません
マシューD. Scholefield

ストリーム通信のパケットは、パケット自体が受信ホストに順番に配信されることが保証されていないという意味で「類似した」順序で送受信されますが、TCPは不一致を計算し、到着時にパケットを再配置して何かを要求します。途中で道に迷ってしまったようです。
アレハンドロブラスコ

それは理にかなっている。多分それから違いとしてそれを取り除いて下に置きます(私がそれを正しく理解しているので、パケットが送信される順序だけを参照するとき、どちらの場合もデータが送受信される順序は異なるかもしれません同じ)。
マシューD.スコールフィールド

@Rickより正確には、トランスポートプロトコルは1つまたは複数のネットワークエンドポイントにメッセージを配信する責任があるため、ソケットはエンドツーエンドポイントと呼ばれます。
アレハンドロブラスコ

0

もしそれがネットワークプログラミングなら、ソケットから始めるのが良いスタートだと思います。
ソケット= ip +ポート
ソケット
ストリームには3つのタイプがあります(TCP、順序と配信が保証され、重複なし、データの長さまたは文字境界なし、接続指向、信頼性、同時実行)
データグラム(UDP、パケットベース、コネクションレス、データグラムサイズ制限、データが失われたり重複したりする可能性、順序は保証されない、信頼性がない)
raw(下位層プロトコルIP、ICMPへの直接アクセス)
どのソケットがどのトランスポートプロトコルを使用する必要があるかについて、トランスポートプロトコルタイプに関する厳密な規則が見当たらない両端がアクティブな場合にUDPが実現可能であるため、信頼性を間違えないでください。
信頼性とは、UDPには存在しないトランスポートプロトコルとしてTCPを使用したシーケンス番号チェックがあるため、配信の信頼性に似ています。wiresharktcpdumpなどのネットワークプロトコルアナライザーを使用して、ソフトウェアの正確な動作を確認することをお勧めします。ある種の検証や理論と、あなたの作品の動作との融合。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.