質問

私のプログラムがネットワーク(UDP)を介して1000バイトを送信するとしましょう。レシーバーが1つの「バッチ」で1000バイトを受信することを保証していますか?または、おそらく彼はいくつかの「読み取り」を実行する必要があります。彼がメッセージ全体を受け取るまで?後者が当てはまる場合、同じメッセージのパケットの順序が「混同」されないようにするにはどうすればよいですか? (順番に)、またはプロトコルがそれを保証するのか?
編集:つまり、メッセージが複数のパケットに分割される可能性はありますか? (10000MBのメッセージを送信しようとした場合、どうなりますか?)

役に立ちましたか?

解決

すべてを取得するか、何も取得しません。

ただし、パケットが送信された順序で一度だけ正確に受信されるという特定の保証はありません。パケットの損失、並べ替え、および(あまり頻繁ではないが)複製はすべて可能です。

最大フレームサイズ(65,507バイト)があり、大きなサイズのパケットを送信するとエラーが返されます。

1回の呼び出しでフレーム全体を受信するのに十分なバッファーを提供する必要があります。

UDPパケットは複数のIPフラグメントにフラグメント化できますが、OSは不完全なパケットをドロップします。したがって、これはアプリケーションに対して透過的です。

他のヒント

受信者は、1回の呼び出しでパケット全体を取得します。パケットの長さは、理論

でも制限されています。
  

長さ       全体の長さをバイト単位で指定する16ビットフィールド   データグラム:ヘッダーとデータ。最小値の   長さは8バイトです。   ヘッダーの長さ。フィールドサイズ   65,535の理論上の制限を設定します   バイト(8バイトのヘッダー+ 65527バイトの   データ)UDPデータグラム用。の   データ長の実際的な制限   根底にある   IPv4プロトコルは65,507バイトです。

ただし、実際の制限ははるかに低く、通常は512バイトと想定しても安全です。 セーフUDPパケットサイズの最大値をご覧ください。インターネット

UDPを使用して送信されるデータは、パケットにグループ化されるため、xバイト数。受信者がパケットを受信した場合、受信するバイト数はxです。

ただし、パケットが届かない場合や、順不同で届く場合があります。

UDPは、TCPとは異なり、信頼できるプロトコルではありません。パケットが適切な順序で到着すること、またはまったく到着することを保証する組み込みのメカニズムを提供しません。ただし、送信/受信ルーチンはロックステップ方式で作成できます。パケットを送信するたびに、送信者はACKの受信を待ってから再送信する必要があります。指定されたタイムアウトの後にACKが受信されない場合、パケットを再送信する必要があります。これにより、パケットが正しい順序で受信されるようになります。 (詳細については、この戦略を使用する TFTPプロトコルのRFC をご覧ください。 。)

最後に、可能であれば、代わりにTCPの使用を検討することもできます。

UDP Lite を使用すると、部分的に破損したパケットの受信をリクエストできます。これは、ビデオおよびVoIPサービスに役立ちます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top