1. ホーム
  2. sockets

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

2022-05-07 13:50:25

質問

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

どのように解決するのですか?

昔、この2つの違いを説明するための素晴らしい例えを読んだことがあります。 どこで読んだか覚えていないので、残念ながらそのアイデアの作者をクレジットすることはできませんが、とにかく核となる例えに私自身の知識もたくさん加えています。 それでは、どうぞ。

ストリームソケットは電話のようなもので、一方が電話をかけ、もう一方が応答し、お互いに挨拶をして(TCPではSYN/ACK)、情報を交換します。 それが終わると、さようならと言います(TCPのFIN/ACK)。 一方がさようならの言葉を聞かなかった場合、これは予期せぬ出来事であるため、通常は相手側に電話をかけ直します。通常はクライアントがサーバーに再接続します。 データが送信したのと違う順番で届くことはなく、データが破損することもないという合理的な保証があります。

データグラムソケットは、授業でノートを渡すようなものです。 ノートを渡す相手が真横にいない場合を考えてみてください。ノートは人から人へと移動します。 ノートは人から人へと移動し、目的地に到着しないかもしれないし、到着するまでに修正されるかもしれない。 同じ人に2つのノートを渡した場合、教室内を通るルートが同じとは限らないし、ある人はノートを渡すスピードが遅いなど、自分の意図しない順番でノートが届くかもしれないのです。

つまり、情報を順序立ててそのまま持っていることが重要な場合に、ストリームソケットを使うのです。 ファイル転送プロトコルはこの良い例です。 ファイル転送プロトコルはその良い例で、ファイルの中身が無秩序にシャッフルされて破損したままダウンロードされるのは嫌でしょう。

データグラムソケットを使うのは、タイムリーな配信よりも順序が重要でない場合(VoIPやゲームプロトコルを考えてください)、ストリームの高いオーバーヘッドを望まない場合(DNSが主にデータグラムプロトコルであるのはこのためで、サーバーが一度に多くのリクエストに素早く応答できるようにします)、またはデータが宛先に到達するかどうかをあまり気にしない場合です。

VoIP/ゲームのケースを拡大解釈すると、このようなプロトコルには、独自のデータ順序付けのメカニズムが含まれています。 しかし、あるパケットが破損したり失われたりした場合、ストリームプロトコル(通常はTCP)が再送信要求を出すのを待つのではなく、素早く回復する必要があります。 TCP は復旧に何分もかかることがありますし、ゲームや VoIP のようなリアルタイムプロトコルでは 3 秒でも受け入れられません! UDPのようなデータグラムプロトコルを使用すると、単に失われたデータを無視するか、TCPよりも早く再要求することによって、ソフトウェアはそのような事象から非常に迅速に回復することができます。

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