8


3

我々は、UDPを介して通信を実行するシステム(Cで構築された)を持っています。 最近、パケットの配信を保証する必要があることがわかりました。 私の質問は:ackパケットを使った配送を確実にするためのUDPベースのシステムへの最低限の追加は何だろうか? また、理想的にはパケットヘッダーを操作する必要はありません。 私たちはシーケンス番号とack / nackフラグを含むパケットをアプリケーションレベルで制御します。 これが喪失の原因であるのかどうか、私たちがやろうとしていることは基本的に欠陥のある壊れたバージョンのTCPになるのだろうかと私は思っています。 基本的に、私達が保証された配達を達成するためにすることができる最小の改良があります(私たちは輻輳制御などのようなTCPの多くの機能を必要としません)。 ありがとうございます。

5 Answer


9


TCPは、関連がある可能性がある3つのサービスを絡み合わせます(大丈夫TCPはもっと多くのことをしますが、私は3つだけ話します)。

  1. 順序どおりの配達

  2. 信頼できる配達

  3. フロー制御

あなたはフロー制御を必要としないと言っただけなので、私はそれについても触れません(ウィンドウサイズなどの宣伝方法など)。 あなたはおそらくウィンドウが必要になるだろうことを除いて、まあ、それ以外は。 私はそれにたどり着きます。)

信頼できる配達が必要だとあなたは言ったのです。 それほど難しいことではありません - 送信者がパケットを受信したことを示すためにACKを使用します。 基本的な信頼できる配信は次のようになります。

  1. 送信者がパケットを送信する

  2. 受信者はパケットを受信し、それからACKを送信します

  3. 送信者が(タイマーによって)確認応答を受け取らない場合、彼はパケットを再送信します。

これらの3つのステップはこれらの問題に対処しません:

  1. ACKが紛失した場合はどうなりますか?

  2. パケットが順不同で到着した場合はどうなりますか?

だからあなたのアプリケーションのために、あなたは信頼できる配信だけが必要だと言いました - しかし、それらを順番に必要とすることについては何も言いませんでした。 これはプロトコルの実装方法に影響します。

(順序が関係ない場合の例:あるコンピュータから別のコンピュータに従業員レコードをコピーしているのです。 両方がそこに着く限り、アリスの記録がボブの前に受け取られるかどうかは関係ありません。)

それで、あなたは信頼できるものだけを必要としていると仮定して(あなたの投稿であなたが言ったことなので)、あなたはこれをいくつかの方法で達成することができます。

送信者は未確認パケットを追跡できます。 したがって、#3、4、5、および6を送信し、3と4のACKを受信しない場合、送信者は再送信が必要であることを認識しています。 (送信者はパケット3と4がたくさんあったかどうか、またはそれらのACKが失われたかどうかを知りませんが。 どちらにしても、再送信する必要があります。)

しかし、それからあなたの送信者は累積ACKをすることができます - それで上記の例では、それが3、4、および5を受信した場合それは#6を確認応答するだけです。 これは、以前に受信したことがなければ、受信側はパケット6を_ドロップすることを意味します。 あなたのネットワークが非常に信頼できるものであれば、これは悪い選択肢ではないかもしれません。

しかし、上記のプロトコルにはウィンドウがあります。つまり、送信者が一度に送信するパケット数はいくつですか。 つまり、フロー制御の目的ではなく、何らかのウィンドウ処理が必要です。 ウィンドウサイズをどのように送信しますか。

ウィンドウサイズを一定にするか、stop-and-waitのようにすることで、ウィンドウなしでそれを実行できます。 前者がより良い選択肢かもしれません。

とにかく、私はあなたの質問に直接答えていません、しかし、私がこれを設計するときに考慮する価値があることのいくつかを指摘したことを願っています。 フロー制御の一部(ウィンドウ処理など)を行わずに、順序を気にせずに「信頼できる転送」を行うという作業は困難です。 (私がこのことのいくつかについてもっと詳細を述べるべきかどうか私に知らせてください!)

がんばろう!


5


Stevenの UNIXネットワークプログラミング、第1巻の第8章と第20章をご覧ください。 彼は多くの異なるアプローチをカバーしています。 20.5項「UDPアプリケーションへの信頼性の追加」はおそらくあなたにとって最も興味深いものです。


4


https://stackoverflow.com/questions/107668/what-do-you-use-when-you-need-reliable-udp[here]を実行している質問があります。信頼できるUDP "#:。 答えはおそらくあなたが望むまたは必要以上に大きいですが、あなたはUDP上に構築されたプロトコルのいくつかを見て、あなたが必要とするACK部分だけをつかむことができるかもしれません。

ENetプロトコル(信頼性のあるUDPプロトコル)に関する私の仕事から、それぞれのUDPデータグラムにシーケンス番号、あなたが受け取ったデータグラムに対するACKを送る方法、あなたが持っているデータグラムを保持する方法が必要だと思います。あなたは彼らのためにACKを受け取るか、彼らがタイムアウトになるまで、そしてあなたがまだACKを受信して​​いないデータグラムの再送を計時する方法を送りました…​ また、特定のデータグラムを配信する予定がないと判断した場合の全体的なタイムアウトも追加します。また、配信に失敗したことを通知するために、アプリケーション層にコールバックを送信します。


0


難しい問題 私は言うだろう、あなたはTCPの信頼性を達成することができないでしょう。 しかし、私は時々、あなたは信頼できるUDPを持つ必要があることを理解しています。

http://www.gamedev.net/community/forums/topic.asp?topic_id=46637[Gamedevフォーラム]
http://www.javvin.com/protocolRUDP.html[RUDP](もう少しハードコア)

信頼できるUDPについての古いスレッド]


0


ackを実装するための最良の方法は、アプリケーション層でそれを行うことです。 CoAPは、UDP上で動作するが信頼性の高いデータ転送を提供するアプリケーションプロトコルの一例です。 それは全ての確認可能(CON)メッセージに対するメッセージIDを保持し、受信機に同じメッセージIDを有する確認パケットを送信する。 すべてのACKおよびメッセージIDフィールドは、アプリケーション層部分に保持されます。 したがって、送信者が自分から送信されたメッセージIDを含むAckパケットを受信しなかった場合は、そのパケットを再送信します。 アプリケーション開発者は、信頼できるデータ転送に必要なニーズに合わせてプロトコルを変更できます。