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