web-dev-qa-db-ja.com

TCPストリームvs UDPメッセージ

TCPはストリーム指向であり、データはバイトの連続ストリームとして転送されます。しかし、私を混乱させるのは、TCPはセグメントを作成し、これをIPに渡します。IPはパケットを作成し、セグメントをカプセル化して転送します。

一方、UDPはメッセージ指向です。アプリケーション層からメッセージを受信し、データグラムを作成してIPにプッシュダウンします。これまでのところ、TCPと同じですが、代わりにデータグラムが作成され、プッシュダウンされます。このプロトコルをメッセージ指向にするのはなぜですか?

26
Kuzey

これらのプロトコルのユーザー(プログラマー)に提供されるインターフェイス/ APIは次のとおりです。

[〜#〜] udp [〜#〜]

メッセージ指向では、1つのデータグラムを送信し、1つのデータグラムを受信する機能を提供するAPI(送信/受信など)があります。 1つのsend()呼び出しは1つのデータグラムを送信し、1つのrecv()呼び出しは正確に1つのデータグラムを受信します。

[〜#〜] tcp [〜#〜]

ストリーム指向では、バイトストリームを送受信できるAPI(送信/受信など)があります。メッセージ境界の保持はありません。TCPは、多くのsend()呼び出しからのデータを1つのセグメントにまとめることができます。または、1つのsend()呼び出しからのデータを多くのセグメントTCPの上にあるアプリケーションに対して透過的であり、recv()は単にデータを返すだけで、send()呼び出しがいくつ返されたデータを生成したかには関係ありません。

28
nos

TCPは接続指向のプロトコルです。つまり、最初に受信者への接続を設定し、次にIPパケットで運ばれるセグメント(トランスポート層のPDU)でデータを送信します。このように、転送中にデータストリームを最後まで保持するため、ストリームと呼ばれます。

UDPは、データグラムと呼ばれるデータ単位を持つコネクションレスのトランスポートプロトコル(IPと同様)です。したがって、tcpとは異なり、UDPは、データグラムメッセージを転送するためにIPレイヤーに送信するだけで、接続を設定せずにデータを転送します。

4
Farhood

TCPは、連続形式でデータをアセンブルできるため、ストリーム指向です。例えば。 1〜4000バイトのデータがありました。これはtcpセグメントに分割され、各セグメントにはシーケンス番号が付けられ、最初は1〜1200バイト、2番目は1201〜2400というようになります。

IPデータグラムを介して送信されている間、順序どおりに配信されない場合がありますが、ストリームとして表示されることにより、連続するデータにまとめられます。シーケンス番号は、パケットの並べ替えに役立ちます。

もう少し詳しく説明すると:

バイトストリームは、セグメントやその他の不規則性のない1つの大きなデータチャンクで構成されます。データグラム(より小さい)を使用すると、データチャンクが全体として一度に送受信されます。実際には、データグラムでは各送信/書き込み呼び出しが1つのパケットを送信し、各読み取り/受信呼び出しは1つのパケットを受信しますが、ストリームプロトコルではデータはどのようにでも送受信できます。例えば。送信者はsend()を10回呼び出すことができますが、受信者は1回のrecv呼び出しですべてのデータを受信します。データグラムでは、10の送信呼び出しは10のパケットと10の受信呼び出しを意味します

データグラムとストリーム

バイトストリーム

4
fayyazkl

ここで多くの混乱。はっきりさせてください。

TCP/IPは、ストリーム指向、パケットおよび接続指向のプロトコルです。 [〜#〜] udp [〜#〜]は単なるパケット指向のプロトコルです。最初に接続を確立しません。

Javaプログラムを使用して、クライアント側でJava.net.SocketクラスとJava.net.ServerSocketを呼び出して、アプリケーションのネットワークに接続しているとしましょうサーバー側。接続が確立されると、データ送信が開始されます。問題は、TCPを選択した場合、ストリーム(Codataまたは無限ストリーム)またはパケットで送信されるデータですか?答えは、TCPメソッドによって受信されたデータはストリームですが、TCPは下位ラベルスタックを送信する前にストリームをパケットに変換します。基本的に、上記のアプリケーション層は、ストリーム内のデータをTCP層に送信し、TCPをネットワーク層へのパケットに分割し、パケットをストリーミングしながら受信します。アプリケーションJavaはストリームのみを理解できるため、サーバー(受信)側。パケットを失う余裕がないため、UDPよりもTCPを介したファイル送信が優先されます。

一方、UDPはパケット指向プロトコルであり、Java class Java.net.DatagramPacket;などのアプリケーションが使用されます。 Java.net.DatagramPacket; import Java.net.DatagramsSocketは、UDPと通信する前に最初にパケットを作成し、パケットはUDP/IPプロトコルによって追加情報とともにサーバー側に送信されます。基になるプロトコルがUDPの場合、一部のアプリケーションはデータをストリームとして提示する場合があります。ただし、これはUDPの上に追加のプロトコルを階層化したものであり、UDPプロトコル自体に固有のものではありません。パケットの損失を心配していないため、TVのライブストラミングは一般的にUDPです。

2
Siva

TCP)の専門は、この動作がユーザーまたはアプリに対して透過的であることです。

アプリが行う必要があるのは、データを送受信するためにsend()およびrecv()を呼び出すことだけです。

以下のレイヤーは、データが送信された順序で正確に受信され、「欠落している」場合に欠落データが再送信されるようにします。

UDP、OTOHは、複数のIPパケットに分割された場合でも、1つのsend()呼び出しのデータをまとめて保持します。このように、これらのデータは1つのデータグラムとして見ることができます。

2
glglgl