Eswlnk Blog Eswlnk Blog
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈
  • 注册
  • 登录
首页 › 其他分享 › 「其他分享」BitTorrent 分布式散列表(DHT)协议详解

「其他分享」BitTorrent 分布式散列表(DHT)协议详解

Eswlnk的头像
Eswlnk
2022-08-12 14:56:30
「其他分享」BitTorrent 分布式散列表(DHT)协议详解-Eswlnk Blog
智能摘要 AI
本文介绍了BitTorrent网络中的DHT(分布式哈希表)协议及其核心概念。DHT协议通过Kademlia算法实现去中心化,提升了网络容错性,避免了Tracker服务器下线导致的网络瘫痪。DHT的核心思想是将节点联系方式分散存储在网络中,每个节点充当小型Tracker。磁力链接利用文件的唯一标识符(info_hash)直接连接其他节点,无需依赖Tracker。DHT的工作流程包括节点上线、建立路由表、查找和交换节点信息。KRPC协议是DHT的RPC实现,支持ping、find_node、get_peer和announce_peer四种查询。DHT协议通过UDP传输,确保高效的数据交换。

概述

DHT 协议大幅度提高了 BitTorrent 网络的容错性,使整个网络难以因 Tracker 服务器的下线而崩溃,而这一切的外在表现就是“磁力链接”。

DHT 协议涉及到分布式散列表的相关知识,请参考分布式散列表协议 —— Kademlia 详解。下文将 ”BitTorrent 软件“ 简称为 “BT 软件“。

「其他分享」BitTorrent 分布式散列表(DHT)协议详解-Eswlnk Blog
BitTorrent 分布式散列表(DHT)协议详解

为什么需要 DHT 协议?

伙伴(Peer)协议可以让 BitTorrent 节点之间互相交换已知信息来完整下载和上传。当然这一切的前提是我们能够知道其它节点的联系方式,没有了这个前提,我们只能以 0KB/s 的速度等待了。Tracker 协议用于查询可以帮助下载和上传的节点,有了节点的联系方式我们才能通过伙伴(Peer)协议来交换数据完成下载和上传。但是 Tracker 是一个中心的服务器,一旦 Tracker 服务器下线,那么网络中的所有节点就只能抓瞎了。

可见 Tracker 服务器是整个 BitTorrent 网络的弱点,究其本质其实是因为节点的联系方式都存储在一个固定的位置,容错性很差。如果将这些信息存储在整个 BitTorrent 网络中,那么少数节点的故障并不会导致联系方式的丢失,也就不会影响整个网络的运行。这就是 DHT 协议的任务 —— 将每个节点变成一个小型 Tracker。

磁力链接

当你使用 BT 软件下载的时候你可能见过下面这样的地址。

magnet:?xt=urn:btih:c9e15763f722f23e98a29decdfae341b98d53056&dn=Cosmos+Laundromat&tr=udp%3A%2F%2Fexplodie.org%3A6969&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.empire-js.us%3A1337&tr=udp%3A%2F%Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=wss%3A%2F%2Ftracker.btorrent.xyz&tr=wss%3A%2F%2Ftracker.fastcast.nz&tr=wss%3A%2F%2Ftracker.openwebtorrent.com&ws=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2F&xs=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2Fcosmos-laundromat.torrent

看起来很长,其实这个链接可以简化。

magnet:?xt=urn:btih:c9e15763f722f23e98a29decdfae341b98d53056

严格来说上面的已经是最简版本了,但是对于现在的 BT 软件,如果你输入一个含有 40 个十六进制字符的字符串,它会自动帮你转为磁力链接。

c9e15763f722f23e98a29decdfae341b98d53056

所以说最重要的就是这个十六进制字符串。你可以把用你的 BT 软件下载这段字符串,下载下来的视频还挺有趣的。

上面这段十六进制字符串是通过哈希算法生成,每份资源丢到哈希算法里都会得到这样的一个字符串,并且仅属于这份资源(大概),也就是我们在之前的系列文章中提到的 info_hash。

工作流程

当节点上线时它会随机生成一个节点 ID 并作为自己的 ID 使用。

初始状态下我们并不知道其它节点的联系方式,此时需要通过其它方式或者,比如 Trakcer 服务器,或者 .torrent 文件中写明的联系方式。

然后我们会与节点建立联系并构建路由表,并周期性地测试节点的联通状态,比如通信时延。通过此种方式我们获得了一个通信质量良好的节点列表。这时伙伴交换(Peer Exchange)协议也开始工作,我们会和越来越多的节点建立联系。

当我们想下载一个文件时,我们计算文件 ID 和已知节点之间的距离,从自己的路由表中选择距离最近的若干个节点发起查询请求,接收到请求的节点如果正好可以提供这个文件则可以直接开始下载,反之它们会从自己的路由表中选择距离最近的若干个节点返回。

当我们向上传某些文件时(做种),我们会计算文件的 ID,然后将自己的联系方式存储到距离文件 ID 最近的若干个节点中。

人话

