UDP tracker 协议

原文:UDP tracker protocol
http://xbtt.sourceforge.net/udp_tracker_protocol.html


[b][color=red]简介[/color][/b]
  UDP tracker协议是一种高性能、低消耗的BitTorrent(BT)tracker协议,这种协议的URL一般是这样:udp://tracker:port。
  Azureus, XBT客户端和XBT Tracker支持这种协议。(其实现在大部分BT客户端都支持)
  所有的值都按网络字节顺序(network byte order)发送(大尾)。每种封包的大小都不是固定的,以后的扩展可能会增加封包的大小。
  把n设为0。
  如果60*2^n秒后没有收到响应信息,则重发连接请求并将n+1。
  如果收到响应信息,则把n重置为0。
[b][color=red]HTTP VS UDP[/color][/b]
# 以太网: 14 字节
# IP: 20 字节
# TCP: 20 字节
# UDP: 8 字节

协议 数据包 非用户 用户 总共
HTTP 10 540 247 + 119 + 6 * N = 366 + 6 * N 906 + 6 * N
UDP 4 168 16 + 16 + 98 + 20 + 6 * N = 150 + 6 * N 318 + 6 * N
HTTP – UDP 6 372 216 588
HTTP / UDP 2.5 3.2 1.5 2.0

  UDP 协议的tracker占用的带宽不到HTTP tracker的50%,并且由于UDP协议是无状态的(stateless),由于路由器或服务器所能处理的TCP连接(打开的)数所造成的限制也就不存在于UDP上了。
[b][color=red]封包结构[/color][/b]
  在进行announcing或scraping前,你得先得到一个连接ID。
1.选择一个随机的事务ID。
2.填写连接输入结构。
2.发送封包。
连接输入:
偏移 大小 名称 值
0 64位整数 连接ID 0x41727101980
8 32位整数 动作 0
12 32位整数 事务ID
16
1.接受数据包。
2.检查收到的数据包是否至少有16字节的大小。
3.检查事务ID是否是刚才你所选择的那个。
4.检查动作是否是连接(connect)。
连接输出:
偏移 大小 名称 值
0 32位整数 动作 0
4 32位整数 事务ID
8 64位整数 连接ID
16
1.选择一个随机的事务ID。
2.填写announce输入结构。
3.发送封包。
announce输入:
偏移 大小 名称 值
0 64位整数 连接ID
8 32位整数 动作 1
12 32位整数 事务ID
16 20字节字符串 特征码(info_hash)
36 20字节字符串 客户端ID
56 64位整数 已下载
64 64位整数 剩余
72 64位整数 已上传
80 32位整数 事件
84 32位整数 IP地址 0
88 32位整数 key
92 32位整数 num_want -1
96 16位整数 端口
98
1.接受封包。
2.检查封包大小是否至少为20字节。
3.检查事务ID是否是你刚才选用的那个。
4.检查动作是否是announce。
5.除非已过去“间隔时间(秒)”或着有某个时间发生,否则不要再次announce。
announce输出:
偏移 大小 名称 值
0 32位整数 动作 1
4 32位整数 事务ID
8 32位整数 间隔时间
12 32位整数 下载人数
16 32位整数 作种人数
20 + 6 * n 32位整数 IP整数
24 + 6 * n 16整数 TCP端口(客户端之间连接)
20 + 6 * N
最多可以有74个种子被同时scrape,本协议不支持所有种子同时scrape。
1.选择一个随机的事务ID。
2.填写scrape输入结构。
3.发送封包。
scrape输入:
偏移 大小 名称 值
0 64位整数 连接ID
8 32位整数 动作 2
12 32位整数 事务ID
16 + 20 * n 20字节字符串 info_hash
16 + 20 * N
1.接收封包。
2.检查封包大小是否至少有8字节。
3.检查事务ID是否是刚才选用的那个。
4.检查动作是否是scrape。
scrape输出:
偏移 大小 名称 值
0 32位整数 动作 2
4 32位整数 事务ID
8 + 12 * n 32整数 做种人数
12 + 12 * n 32位整数 完成数
16 + 12 * n 32位整数 下载人数
8 + 12 * N
如果tracker发生错误,那么它将会发送一个错误封包。
1.接受此封包。
2.检查封包大小是否至少有8个字节。
3.检查事务ID…
错误输出:
偏移 大小 名称 值
0 32位整数 动作 3
4 32整数 事务ID
8 字符串 消息
如果tracker需要进行身份验证,那么你发送到服务器的每个封包的后面都要加上一个验证结构。The hash is the first 8 bytes of sha1(input + username + sha1(password)).
身份验证输入:
偏移 大小 名称 值
0 8字节0对齐的字符串 用户名
8 8字节字符串 hash
16
[b][color=red]动作[/color][/b]
0: 连接
1: announce
2: scrape
3: 错误
[b][color=red]事件[/color][/b]
0: 无
1: 已完成
2: 已开始
3: 已停止

博主友情提示:

如在您的评论中需要提及如QQ号、微信号、电子邮件地址或其他隐私敏感信息,欢迎通过>>博主专用加密工具v2<<加密后发布,原文只有博主可以看到。