java &&中的Bittorrent实现需要一些关于swarm行为的信息

pul*_*988 18 java sockets bittorrent

我正在用Java开发一个bitTorrent客户端.我知道网上有很多图书馆,但我无能为力; 我想要自己的.无论如何,我注意到一些奇怪的行为,也许你们知道我缺少的东西:

  • 我正在尝试连接的所有对等体中大约80%导致连接失败(socketTimeOut或者"无法连接"错误).显然,从跟踪器接收对等体列表.我还通过尝试ping它们来随机测试一些IP; ping通常是成功的.
  • 当我连接时:
    • HandShake后连接断开50%,
    • 在30%我注意到一个奇怪的行为:我收到Handshake,我收到BitField(他们有所有的碎片),我被+20轰炸消息(我检查了他们已经在BitField中提到的那个片段的索引),然后他们放下了连接,这很奇怪.

(对于所有统计数据,数字并不准确.)

一些BitTorrent问题:

更新#4:由于考虑到答案,我切断了一些问题

  • 这是'80%失败的连接率问题': 我的80%未能连接费率的原因是什么?这不是坏运气,因为我试图连接的每个客户都没有我的空间.我正在听6881,但也测试了其他端口.昨天我取得了巨大的成功,接受了一堆连接(相同的代码,过去几周的一些变化),片段消息开始流动..所以我的代码并非完全没用.

  • 在关闭之前,torrent客户端是否会向跟踪器发送最后一条消息,event=stopped使其使用对等信息更新其内部数据库,以便它不会作为响应发送包含无用对等信息的列表?或者只是他们应该......因为它似乎真的让我收到死去的同龄人.

  • 收到的同行的顺序是否重要?也许完成百分比..或者真的是随机的.
  • 此外,我偶尔会收到一个端口为0的对等体,这使得我的Socket构造函数抛出异常.端口0是什么意思?我可以在任何端口上联系它吗?
  • 我的PeerId(我发送握手或向跟踪器宣布我的自我)会影响我尝试通信的torrent客户端是否会继续启动连接?这意味着如果我撒谎并说使用'-AZ2060-'作为我的身份证明我是Azureus客户?
  • 这是'可用性吓跑同行问题': 我的作品是否会吓跑同行?我正在尝试连接,我发送一个空的位域(我没有碎片[length: 1][Id = 5][payload: {}]); 似乎他们发送了bitfield,我发送了bitfield ..(有些发送像疯了一样有消息),他们意识到我很穷,他们放弃了我.握手后有些掉线连接.(太粗鲁了.)
  • 有没有使用经典端口间隔的好处:6881 - 6889?
  • 这是'不良同行问题列表': torrent客户端内部是否存在坏对等列表(如黑名单)?有时在找到一个好的同伴之后,我在我的测试中不断使用它的信息,但只接受了1/3连接.有时需要10分钟才能成功连接.

更新#1:似乎与μTorrent客户端的连接表现为上述模式(BITFIELD,HAVE轰击,紧密连接).我在本地测试了一堆bitTorrent客户端(μTorrent,BitTorrent,Vuze,BitCommet,Deluge),并且只在μTorrent上发现了这种模式.在其他人,沟通很好(HS,BITFIELD,UNCHOCE和快乐分享).现在,这个μTorrent可能是最流行的bitTorrent客户端(6/8连接开始是μTorrent),所以......任何想法?

更新#2:在保持"bad list,"它看起来确实如此(这实际上是有道理的).例如,使用μTorrent,我注意到以下无连接间隔(30秒,1分钟,1分30秒,2分钟......).通过"无连接"意味着,在先前的连接结束之后,x几秒钟没有接受新的连接.

更新#3:有消息轰炸可能是所谓的"懒惰的位域"(做了几个测试,在HAVE中提到的每个部分都不存在于BITFIELD中).我看到μTorrent和BitTorrent使用这种方法.

