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

问题描述:

我正在开发一个Java中的bitTorrent客户端。我知道网上有很多图书馆,但我无法提供帮助;我想要我自己的。无论如何,我注意到一些奇怪的行为,也许你们知道我失去了一些东西:java中的Bittorrent实现&&需要关于群体行为的一些信息

  • 约80%的走了,我想所有对等连接导致不成功的连接(或者socketTimeOut或“不能连接“错误)。显然,从跟踪器收到对等列表。我也试图通过尝试ping它们来随机测试一些IP; ping通常是成功的。
  • 当我连接:握手之后
    • 50%的降幅连接,
    • 30%,我注意到一个奇怪的现象:我收到握手,我收到位域(他们有所有作品),我得到轰炸+ 20有消息(我检查了它们在BitField中已经​​提到过的那个片断的索引),然后它们断开连接,这很奇怪。

(对于所有的统计数据,数字不准确。)

一些BitTorrent的问题:

更新#4: IM切断了一些问题,由于考虑答案发现

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

  • 做洪流客户端发送,收盘前的最后消息中与event=stopped追踪器,使其更新等信息的内部数据库,这样就不会发送,作为响应,没用对信息的列表?或者只是他们应该......因为我真的好像在接受死去的同伴。

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

更新#1:似乎与μ的Torrent客户端连接的行为与上述模式(BITFIELD,都轰击,关闭连接)。我在本地测试了一些bitTorrent客户端(μ Torrent,BitTorrent,Vuze,BitCommet,Deluge),并且只在μ Torrent上注意到这种模式。在其他人中,沟通很好(HS,BITFIELD,UNCHOCE &开心分享)。现在,这个torrent可能是最受欢迎的bitTorrent客户端(6/8连接开始分别是μ Torrent),所以…有任何想法吗?

更新#2:在保持"bad list,"它看起来如此(并且它实际上是有道理的这样做)。例如,在μ Torrent中,我注意到以下无连接间隔(30s,1min,1min30s,2min ..)。通过“无连接”的意思,在上次连接结束之后,对于x秒,不接受新的连接。

更新#3:有消息轰炸可能是所谓的“懒惰的位域”(做了几个测试,每一个提到的HAVE都没有出现在BITFIELD中)。我看到μ Torrent和BitTorrent使用这种方法。

另一个结论:有些客户是在尊重的BitTorrent规格方面更加严格,如果你打破了规则,将关闭连接。 例如:我注意到与BitTorrent和BitTornado,如果你发送一个位域消息,但没有件,他们将关闭连接(没有件=空位域..但规格说:“这是可选的,不需要发送,如果客户端没有件“),而其他人关闭连接,如果你发送任何类型的味精之前,他们发送UNCHOKE味精(甚至没有感兴趣)。

更新#4: 因为即时通讯中的第一个问题最感兴趣(还有什么我的80%的原因无法连接速率。该删除线的问题,更可能比喜欢?),这里是为什么一些解释有时连接没有成功:

1)如果我在停止之前的连接后立即启动与对等方的连接(通过停止 - 我的意思是关闭套接字):另一方的对等端不会知道,直到下一次读/写。

详情: - 我注意到了这一堆,下载完成后更明显..如果我关闭连接,peer不会意识到这一点直到它尝试发送一个新的KEEP_ALIVE(~2分钟)。但是如果我在交换REQUEST-PIECE时关闭,peer会快速实现。在关闭连接后的第一个场景中,我仍然存在于uTorrent peer选项卡中。如果我在记录器标签内查看大约2分钟后,它会意识到我已经走了。

2)似乎uTorrent的看到我的BITFIELD消息损坏(&明显receving之后应该关闭连接)(这并不发生八方通..还我检查&复查,味精即可&与其他BT客户端没有这样问题)..

详情: - 如果我看的uTorrent记录器选项卡里面,它会显示“断开连接:坏包”之后我派位域 - 我打算尝试lazzy位域的实现,也许我可以逃脱这个(也我看到大多数的BT客户端做到这一点)

3)(超过可能链接到#1)当uTorrent不允许我重新连接时,我在记录器标签中看到:“断开:已经有相等的连接额外的连接)“..目前我选择随机本地端口时,启动一个新的连接(看到这在大多数BT客户端实现),但这并没有欺骗它,他仍然看到,即时消息对等已经出现在他的”对等名单“ (可能是ip匹配)。Buuut:在30%的测试中,sa我的场景,它确实让我重新连接:) ..我没有任何解释为什么还有

4)还有一件事:看起来'收听连接'监听器在你关闭uTorrent关闭我的意思是:右键单击+停止)。这 意味着我仍然可以开始连接,发送HANDSHAKE ..在此之后,我断开连接(它不回HANDSHAKE)。在uTorrent记录器的消息:“断开:没有这样的洪流:80FF40A75A3B907C0869B798781D97938CE146AE”,这个长的字符串是我的信息哈希..看到这一点,同时与其他BT客户端测试。