我们做种时总会把自己的联系方式存储到一个很小的范围内,此范围由文件的 ID 决定。当我们想下载时,会根据文件 ID 计算出这个范围,然后从里找做种的人就行了。

协议概述

DHT 协议是一个基于 Kademila 协议并使用 UDP 传输的应用协议,它可以将每个节点变成一个小型 Tracker,避免中心化的 Tracker 服务器所带来的风险。

DHT 协议的基础部分和 Kademila 协议一致,比如节点的 ID 都是 160 位的二进制数,使用异或算法计算距离和使用相同方法构建路由表。不同的地方在于 DHT 协议更改了部分 RPC 过程,并将这些 RPC 集合命名为 KRPC 协议。

KRPC 协议

KRPC 协议是一个由 UDP 数据包和其包裹的经过 B 编码字典组成的简洁的 RPC 协议。每次查询只会有一次响应,没有重发/重试这种机制。

下面是三种消息类型。

  • query(查询)
  • response(响应)
  • error(错误)

下面是四类查询。

  • ping
  • find_node
  • get_peer
  • announce_peer

KRPC 消息是一个经过 B 编码的字典(dictionary),每个消息至少有三个 key,分别表示”事务 ID“、”消息类型“ 和 ”客户端名称和版本“。根据消息的不同可以有更多的 key。

ping

此消息用于检查目标节点的状态,发起者应发送自己的节点 ID,接收者应回复自己的节点 ID。

喂?听到了么?

听到了。

find_node

此消息用于查询指定节点的联系方式(IP 地址和端口),发起者发送目标节点的 ID,接收者会从自己的路由表中选出距离目标节点最近的 k 个节点 ID 并返回。这是一个递归的过程,详情请阅读分布式散列表协议 —— Kademlia 详解。

get_peers

此消息用于查询于指定的 info_hash 相关的节点的联系方式,功能类似 Trakcer 服务器。发起者应发送 info_hash,接收者应返回与 info_hash 有关的节点列表,如果接收者不知道哪些节点于 info_hash 有关,则从自己的路由表中选出 k 个距离 info_hash 最近的节点并返回。

announce_peer

当一个节点于某个 info_hash 有关时(下载或上传),它应当发起此消息。发起者应发送自己的节点 ID、info_hash 和监听端口。接收者应存储接收到的联系方式,将 info_hash 和联系方式关联起来,用于响应 get_peers 消息。

参考资料

DHT Protocol

ESWINK , 版权所有丨如未注明 , 均为原创

原文标题:「其他分享」BitTorrent 分布式散列表(DHT)协议详解

「其他分享」BitTorrent 分布式散列表(DHT)协议详解-Eswlnk Blog
本站默认网盘访问密码:1166
本站默认网盘访问密码:1166
bittorrent 协议簇详解dht分布式散列表哈希表路由表通信协议
0
0
Eswlnk的头像
Eswlnk
一个有点倒霉的研究牲站长
赞赏
「其他分享」为什么需要 “API 网关”?
上一篇
「WordPress主题」Vanilla 影视主题|赛博朋克风格
下一篇

评论 (0)

请登录以参与评论
现在登录
    发表评论

猜你喜欢

  • 「亲测有效」Google Gemini 学生优惠:解决身份验证和支付卡验证
  • 解决国际版EdgeOne绑卡和手机验证问题
  • 小工具开发之EdgeOne免费计划兑换工具
  • 「其他分享」市面上静态页面服务商比较与推荐:选择最适合您的平台
  • 「图片优化」利用Cloudflare CDN减少回源Bucket流量
Eswlnk的头像

Eswlnk

一个有点倒霉的研究牲站长
1108
文章
319
评论
679
获赞

随便看看

「其他分享」解决Gravatar头像被墙无法显示问题
2022-08-29 18:48:35
「教程分享」WordPress上CDN加速能够极大地提升网站速度体验
2022-12-29 12:56:54
「其他分享」为什么需要 “API 网关”?
2022-08-12 14:50:25

文章目录

专题展示

WordPress53

工程实践37

热门标签

360 AI API CDN java linux Nginx PDF PHP python SEO Windows WordPress 云服务器 云服务器知识 代码 免费 安全 安卓 工具 开发日志 微信 微软 手机 插件 攻防 攻防对抗 教程 日志 渗透分析 源码 漏洞 电脑 破解 系统 编程 网站优化 网络 网络安全 脚本 苹果 谷歌 软件 运维 逆向
  • 首页
  • 知识库
  • 地图
Copyright © 2023-2025 Eswlnk Blog. Designed by XiaoWu.
本站CDN由 壹盾安全 提供高防CDN安全防护服务
蜀ICP备20002650号-10
页面生成用时 0.686 秒   |  SQL查询 44 次
本站勉强运行:
友情链接: Eswlnk Blog 网站渗透 倦意博客 特资啦!个人资源分享站 祭夜博客 iBAAO壹宝头条
  • WordPress142
  • 网络安全64
  • 漏洞52
  • 软件52
  • 安全48
现在登录
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