bittorrent - 为什么 BitTorrent 一次只传输 16KB 的片段子集?

标签 bittorrent

查看 BitTorrent 协议(protocol),我发现对于请求消息,虽然长度字段为 4 个字节长,但最大允许值(通常)为 2^16。这是为什么?

如此小的传输大小似乎增加了很多复杂性(必须处理请求队列并从 16KB block 中构建片段)。 我看到的一个好处是它使应用程序能够控制速率限制(通过阻塞和解除阻塞)。这对于证明增加的复杂性是否合理如此重要?

最佳答案

bittorrent 协议(protocol)是一个消息流,包括控制消息。较大的 block 大小会增加控制消息的延迟,以至于它们所传达的信息在收到时就已过时(超时)。

在缓慢的互联网连接上(例如 ADSL 上的 128kbit 上传或两个绑定(bind)的 ISDN channel ),假设没有其他东西正在使用该连接,对于单个 16KiB block 来说,这已经花费了整整一秒的时间 - 这种假设在现实中并不成立。

请注意,http/2 还使用 16KiB 的初始帧大小来复用流。

This small transfer size seems to add a lot of complexity (having to handle a queue of requests and build up the piece out of the 16KB blocks).

无论如何,这些东西都是必要的。

如果单个源很慢或者它是一个高优先级片段,则需要子片段请求才能从多个源一次获取大片段的 block 。

需要队列才能始终处理请求。幼稚的请求-接收-请求周期意味着存在远程不发送数据的空闲时间。

关于bittorrent - 为什么 BitTorrent 一次只传输 16KB 的片段子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42378623/

相关文章:

c++ - 适用于 C++、Windows 的 Torrent 库

javascript - 使用 Node.JS 下载 Torrent

java - 用 Java 创建一个 Torrent 客户端?

python - BitTorrent 跟踪器 API 不错吗?

Flash 洪流客户端

c - 在c中将6字节IP/端口字符串解析为in_addr结构

c# - 创建对象的新实例,还是修改现有实例?

ruby 洪流库

Python BitTorrent 库

algorithm - Bittorrent Rarest First 算法 - 如何选择片段?