一些更多的信息

  • 场景与型全上传/部分上传&全下载 是succesfull,那些部分下载的没有这么多的uTorrent的..可能是由于# 2
  • 我仍然认为uTorrent的BITFIELD +具有轰击+密切 连接得到..正如我在记录片的rember相同味精“断开连接:坏包” ..可能是由于2号
  • 除了uTorrent的,香港专业教育学院与测试:位Torrent,BitTornado,BitCommet,qBitTorrent,FlashGet(通讯正常)&与Vuze,FrostWire,Shareaza(与这些人,这是超级好的)。
  • 并非所有客户都表现相同。例如:FlashGet & uTorrent(& BitCommet?) 不解开,直到您发送INTERESTED ..而其他人似乎解开权利 后BITFIELD ..在这感觉im planing以某种方式对待客户不同(我真的认为这是必要的)..大概猜到他们的名字从该位域(只有2个命名约定)从那里开始& ..我已经实现的东西,这是我怎么知道我连接到 客户端类型的uTorrent的..
+0

很多问题。是否有某个地方的洪流规范? – 2013-03-20 15:27:28

+2

https://wiki.theory.org/BitTorrentSpecification,http://www.bittorrent.org/beps/bep_0003.html .. – pulancheck1988 2013-03-20 15:35:37

+0

我认为,通过成功的Bittorrent客户端来源进行挖掘是成功的关键。有许多规则是其他客户端为了摆脱leechers而隐含强制执行的,等等,以至于通过遵循规范来实现通用客户端可能是不可能的... – TheBlastOne 2013-03-25 12:04:33

好,我有一个答案给你,但我必须警告你,我自己从来没有写过一个流行的客户端,有些答案可能不是100%准确的,我写的所有内容都来自我对全球的理解查看如何钻头工作。所以我很抱歉如果我浪费了你的时间,但我仍然认为你可能会从我的回答中了解到你所问的核心问题。

•可能是我的80%连接速率失败的原因是什么?

非常复杂的一个线性的解释来解释,但: - 位洪流思想是针锋相对4达..如果你不给/有针锋相对,你是得不到TAT .. 除非你刚刚开始下载和在这种情况下,你可能会得到一个“捐赠”开始... 或另一边是一个专门的播种机..在这种情况下,他可能会检查你是一个送礼者或只是一个接受者...或很多目前正在下载...或者(填写你的想法..) 因此,你会发现有很多,而且确实非常聪明的机制,以确保群体可以敏捷和高效,而其中一些可以追溯到你的机器,其中大多数不能真正甚至由您的机器监控,最少在其控制下说。

•在关闭之前,Torrent客户端会发送最后一条消息给带有event = stopped的跟踪器,以便使用peer信息更新其内部数据库,以便它不会发送带有无用peer信息的列表作为响应?或者只是他们应该......因为我真的好像在接受死去的同伴。

  • 这取决于客户端代码 - 有些人可能会做一些不..(请继续阅读)

•是任何重要性收到同行的顺序?也许完成百分比..或者真的是随机的。

  • 它取决于服务器的代码 - 有些人可能会做一些不..(请继续阅读)

好吧,请注意这两个(请继续阅读)指出..你应该记住,在P2P网络中,没有权限严格绑定客户端甚至服务器来维护协议,即使该协议声明了应该完成的事情 - 并不意味着每个客户端都会执行它或者对其执行相同的操作或者错过了它。

•此外,每一个现在,然后我收到端口0同行,这让我的Socket构造抛出异常。端口0是什么意思?我可以在任何港口联系吗?

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

•可以在我的peerID(我在握手发送或宣布自己的跟踪器)的影响,如果洪流客户我试图沟通将继续一个启动的连接?这意味着如果我撒谎并通过使用'-AZ2060-'作为我的ID来说我是Azureus客户?

它会认为你是Azureus的,如果其他Azureuses促进连接,可根据该Azureuses(这是一个很大的,如果有),你会从中得到好处。

•请问我的一块可用性吓跑同行?我试图连接,并发送一个空位域(我没有片段,[length:1] [id = 5] [payload:{}]);似乎他们发送位域,我发送位域..(有些发送像疯了有消息),他们意识到我很穷,他们放弃我..握手后一些掉线连接。 (如何粗鲁。)

  • 可能..

•请问有没有采用经典的端口间隔的好处:6881 - 6889?

  • 我不这么认为 - 也许除了混淆你的ISP ..

•你的洪流客户内部保持不良同行的列表(如黑名单)?有时在找到一个好的同伴之后,我不断在测试中使用它的信息,但只接受了1/3的连接。有时10分钟不得不再次成功连接。

  • 取决于客户端代码。

摘要

这是一个丛林在那里 - 只要每个人都可以编写自己的逻辑,他发送正确的协议命令 - 您的问题主要集中在客户端上的逻辑行为,但没有共同点你大概现在可以理解了,这也是这种流行的美妙之处,也可能是它成功的主要原因。

+0

谢谢你的答案..关于我的第一个问题和你的答案,我wasnt达到了'tit-4-tat'点,我的连接在达到某个阶段之前关闭了,有些部分将会/可能会被通过。无论如何,如果您有兴趣,我会进行一次非常大的更新。 – pulancheck1988 2013-03-29 23:11:44

+0

阅读更新#4后,我确信你正在混合两种类型的问题:一种类型涉及洪流群行为,但我认为你很好地克服了它,第二种类型是套接字的常见问题,例如,它是多年来一个已知的事实是服务器不能主动实现客户端,除非客户端发送一些约定的协议命令来主动要求服务器断开连接。更确切地说,如果你实际上拔掉了你的网线 - 服务器仍然认为你已经连接 - 除非它试图发送一些东西。 – 2013-03-29 23:51:15