另一个结论是:有些客户在尊重BitTorrent规范方面更具限制性,如果违反规则将关闭连接.例如:我注意到BitTorrent和BitTornado,如果你发送一个bitfield消息但没有碎片他们会关闭连接(没有碎片=空位域..但规格说"它是可选的,如果客户端没有碎片则无需发送"),如果你发送任何类型的消息之前发送UNCHOKE消息(甚至没有兴趣),其他人会关闭连接.

更新#4: 因为我最初对第一个问题感兴趣(可能是因为我的80%连接速率失败的原因是什么?...被激起的问题可能更受欢迎),这里有一些解释为什么有时连接是不成功的:

1)如果我在停止前一个连接后立即开始与对等体的连接(通过停止 - 我的意思是关闭套接字):另一边的对等体直到下一次读/写才知道.

详细信息: - 我注意到了很多次,这在完成下载后更加明显..如果我关闭连接,那么直到它尝试发送新的KEEP_ALIVE(~2分钟)才会意识到这一点.但是如果我在交换REQUEST-PIECE时关闭,对等体会很快意识到.在关闭连接后的第一个场景中,我仍然存在于uTorrent对等选项卡中.如果我查看记录器选项卡,大约2分钟后,它会意识到我已经离开了.

2)似乎uTorrent看到我的BITFIELD消息被破坏了(显然应该在接收后关闭连接)(这不会发生总是..我也检查并重新检查,msg没问题和其他BT客户端没有这样的问题) .

详细信息: - 如果我查看uTorrent记录器选项卡,它会在我发送位域后显示"Disconnected:Bad packet" - 我打算尝试执行lazzy bitfield,也许我可以逃避这个(我也看到了大多数BT客户这样做)

3)(超过可能链接到#1)当uTorrent不允许我重新连接时,我在logger选项卡中看到:"Disconnect:已经有相同的连接(丢弃额外连接)"..目前我选择随机本地端口当启动一个新的连接时(看到这个在大多数BT客户端中实现),但这并没有欺骗它,他仍然看到我的同伴已经存在于他的"对等列表"中(可能是ip匹配).. Buuut:在30%的测试中,相同的情况,它确实允许我重新连接:) ..我还没有解释为什么

4)还有一件事:在你关闭uTorrent中的一个洪流之后,看起来'接触者的关注'仍然存在(通过我的意思是:右键单击+停止).这意味着我仍然可以启动连接,发送HANDSHAKE ..在此之后,我断开连接(它没有HANDSHAKE回来).uTorrent记录器中的消息:"Disconnect:No such torrent:80FF40A75A3B907C0869B798781D97938CE146AE",这个长字符串是我的信息哈希..在与其他BT客户端一起测试时看到了这一点.

更多信息:

  • uTorrent类型全上传/部分上传和完全下载的场景是成功的,部分下载的场景不是那么多......可能是由于#2
  • 我仍然使用uTorrent,bitField +有轰击+关闭连接..因为我记得在记录器选项卡中显示相同的消息"断开连​​接:坏包"..可能是由于#2
  • 除了uTorrent之外,我已经测试过:BitTorrent,BitTornado,BitCommet,qBitTorrent,FlashGet(通讯还可以)和Vuze,FrostWire,Shareaza(和这些家伙一起,非常好).
  • 并非所有客户的行为都相同.例如:FlashGet&uTorrent(&BitCommet?)在你发送有趣的东西之前不要取消选择..而其他人似乎在BITFIELD之后正好解开..在这个意义上我正在计划以某种方式对待客户不同(我认为这是必要的) ..可能从bitfield猜测他们的名字(只有2个命名约定)并从那里开始..我已经实现了一些东西,这就是我知道我连接到uTorrent类型的客户端的方式..

G.Y*_*G.Y 1

好吧,我有一个答案给你,但我必须警告你,我自己从来没有写过 Bit-Torrent 客户端,有些答案可能不是 100% 准确,我写的所有内容都是来自我对 Bit-Torrent 的全球看法的理解工作。因此,如果我浪费了您的时间,我深表歉意,但我仍然认为您可以从我的回答中了解您所问问题的核心。

