5

udpを信頼できるものにする方法については、インターネット上にいくつかの記事があります。私はc#で1つを見つけることができませんでした。だから多分私は自分のアルゴリズムを実装することができます。

インターネットでの調査から、udpには2つの問題があると思います。


  1. すべてのデータが宛先に到達することを保証するものではありません。
  2. データは別の順序で宛先に到達する可能性があります
  3. 多分それを信頼できるようにするために私が見逃している3番目の問題があります

udpの信頼性を高めたい理由と、代わりにtcpを使用しない理由を知りたい場合は、この質問をご覧ください。私を信じてください、私は長い間tcpパンチホールをしようとしていました。

とにかく、これを可能にするc#で使用できるライブラリがすでにあるかもしれません。ライブラリを見つけることができたので、次のアルゴリズムについて考えていました。


"コンピューターAとコンピューターBがあり、コンピューターAがコンピューターBにファイルを送信していると想像してください。";

これが私が考えていたステップです:


1)コンピュータAが読み取り用にファイルを開き、5000バイトであるとしましょう。つまり、コンピュータAは5000バイトをコンピュータBに送信して、バイトが失われないようにし、正しい順序で送信する必要があることを意味します。


2)コンピュータAはファイルの最初の500バイトを取得し、それらのバイトのハッシュを取得します。したがって、コンピュータAには、これらの500バイトのハッシュとバイトの2つのハッシュがあります。(ハッシュは、データが正しい順序で受信されたことを確認するためのmd5などの効率的なアルゴリズムになります。つまり、md5(1,2,3)!= md5(2,1,3))


3)最初の500バイトのハッシュをイメージングすると、kj82lkdi930fi1になります。


4)コンピュータBはハッシュとバイトをリッスンする必要があります。


5)コンピューターAはコンピューターBにハッシュを送信し、500バイトも送信します。送信するとすぐに、応答を待ち始めます。


6)コンピュータBはハッシュとバイトを受信するはずです。コンピュータbは、受信したバイトに対して同じアルゴリズムmd5を実行します。その結果が受信したハッシュと等しい場合は、{1,1,1,1,1,1}でAに応答します。それ以外の場合は、{2,2,2,2,2,2,2}で応答します。


6.5)コンピュータBが正しい順序でデータを取得したため、{1,1,1,1,1、}と応答し、ハッシュコードもメモリまたは配列に保存するとします。


7)コンピュータAは、次の500バイトを送信するために応答を待機する必要があります。{1,1,1}を受け取ったとしましょう。1を受信したため、続行して次の500バイトをそれらの500バイトの新しいハッシュコードで送信できることがわかります。


8)コンピュータAは、ハッシュコードとともに次の500バイトを送信します。


9)コンピューターBがデータを受信しなかったため、Aに応答しないとしましょう。コンピューターBは引き続きバイトとハッシュを待機します。


8)コンピュータAが妥当な時間1,1,1,1,1、または2,2,2,2,2を受信して​​いないため、Aは同じバイトを送信し、1秒間再度ハッシュします。時間。


9)コンピュータBがハッシュとバイトを受信したが、バイトが別の順序で受信されたと仮定します。コンピューターBがそれらのバイトのハッシュを計算すると、そのハッシュは受信したハッシュと一致しません。その結果、{2,2,2,2,2,2}で返信されます


10)コンピュータAが2,2,2,2,2,2を受信すると、同じバイトとハッシュを送信します。何らかの理由で2,2,2,2,2を受信しなかった場合は、一定期間後に同じバイトとハッシュを送信します。コンピューターAが2,2,2,2,2を受信したふりをしましょう


11)コンピュータAは同じバイトとハッシュを3回送信します。


12)コンピュータBは正しい順序でハッシュとバイトを受信します。その結果、1,1,1,1,1,1と応答し、その前のハッシュをメモリに保存します。(ステップ6.5を思い出してください)


13)コンピュータAがBから1,1,1,1応答を受信しなかったふりをします。その後、同じバイトを4回送信します。


14)コンピューターBはハッシュをチェックし、それが受け入れられた最後のハッシュと等しい場合、それらのバイトをファイルに書き込まずに1,1,1,1を再度応答します。


15)アルゴリズムは、ファイルが転送されるまでそのように続行されます。


つまり、転送が完了したときにコンピューターBに通知するなど、このアルゴリズムに追加する必要のあるものが他にもあることは明らかです。たぶんもっとエラーをチェックしています。コンピュータAが長時間切断された場合はどうなりますか。しかし、メインプロトコルは私が説明したもののようなものになります。

では、このアルゴリズムの実装を開始する必要があると思いますか?毎回バイトを増やして送信する必要があります。500ではなく1000を送信するという意味ですか?インターネット上にはいくつかのテクニックについて説明している記事がたくさんありますが、必要な言語の実用的な例を示している記事はほとんどありません。この場合、c#でこれが必要です。

4

1 に答える 1

2

3 つ目の問題は、受信時にデータが破損する可能性があることです。

TCP RFCを読んで、TCP が通信の信頼性を高める方法を理解することから始めることができます。その知識があれば、トランスポートとして UDP を使用してその技術のいくつかを実装できます。

また、この UDP ネットワーク ライブラリhttp://code.google.com/p/lidgren-network-gen3/もご覧ください。

于 2011-10-20T07:13:01.617 に答える