主线 DHT 节点为 get_peers 查询发送的 udp 数据包的最大大小是多少?节点存储 3000 个对等点时如何响应?(在这种情况下,数据包非常大)。主线 DHT 客户端如何处理它的响应?
先感谢您。
主线 DHT 节点为 get_peers 查询发送的 udp 数据包的最大大小是多少?节点存储 3000 个对等点时如何响应?(在这种情况下,数据包非常大)。主线 DHT 客户端如何处理它的响应?
先感谢您。
就像任何 bittorrent 跟踪器一样,响应不必包含每个对等点,只是一个随机选择。
最受欢迎的客户端(我真的只能代表 uT、BTML 和 libtorrent-rasterbar)有一个他们试图不超过的假定 MTU 大小。假定的 MTU 大小低于1500字节(这是典型的最大以太网帧大小),这通常也是您在 Internet 上看到的路径 MTU 的上限。从中减少几十个字节通常是一个好主意,以覆盖通过 PPPoE 和其他类似传输运行的连接。
在通过 IPv6 发送数据包时,如果通过 Teredo(1280 字节)发送数据包,则需要注意使用更低的 MTU,尽管我提到的这些客户端都不支持基于 IPv6 的 DHT。
准确地说,uTorrent 假设 MTU 为 1500 - 20 字节的 IP 标头 - 8 字节的 UDP 标头 - 24 字节的潜在GRE 标头- 8 字节用于潜在的PPPoE 标头- 2 字节用于潜在的MPPE 标头。即1438字节的 UDP 有效负载。
即使您的数据包超过路径 MTU,IP 层也会将它们分段并在端点合并它们,对 bittorrent 客户端透明。
对于 IPv6 DHT,已定义 1024 字节的上限,请参阅http://bittorrent.org/beps/bep_0032.html
至于值列表(返回的对等点),节点应该只返回一个适合数据包大小的随机子集,而不是完整列表。
请注意,IPv6 不支持途中分段。因此,如果想要发送更大的数据包,那么发送方要么必须保守地对数据包进行分段(这会降低可靠性),要么实施套接字错误处理并在用户空间重新发送,因为 UDP 套接字不会自动执行此操作,这与 TCP 不同。为避免这些复杂性和低效率,最好只压缩数据包中的可变大小数据,直到它适合规定的大小。