回答:
昔、私は両者の違いを説明するための素晴らしいアナロジーを読みました。どこで読んだか覚えていないので、残念ながら作者の功績は認められませんが、とにかく自分の知識の多くをコアのアナロジーに追加しました。だからここに行く:
ストリームソケットは電話のようなものです。一方が電話をかけ、もう一方が応答し、お互いに挨拶(TCPではSYN / ACK)してから、情報を交換します。完了したら、さようなら(TCPのFIN / ACK)と言います。これは予期しないイベントであるため、一方の側でさようならが聞こえない場合、通常は他方の側にコールバックします。通常、クライアントはサーバーに再接続します。データが送信した順序と異なる順序で到着しないことが保証されており、データが破損しないことが合理的に保証されています。
データグラムソケットは、クラスでメモを渡すようなものです。メモを渡す相手のすぐ隣にいない場合を考えてみましょう。メモは人から人へ移動します。宛先に到達しない場合があり、到達するまでに変更される場合があります。2人のノートを同じ人に渡すと、それらが意図しない順序で到着する可能性があります。これは、ノートが教室を通過する経路が同じでない場合があり、1人の人が別の人ほど速くノートを渡すことができないなどです。 。
そのため、情報が整然としていて完全な状態であることが重要な場合は、ストリームソケットを使用します。ファイル転送プロトコルは、ここでの良い例です。内容がランダムにシャッフルされて破損しているファイルをダウンロードしたくない!
順序がタイムリーな配信よりも重要ではない場合(VoIPまたはゲームプロトコルと考えてください)、ストリームのオーバーヘッドを大きくしたくない場合は、データグラムソケットを使用します(これがDNSが主にデータグラムプロトコルであり、サーバーが多くの、多くの要求に一度に非常に迅速に応答する)、またはデータが宛先に到達してもあまり気にしない場合。
VoIP /ゲームのケースを拡張するために、そのようなプロトコルには独自のデータ順序付けメカニズムが含まれています。ただし、1つのパケットが損傷または損失した場合、ストリームプロトコル(通常はTCP)で再送信リクエストを発行するのを待つ必要はありません。すばやく回復する必要があります。TCPは回復に数分かかる場合があり、ゲームやVoIPなどのリアルタイムプロトコルの場合、3秒でも許容できない場合があります。UDPのようなデータグラムプロトコルを使用すると、失われたデータを無視するか、TCPよりも早く再要求するだけで、ソフトウェアはこのようなイベントから非常に迅速に回復できます。
VoIPは、失われたデータを単に無視するのに適した候補です。一方の当事者は、受信が悪いときに携帯電話で誰かと話しているときと同じように、短いギャップを聞くだけです。多くの場合、ゲームプロトコルは少し複雑ですが、実行されるアクションは通常、欠落したデータを無視する(後で受信したデータが失われたデータに取って代わる場合)、欠落したデータを再要求する、または完全な状態の更新を要求することです。クライアントの状態がサーバーの状態と同期していることを確認してください。
ストリームソケット:
データグラムソケット:
もしそれがネットワークプログラミングなら、ソケットから始めるのが良いスタートだと思います。
ソケット= ip +ポート
ソケット
ストリームには3つのタイプがあります(TCP、順序と配信が保証され、重複なし、データの長さまたは文字境界なし、接続指向、信頼性、同時実行)
データグラム(UDP、パケットベース、コネクションレス、データグラムサイズ制限、データが失われたり重複したりする可能性、順序は保証されない、信頼性がない)
raw(下位層プロトコルIP、ICMPへの直接アクセス)
どのソケットがどのトランスポートプロトコルを使用する必要があるかについて、トランスポートプロトコルタイプに関する厳密な規則が見当たらない両端がアクティブな場合にUDPが実現可能であるため、信頼性を間違えないでください。
信頼性とは、UDPには存在しないトランスポートプロトコルとしてTCPを使用したシーケンス番号チェックがあるため、配信の信頼性に似ています。wiresharktcpdumpなどのネットワークプロトコルアナライザーを使用して、ソフトウェアの正確な動作を確認することをお勧めします。ある種の検証や理論と、あなたの作品の動作との融合。