ソケットを介してメッセージを転送する際に、メッセージの順序が正確であることを確認するにはどうすればよいですか? 従うべき特定の設計はありますか?いくつかの方法を提案してください...
2 に答える
TCP ソケットの場合、ドロップされたパケットなどのサポートが TCP スタックに自動的に組み込まれます。パケットが再送信されると、ドロップされたパケットが短いブリップを引き起こす可能性があることに注意することを除いて、何もする必要はありません。これは常に起こります: 誰も気づきません (switch などを書く人を除いて)。
完全に切断された接続を処理しようとしている場合: それはプロトコルによって異なります。メッセージごとにリクエスト/レスポンスを行う場合は簡単ですが、多くのレイテンシ オーバーヘッドが発生します。一部のプロトコルは、要求/応答に関して完全に独立して動作します (要求を送信するたびに応答を停止するのではなく、要求を送信し続けるだけで、将来のある時点で応答が返されます)。そのセットアップでは、それを回避するように設計する必要があります。おそらく、最後の既知の応答までですが、それは、応答なしで処理された可能性があることを意味します。したがって、すべてのアクションを安全に繰り返し実行できるようにしたい場合があります。これにより、送信したものの完了したかどうかわからない場合に再度発行できます。
UDP を使用している場合、答えは「完全にあなたです。それはあなたの問題です。それを理解する必要があります」となります。これは通常、各パケットにシーケンス番号を埋め込むことを意味します。もちろん、UDP を使用している場合は、ドロップされたパケットを単純に許可し、近いうちに再同期するように設計している可能性があります。
TCP は、送信された順序でデータを配信します。UDP はそうではありません。非常にまれですが、TCP が失敗するエラーが発生した場合は、最初からやり直す必要があります。UDP は配信を保証しないため、その上にプロトコルを追加して、再送信を要求し、シーケンスを適用する必要があります。TCP を使用するか、独自のシーケンス チェックを行います。