Kademlia Distributed Hash Tableは、信頼できないにもかかわらず、そのネットワークトランスポートプロトコルとしてUDPを使用するのはなぜですか?なぜKademliaはUDPを使用していますか?
答えて
主な理由は、以前に連絡をとったことのない多くのノードを迅速に照会し、ルックアップ中に再び表示されないことがあるということです。
Kademliaルックアップは反復的です。つまり、リクエストは転送されません。フォワーディングDHTは、長期にわたるTCP接続により適しています。
I.e.トラフィックの大きな塊は、潜在的に数百万に及ぶネットワークのノード間の要求と応答の短命の交換からなる。数千のTCP接続を迅速に確立するためのオーバーヘッドは非常に大きなものになります。
なぜUDPですか?なぜなら、シンプルで、効果的で、低コストのプロトコルです。パッケージの配送を保証するものではなく、一定の接続を確立する必要はありません。これらの機能はすべて、複数の受信者への高速データ配信に適しています。それだけでP2Pアプリケーションに必要なすべてです。
Kademliaのの設計仕様書からСitation:
Kademliaののデザイナーを考慮に代わりUDPまたは複数のIPアドレスを持つKademliaのノードの可能性のIPv6アドレスやTCP/IPの使用をとっているように見えません。
私はこの製品を使用していないことを認めなければなりませんが、これを調べると私はこれに答えることができます。
最終的に一貫性のあるシステムのようです。それはまた、高性能システムと思われる。これを考えると、udpはうまくいくでしょう。 tcpのようなハンドシェイクはありませんので速いです。また、是正措置もあり、プロトコルの可能性のある破損が処理されます。
私たちのバージョンのKademlia(OpenKad)は、TCPまたはUDPのいずれかを使用できます。
Kademliaは高度なルーティングプロトコルであり、両方のトランスポートレベルプロトコルで同じように動作します。 Kademliaデプロイメントでのルックアップ時間は、パケットやタイムアウトの失敗による障害のため、あまり良くありません。だから、パフォーマンスは最善の答えではありません。
これは多くの議論をもたらす可能性が高いとわかっていますが、UDPは特に信頼性が高くないように設計されておらず、信頼性の高い機能が不足しています。 UDPやTCPのルック・アンド・フィール(look and feel)は非常によく似ていますが、実際には比較できません。 TCPはほとんどのトランスポート関連の問題を処理するように設計されています。ここでは、UDPはポートヘッダーとチェックサムを基礎IPパケットに付加するだけです。
もちろん、両方のプロトコルを構築して拡張することができます。 UDPを拡張するのは通常ではなく、という正しい解決策です。なぜなら、TCPは一般的にネットワーク上で必要なすべてを処理するからですが、TCPの接続モデルがあまりにも制限されている場合がほとんどです。 TCPは基本的に2つのエンドポイント間で排他的な1対1のパイプをエミュレートするように設計されているため、p2p接続ではこれが当てはまります.p2p接続では一般的に全般的に多くの性質があります。
長いストーリーを短くするには、UDPに「信頼性」を追加するか、オールトゥオールのTCP実装を作成することで、この時点で「ホイールを再構築」することになります。
あなたの疑問に答えるために(私がなぜKademliaのUDPであるのか)、なぜUDPに(TCPを使用しない)理由が実際に説明されているとは思わないので、私の推測によれば、著者は、UDP上に構築することは、TCPを、それが特に設計されていない方向に伸ばそうとするよりも、柔軟性を増すという意見であった。言い換えれば、実用的にどのような形の機能も欠いているlibに追加することで、別のものの既存の機能を回避したり伸ばしたりすることができます。
- 1. なぜUDPサーバはスレッドを使用する必要はありませんか?
- 2. ErlangでオーバーラップUDPをサポートしないのはなぜですか?
- 3. C++ UDP。 recvfrom()がブロックしていないのはなぜですか?
- 4. mDNS(Bonjour、Avahiなど)がUDPを使用するのはなぜですか?
- 5. なぜmongoDBはobjectIDを使用していますか?
- 6. なぜvbulletinはENUMを使用していますか?
- 7. DajaxiceとDajaxはなぜMEDIAL_URLを使用していますか?
- 8. なぜrep movbはデータセグメントを使用していますか?
- 9. シングルトンパターンを使用していないのはなぜですか?
- 10. Javaを使用してUDPパケットを送受信しますか?
- 11. UDPを使ってackを実装していますか?
- 12. なぜ匿名型を使用し、GroupByにはない明示的な型を使用していますか?
- 13. udpまたはtcpパケットをGoogleトークで使用しますか?
- 14. 「アドレスは既に使用中です」:私はUDPを誤解しています
- 15. なぜ誰もlatin1を使用していますか?
- 16. iPhone dev - なぜ8MBを使用していますか?
- 17. なぜtq_structを使用していますか?
- 18. なぜ1/2 == 0がdoubleを使用していますか?
- 19. なぜNSLockを使用していないのですか?
- 20. UDPソケットを使用するときにlisten()関数呼び出しが不要なのはなぜですか?
- 21. なぜResponse.ClearHeaders()を使用しますか?
- 22. なぜオートリリースプールを使用しますか?
- 23. なぜTaskStackBuilderを使用しますか?
- 24. なぜsqlcommandbuilderを使用しますか?
- 25. なぜmysqli_close()を使用しますか?
- 26. なぜメンバレスインターフェイスを使用しますか?
- 27. なぜIntent.createChooser()を使用しますか?
- 28. なぜSpringのソースコードはリンクリストをあまり使用していますか
- 29. UDPを使用しているとルーターが応答しなくなる
- 30. ソケットを使用してWindows7ではUDPブロードキャストを受信するのにXPでは重複しないパケットが表示されるのはなぜですか?