概述#
传统上,在 BitTorrent 网络中,20 字节的 Peer ID 字段用于标识客户端,并且通常包含了客户端实现和版本号等信息。这个字段会在 tracker 请求和 peer 握手中发送,用来告诉其他节点和 Tracker 自己是哪个客户端、版本号是多少。
在一个点对点网络中,主线客户端会将 peer-id 的第一个字符设置为 M,后面紧跟着使用 ascii 数字来表示版本号,其中 major 、 minor 和 tiny 版本以破折号分隔。例如,版本号为 4.3.6 和 4.20.8 的 peer-id 可能分别为 M4-3-6– 和 M4-20-8- 。 peer-id 其余的字节是随机的。这个列表最初来源于 BitTorrentSpecification 。
Peer id 是一个唯一的标识符,用于标识特定的 BitTorrent 客户端实现和版本。在这种情况下,peer id 以连字符 “-” 开头,后跟两个字符来标识客户端实现,接着是四个 ascii 数字来表示版本号,然后再有一个连字符 “-” 。与主线(Mainline)类似,剩余的字节是随机的。 例如,”-AZ2060-“ 就是这样一个 peer id 的例子。
已知采用此类编码风格的客户端有:
'AG' - Ares
'A~' - Ares
'AR' - Arctic
'AV' - Avicora
'AX' - BitPump
'AZ' - Azureus
'BB' - BitBuddy
'BC' - BitComet
'BF' - Bitflu
'BG' - BTG (uses Rasterbar libtorrent)
'BR' - BitRocket
'BS' - BTSlave
'BX' - ~Bittorrent X
'CD' - Enhanced CTorrent
'CT' - CTorrent
'DE' - DelugeTorrent
'DP' - Propagate Data Client
'EB' - EBit
'ES' - electric sheep
'FT' - FoxTorrent
'FW' - FrostWire
'FX' - Freebox BitTorrent
'GS' - GSTorrent
'HL' - Halite
'HN' - Hydranode
'KG' - KGet
'KT' - KTorrent
'LH' - LH-ABC
'LP' - Lphant
'LT' - libtorrent
'lt' - libTorrent
'LW' - LimeWire
'MO' - MonoTorrent
'MP' - MooPolice
'MR' - Miro
'MT' - MoonlightTorrent
'NX' - Net Transport
'PD' - Pando
'qB' - qBittorrent
'QD' - QQDownload
'QT' - Qt 4 Torrent example
'RT' - Retriever
'S~' - Shareaza alpha/beta
'SB' - ~Swiftbit
'SS' - SwarmScope
'ST' - SymTorrent
'st' - sharktorrent
'SZ' - Shareaza
'TN' - TorrentDotNET
'TR' - Transmission
'TS' - Torrentstorm
'TT' - TuoTu
'UL' - uLeecher!
'UT' - µTorrent
'UW' - µTorrent Web
'VG' - Vagaa
'WD' - WebTorrent Desktop
'WT' - BitLet
'WW' - WebTorrent
'WY' - FireTorrent
'XL' - Xunlei
'XT' - XanTorrent
'XX' - Xtorrent
'ZT' - ZipTorrent
在使用 BitTornado 和其实验性 BitTorrent 实现时,引入了以一个字符开头的节点 ID,该字符在 BitTornado 中为 “T”,然后是最多五个 ASCII 字符的版本号,如果不足五个字符,则用破折号填充,最后是三个连字符(—)。
版本号中表示版本的 ASCII 字符仅限于以下字符:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.-
例如 ‘S58B—–‘… 指代 5.8.11
和其他节点标识格式一样,剩余的字节是随机的。已知采用此类编码风格的客户端有:
'A' - ABC
'O' - Osprey Permaseed
'Q' - BTQueue
'R' - Tribler
'S' - Shadow's client
'T' - BitTornado
'U' - UPnP NAT Bit Torrent
BitComet 和 BitLord 生成节点 ID 的方法。节点 ID 是用于标识一个 BitTorrent 客户端的唯一 ID 。在 BitComet 中,节点 ID 由四个 ASCII 字符 “exbc” 、两个字节 “x” 和 “y” 以及随机字符组成。版本号是小数点前的 “x”,小数点后的数字是 “y” 。 BitLord 使用相同的方案,并在版本字节后添加 “LORD” 。不过,BitComet 的一个非官方补丁曾经用 “FUTB” 代替了 “exbc” 。从 BitComet 版本 0.59 开始,节点 ID 的编码方式改为 Azureus 风格。
XBT Client 的特定格式,其 peer_id 由三个大写字符 XBT 和三个 ASCII 数字表示的版本号组成。如果客户端是调试构建,则第七个字节是小写字符 d;否则是一个横杠 -。之后是一个横杠 -,然后是随机数字、大写字母和小写字母。例如,XBT054d- 开头表示的是版本为 0.5.4 的调试构建。
Opera 8 预览版和 Opera 9.x 发行版所使用的 peer_id 方案命名规则是:前两个字符是 OP,接下来的四个数字等于构建版本号。所有后续字符都是随机的小写十六进制数字。因此,一个典型的 peer_id 看起来可能是类似于 “OP1234abcdefg” 的字符串,其中 “1234” 代表构建版本号,而 “abcdefg” 则代表随机的小写十六进制数字。简单来说,peer_id 是 Opera 浏览器用于标识自己的一种命名方式,其中包括了构建版本号和随机生成的十六进制数字。
MLdonkey 使用的 peer_id 方案的命名规则是:以 “-ML” 开头,后面跟着一个带有小数点的版本号,然后是一个短横线 “-“,最后是一些随机字符。例如,”-ML2.7.2-kgjjfkd” 中,”2.7.2″ 是版本号,”kgjjfkd” 是随机字符。
Bits on Wheels 使用的 peer_id 方案的命名规则是:以 “-BOW” 开头,后面跟着三个字符 xxx 表示版本号相关信息,然后是一个短横线 “-“,最后是一些随机的大写字母 y 组成的字符串。而对于版本号为 1.0.6 的 Bits on Wheels 客户端,其 xxx 值为 A0C 。
Queen Bee 使用的 peer_id 方案的命名规则是:以 “Q1-” 开头,后面跟着两个数字表示版本号,然后是一个或两个短横线 “-“,最后是一些随机字符。对于 Queen Bee 客户端来说,可能会有两种版本号:Q1-0-0– 和 Q1-10-0-,随后是随机生成的字节。
BitTyrant 在其 1.1 版本中所使用的 peer_id 方案。实际上,BitTyrant 是 Azureus 的一个分支,并且它的 peer_id 命名基本上是 Azureus 的命名方式加上一些额外的随机字符。具体来说,BitTyrant 在其 1.1 版本中使用 “AZ2500BT” 作为前缀,后面紧跟一些随机生成的字节,而与其他的几种命名方案不同的是,BitTyrant 的命名中没有横线。
TorrenTopia 1.90 版本通过在网上与其他客户端进行通信时自称为 “Mainline 3.4.6”,并使用以 “346——” 开头的节点 ID 。
BitSpirit 使用几种不同的模式来生成节点 ID 。在其中一种模式中,它会读取对方的 ID,并以对方 ID 的前 8 个字节为基础重新连接。它的真实 ID 似乎在版本 3.x 中使用 \0\3BS(C 表示法)作为前 4 个字节,在版本 2.x 中使用 \0\2BS 。在所有模式下,ID 可能以 UDP0 结尾。
Rufus 使用其版本号作为前两个字节的十进制 ASCII 值。第三个和第四个字节是 RS 。随后是用户的昵称和一些随机字节。
G3 Torrent 的用户 ID 以 -G3 开始,并添加用户昵称的最多 9 个字符。
FlashGet 使用 Azureus 的风格,但没有尾随的横线。版本 1.82.1002 仍然使用版本数字 0180 。
AllPeers 采用了一种基于用户相关字符串的 sha1 哈希值的方式来生成用户 ID 。然后将哈希值的前几个字符替换为 “AP” + 版本字符串 + “-“ 。
总结#
BitTorrent Peer ID Conventions 是一个用于标准化 BitTorrent 客户端生成和解析节点 ID 的规范。在 BitTorrent 网络中,每个客户端都需要根据这个约定生成其自己的节点 ID,并且能够解析来自其他客户端的节点 ID 。通过遵循这个约定,可以确保不同的客户端之间可以彼此识别,从而使它们能够进行有效的文件共享。
根据这个约定,一个标准的 BitTorrent 节点 ID 应该包括软件名称、版本号、随机字符串和可选的扩展信息等部分,具体格式如下:
软件名称:2 个字节 ASCII 字符表示的字符串,用于指示所使用的 BitTorrent 客户端软件名称。
版本号:4 个字节 ASCII 字符表示的字符串,用于指示客户端软件的版本号。
随机字符串:20 个字节随机生成的字符串,用于使每个节点 ID 都是唯一的。
扩展信息:可选的 8 个字节长度的字符串,用于包含额外的元数据或标识。
由于 BitTorrent Peer ID Conventions 是一个公认的标准,因此大多数 BitTorrent 客户端都遵循这个规范来生成和解析节点 ID 。这有助于确保 BitTorrent 网络中的互操作性和兼容性。
参考链接#
http://www.bittorrent.org/beps/bep_0020.html
https://wiki.theory.org/BitTorrentSpecification