This question already has an answer here:
Creating a torrent client in Java? [duplicate]

(1个答案)


5年前关闭。




我正在用Java开发一个bitTorrent客户端。我知道在线上有很多图书馆,但我无能为力。我要我自己的。无论如何,我注意到了一些奇怪的行为,也许你们知道我所缺少的一些东西:
  • 我尝试连接的所有对等节点中约有80%导致连接失败(socketTimeOut或“无法连接”错误)。显然,从跟踪器接收对等方的列表。我还尝试通过ping随机测试了一些IP。 ping通常是成功的。
  • 当我连接时:
  • 握手后,
  • 断开连接的50%
  • 在30%时,我注意到了一个怪异的行为:我收到了握手,我收到了BitField(它们有所有碎片),我被+20轰炸了(我检查了他们在BitField中已经​​提到的碎片索引),然后它们掉了连接,这很奇怪。

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

    一些BitTorrent问题:

    更新#4:由于考虑找到答案而即时删除了一些问题
  • ,这是“80%的连接失败率问题”:80%的连接失败率是什么原因?从某种意义上说,这并不是一个倒霉,因为我尝试连接的每个客户端都没有更多的空间供我使用。我正在听6881,但也已在其他端口上进行了测试。昨天我取得了巨大的成功,接受了许多连接(相同的代码,在过去一周中进行了一些更改),Piece消息开始流淌..所以我的代码并不是完全没有用。
  • torrent客户端在关闭之前是否使用event=stopped向跟踪器发送最后一条消息,以使其使用对等信息更新其内部数据库,从而使其不作为响应发送包含无用对等信息的列表?或只是他们应该..因为真的好像我正在接受同龄人。
  • 接收对等方的顺序是否重要?也许完成的百分比..或真的是随机的。
  • 另外,我偶尔还会收到一个端口为0的对等体,这会使我的Socket构造函数引发异常。端口0是什么意思?我可以在任何端口上联系它吗?
  • 如果我尝试通信的Torrent客户端将继续启动连接,我的PeerId(我在握手中发送或向跟踪器宣布自己的身份)会受到影响吗?如果我撒谎并说“-AZ2060-”作为我的Azureus客户端该怎么办?
  • 这是“零件可用性吓跑同行的问题”:我的零件可用性会吓跑同行吗?我正在尝试连接,并且我发送了一个空的位域(我没有片段,[length: 1][Id = 5][payload: {}]);似乎他们发送了位域,我发送了位域..(有些发送了疯狂的“有消息”消息),他们意识到我很穷,他们放弃了我..有些在握手后放弃了连接。 (多么粗鲁。)
  • 不使用经典端口间隔(6881-6889)是否有好处?
  • ,这是“不良同行列表问题”:torrent客户端是否在内部保留了不良同行列表(例如黑名单)?有时,在找到一个不错的同伴后,我在测试中不断使用它的信息,但仅接受1/3连接。有时必须经过10分钟才能再次成功建立连接。

  • 更新#1:似乎与μTorrent客户端的连接以上述模式(BITFIELD,HAVE轰击,紧密连接)表现。我在本地使用一堆bitTorrent客户端(μTorrent,BitTorrent,Vuze,BitCommet,Deluge)进行了测试,但仅在μTorrent上注意到了这种模式。在其他方面,沟通很好(HS,BITFIELD,UNCHOCE和快乐的乐谱分享)。现在,此μTorrent可能是最受欢迎的bitTorrent客户端(μTorrent启动的6/8连接),所以……有什么想法吗?

    更新#2:在保持"bad list,"方面确实如此(这样做确实很有意义)。例如,使用μTorrent,我注意到以下无连接间隔(30s,1min,1min30s,2min ..)。所谓“无连接”,是指在先前的连接结束之后的x秒内,没有新的连接被接受。

    更新#3: HAVE消息轰炸可能是所谓的“惰性位域”(经过几次测试,BITFIELD中没有提到HAVE中提到的每个片段)。我看到μTorrent和BitTorrent使用这种方法。

    另一个结论:有些客户端在遵守BitTorrent规范方面更具限制性,如果违反规则,将关闭连接。 例如:我在BitTorrent和BitTornado中注意到,如果您发送位域消息但没有片段,它们将关闭连接(没有片段=空位域。没有碎片”),而其他人则在您发送任何类型的消息(而不是感兴趣的)之前发送了任何类型的消息而关闭了连接。

    更新#4:
    由于我对第一个问题最感兴趣(我的80%的连接速率失败的原因可能是什么?..最常见的问题可能是喜欢的问题),因此,以下是一些有时导致连接失败的原因的一些解释:

    1)如果我在停止上一个连接后不久开始与对等方建立连接(通过stop-我的意思是关闭套接字):另一端的对等方直到下一次读/写时才知道。

    细节:
    -我注意到了很多次,这在完成下载后更加明显..如果我关闭连接,对等端在尝试发送新的KEEP_ALIVE(约2分钟)之前不会意识到这一点。但是,如果我在交换REQUEST-PIECE中关闭时,对等节点将很快实现。在关闭连接后的第一种情况下,我仍然会出现在uTorrent对等选项卡中。如果我在记录器选项卡中查看,大约2分钟后,它将意识到我已经走了。

    2)看来uTorrent看到我的BITFIELD消息已损坏(并且很明显应该在收到消息后关闭连接)(这并不总是发生。 。

    细节:
    -如果我在uTorrent记录器选项卡中查看,它在发送位域后立即显示“已断开连接:错误的数据包”
    -我正计划尝试实现令人讨厌的位域,也许我可以逃脱这个问题(我也看到大多数BT客户都这样做了)

    3)(uTorrent不允许我重新连接时,它可能链接到#1之上),我在记录器选项卡中看到:“断开连接:已经具有相等的连接(删除额外的连接)”。。目前,我选择随机本地端口建立一个新的连接时(大多数BT客户端都看到了此连接),但这并没有骗人,他仍然看到我的“对等列表”中已经存在一个对等对象(可能ip匹配)。Buuut:在30%的测试中,相同的场景确实允许我重新连接:) ..我还没有任何解释为什么

    4)还有一件事:关闭uTorrent的洪流后,“进入连接的监听器”似乎仍然存在(通过关闭我的意思是:右键单击+停止)。这意味着我仍然可以开始连接,发送握手...。此后,我断开了连接(它没有握手回来)。 uTorrent记录器中的消息:“断开连接:否此类洪流:80FF40A75A3B907C0869B798781D97938CE146AE”,该长字符串是我的信息哈希。在与其他BT客户端进行测试时也看到了此信息。

    更多信息:

    uTorrent的
  • 方案,类型为完全上传/部分上传和完全下载
    是成功的,部分下载的不是那么多..可能是由于#2
  • 我仍然与uTorrent一起获得bitField +受到轰击+关闭
    连接..我记得在记录器选项卡“已断开连接:错误的数据包”中存在相同的消息。..可能是由于#2
  • 除了uTorrent之外,我还测试过:BitTorrent,BitTornado,BitCommet,qBitTorrent,FlashGet(可以正常通信)以及Vuze,FrostWire,Shareaza(对于这些人来说, super 正常)。
  • 并非所有客户端的行为都相同。例如:FlashGet和uTorrent(和BitCommet?)
    除非您发送INTERESTED,否则不要取消锁定。
    在BITFIELD之后..从这种意义上说,我正在计划以某种方式对待客户(我真的认为这是必要的)..可能从位域中猜测他们的名字(只有2个命名约定)并从那里开始..我已经有了实现的东西,这就是我知道我连接到uTorrent类型的客户端的方式。
  • 最佳答案

    好的,我为您提供了一个答案,但我必须警告您,我自己从未写过比特洪流客户端,并且某些答案可能不是100%准确的,我写的所有内容都是基于我对比特洪流的全局看法工作。因此,如果您浪费时间,我深表歉意,但我仍然认为您可能会从我的答案中学到您所要问的核心内容。

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

    用一个线性解释很难解释,但是:
    -比特洪流意识形态是tit-4-tat ..如果您不给/有山雀,您就不会得到tat ..
    除非您刚刚开始下载,否则在这种情况下您可能会获得“捐款”以...开始。
    或另一面是专用播种机..在这种情况下,他可能会检查您是给予者还是仅仅是接受者...或许多当前正在下载的种子...或(填写您的想法..)
    因此,您看到了很多而且实际上非常聪明的机制,以确保群可以敏捷高效地运行,尽管其中一些可以被跟踪到您的计算机,但是至少它们实际上并不能由您的计算机监视,至少可以说是在其监视之下。控制。

    •torrent客户端是否在关闭前将事件=已停止的最后一条消息发送给跟踪器,以使其使用对等信息更新其内部数据库,从而使其不发送包含无用对等信息的列表作为响应?或只是他们应该..因为真的好像我正在接受同龄人。

  • 这取决于客户端代码-有些可能不这样做。(继续阅读)

  • •接收到的同伴的顺序是否重要?也许完成的百分比..或真的是随机的。
  • 这取决于服务器代码-有些可能不这样做。.(继续阅读)

  • 好了,请注意这两个注意事项(请继续阅读)。您应该牢记,在P2P网络中,没有权限严格绑定(bind)客户端或服务器以支持协议(protocol)中的字母,即使协议(protocol)中规定了某些内容也应如此。完成-这并不意味着每个客户都会实现它,或者对它采取任何行动,或者对遗漏它采取任何行动。

    •此外,我时不时会收到一个端口为0的同位体,这会使我的Socket构造函数引发异常。端口0是什么意思?我可以在任何端口上联系它吗?
  • 端口0是通配符,如果您连接到它,它将自动将您连接到下一个可用端口。 (有人说1023以上的下一个可用端口-但我从未测试过)

  • •我尝试交流的Torrent客户端将继续建立连接时,我的PeerId(我以握手形式发送或向跟踪器宣布自己)会受到影响吗?如果我撒谎并说“-AZ2060-”作为我的Azureus客户端该怎么办?

    它将认为您是Azureus,并且如果其他Azureuses以此促进与Azureuses的连接(如果有的话,那将是一个很大的数目),您将从中受益。

    •我的作品可用性吓到了同行吗?我正在尝试连接,并且发送了一个空的位域(我没有任何内容,[length:1] [Id = 5] [payload:{}]);似乎他们发送了位域,我发送了位域..(有些发送了疯狂的“有消息”消息),他们意识到我很穷,他们放弃了我..有些在握手后放弃了连接。 (真没礼貌。)
  • 可能..

  • •不使用经典端口间隔:6881-6889是否有好处?
  • 我不这么认为-除了可能混淆您的ISP。

    •洪流客户端是否在内部保留不良同行列表(如黑名单)?有时,在找到一个不错的同伴后,我在测试中不断使用它的信息,但仅接受1/3连接。有时必须经过10分钟才能再次成功建立连接。
  • 取决于客户端代码。

  • 概括

    这是一个丛林-每个人都可以编写自己的逻辑,只要他发送正确的协议(protocol)命令-您的问题集中在客户端的逻辑行为上,但是您目前可能没有共识,这也是比特洪流,这可能是其成功的主要原因。

    关于java - Java &&中的Bittorrent实现需要有关群行为的一些信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15527712/

    10-09 05:56