3

为什么Kademlia 分布式哈希表使用 UDP 作为其网络传输协议,即使它不可靠?

4

5 回答 5

11

主要原因是您快速查询了许多以前从未建立联系的节点,并且在查找期间可能永远不会再看到。

Kademlia 查找是迭代的,即不会转发请求。转发 DHT 将更适合长期存在的 TCP 连接。

即,流量的很大一部分包括可能在数百万范围内的网络节点之间的请求和响应的短暂交换。快速建立数千个 TCP 连接的开销将令人望而却步。

于 2012-04-28T10:58:21.720 回答
5

为什么是 UDP?因为,它是简单、有效和低成本的协议。它不保证包裹的交付,也不需要建立恒定的连接。所有这些特性使 UDP 适合快速向多个接收者传送数据。这就是 P2P 应用程序所需的全部内容。

来自 Kademlia 设计规范的引用:

Kademlia 的设计者似乎没有考虑到使用 IPv6 地址或 TCP/IP 而不是 UDP 或 Kademlia 节点具有多个 IP 地址的可能性。

于 2012-04-21T01:42:09.697 回答
3

我必须承认我没有使用过这个产品,但是研究它让我觉得我可以回答这个问题。

它似乎是一个最终连贯的系统。它似乎也是一个高性能系统。鉴于此,udp 将起作用。没有像 tcp 那样的握手,所以它很快。还有一个更正机制,以便处理协议可能的损坏。

于 2012-04-21T01:47:51.530 回答
2

我们的 Kademlia (OpenKad) 版本可以使用 TCP 或 UDP。

Kademlia 是一种高级路由协议,因此与两种传输级协议的工作方式相同。由于失败丢弃数据包和超时,Kademlia 部署中的查找时间不是那么好。所以性能并不是最好的答案。

于 2014-05-13T10:27:36.143 回答
0

我知道这可能会引起很多争论,但 UDP 并不是专门设计为不可靠的,它只是缺少使其可靠的功能。从更高层次的角度看(如套接字编程)UDP 和 TCP 看起来和感觉非常相似,但实际上没有可比性。TCP 旨在开箱即用地处理大多数与传输相关的问题,其中 UDP 仅将端口标头和检查项附加到底层 IP 数据包,这几乎是它作为协议的全部范围。

自然地,您能够构建和扩展这两种协议。扩展 UDP 通常不是正确的解决方案,因为 TCP 通常会处理您在网络中所需的一切,但少数例外之一是 TCP 的连接模型过于受限。在 p2p 网络中就是这种情况,因为 TCP 旨在基本上模拟两个端点之间的专有一对一管道,其中 p2p 连接通常共享更多的全对全性质。

长话短说,此时您将通过向 UDP 添加“可靠性”或创建一个全面的 TCP 实现来“重建轮子”。

要回答您的问题的实质(为什么在 Kademlia 中使用 UDP),我认为规范实际上并没有解释为什么要使用 UDP(或不使用 TCP),因此我认为没有权威的答案,但我的猜测是作者现在/曾经认为,建立在 UDP 之上会比试图将 TCP 扩展到它不是专门为之设计的方向而增加更多的灵活性。换句话说,添加到几乎没有任何形式的功能的库上,VS 解决和/或扩展另一个现有功能。

于 2014-12-27T04:07:23.823 回答