\n\n

\xe2\x80\xa2我的连接失败率80%可能是什么原因?

\n\n

用一种线性解释来解释非常复杂,但是:\n- 位洪流意识形态是一报四报.. 如果你不给予/拥有一报,你就不会得到报..\n除非你刚刚开始下载在这种情况下,您可能会得到一笔“捐赠”...\n或者另一边是专用的播种机...在这种情况下,他可能会检查您是给予者还是只是接受者...或者目前许多人下载这个...或者(填写你的想法..)\n所以,你会看到有很多,实际上非常智能的机制来确保群体可以敏捷和高效,而其中一些最可以追溯到你的机器其中甚至无法真正被您的机器监控,更不用说在其控制下。

\n\n

\xe2\x80\xa2Do torrent 客户端在关闭之前,使用 event=stopped 向跟踪器发送最后一条消息,以使其使用对等点信息更新其内部数据库,以便它不会发送无用对等点的列表作为响应信息?或者只是他们应该......因为看起来我真的收到了死去的同伴。

\n\n
    \n
  • 这取决于客户端代码 - 有些可能会这样做,有些则不会..(继续阅读)
  • \n
\n\n

\xe2\x80\xa2 接收到的对等点的顺序重要吗?也许完成百分比..或者真的是随机的。

\n\n
    \n
  • 这取决于服务器代码 - 有些可能会这样做,有些则不会..(继续阅读)
  • \n
\n\n

好吧,请注意这两个(继续阅读)注释。您应该记住,在 P2P 网络中,没有权力严格绑定客户端甚至服务器来严格遵守协议,即使协议规定了一些应该遵守的内容完成 - 这并不意味着每个客户都会实施它或在它或错过它时采取相同的行动。

\n\n

\xe2\x80\xa2此外,我时不时地收到一个端口为 0 的对等点,这使我的 Socket 构造函数抛出异常。端口0是什么意思?我可以通过任何端口联系它吗?

\n\n
    \n
  • 端口 0 是一种通配符,如果您连接到它 - 它会自动将您连接到下一个可用端口。(有人说下一个可用端口高于 1023 - 但我从未测试过)
  • \n
\n\n

\xe2\x80\xa2我的 PeerId(我在握手中发送或向跟踪器宣布自己)是否会影响我尝试通信的 torrent 客户端是否会继续已启动的连接?这意味着如果我撒谎并使用“-AZ2060-”作为 ID 说我是 Azureus 客户端会怎样?

\n\n

它会认为您是 Azureus,如果其他 Azureuses 根据此促进与 Azureuses 的连接(如果有的话那就很大了)您将从中受益。

\n\n

\xe2\x80\xa2我的作品可用性会吓跑同行吗?我正在尝试连接,并且发送一个空位字段(我没有片段,[长度:1][Id = 5][有效负载:{}]);似乎他们发送位字段,我发送位字段..(有些发送疯狂的消息),他们意识到我很穷,他们放弃了我..握手后有些放弃连接。(太粗鲁了。)

\n\n
    \n
  • 可能的..
  • \n
\n\n

\xe2\x80\xa2不使用经典端口间隔:6881 - 6889 有好处吗?

\n\n
    \n
  • 我不这么认为 - 除了可能会让你的 ISP 感到困惑..
  • \n
\n\n

\xe2\x80\xa2 种子客户端是否在内部保留不良对等点列表(如黑名单)?有时,在找到一个不错的对等方后,我在测试中不断使用其信息,但只有 1/3 连接被接受。有时需要 10 分钟才能再次成功连接。

\n\n
    \n
  • 取决于客户端代码。
  • \n
\n\n

概括

\n\n

这是一个丛林 - 每个人都可以编写自己的逻辑,只要他发送正确的协议命令 - 你的问题集中在客户端的逻辑行为,但没有你现在可能理解的共同点,这也是Bit-Torrent 的魅力可能也是其成功的主要原因。

\n