当前位置: 首页 > news >正文

BT原理分析

BT全名為BitTorrent,是一個p2p軟件,你在下載download的同時,也在為其他用戶提供上傳upload,因為大家是「互相幫助」,所以不會隨著用戶數的增加而降低下載速度。 

其實跟ED也十分相似,ED跟BT不同的地方有: 
  ED--要連上一個固定server BT--沒有固定server,只要分享者製作出該分享檔案的.torrent檔公佈出來便可 
  ED--分享的人越多速度越快? BT--種子seed越多速度越快 
  ED--世界性的分享 BT--團體性的分享(可做到速度保證) 
  ED--知道在分享者的user name &速度 BT--沒顯示使用者/分享者名字 
  
比起其它的P2P軟件,BT有個獨特的地方,它存在一個中間的WEB服務器,就是我們在發佈的時所填寫的announce。該服務器提供了發佈的統一管理,不像其它P2P軟件那樣到處去找哪些非常不穩定的個人服務器,相對起來讓人安心的多。 

該WEB服務器更大的作用是內網用戶可以做 Send(下面會說明原理),這是其它軟件無法做到的,但不好的地方是announce當機的時候就無法下載了。要知道P2P下載關鍵是要人氣要高,announce停一下就搞到人氣全沒有了。 

.torrent 的作用 

大家都知道我們要用BT下載 ,就要先下載一個.torrent文件,這個文件到底有甚麼呢: 
首先是 announce 紀錄了發佈服務器的位置,讓BT知道是那個WEB服務器發佈的,然後是一些文件信息,文件名,目錄名,長度等等,最後是片段長度,和片段的 Sha1 校驗碼,(BT為了事現續傳和文件校驗,就把文件分成若干個片段),大家可以用寫字板打看torrent文件看看,就是知道個大概,後面的亂碼是片段 Sha1 校驗碼。 

開始-續傳的實現 sha校驗 

BT 打開一個 torrent文件後,先要你選擇文件保存那裡。然後判斷文件不存在的話就建立新文件,存在的話就用 Sha1 校驗碼去校驗文件---錯誤的就是還沒下載的,這樣就可以實現續傳了,但128位校驗,想不慢都不行 

得到 peer 

現在知道要下載甚麼了,到那裡下載呢?這就要尋找有誰提供上傳了,這裡BT是通過WEB服務器來實現的,首先BT會通過分析 torrent 來得到下面一串網址 
http://btfans.3322.org:6969/anno ... 2&event=startED

http://BTfans.3322.org:6969/announce 是發佈服務器的地址 

info_hash 是torrent文件中的 info 部分的Sha校驗碼,WEB通過它在發佈列表找到對應的紀錄

peer_id 是自身的標識,它是12個0和當前時間+全球的唯一標識碼(GUID)的Sha校驗的前八位,共20位 

port 你提供上傳的 port 

IP 你的ip地址,沒有的話服務器會自己找到 

uploadED downloadED 你上傳和下載了多少,服務器可以用它來做流量分析 

left 你還要下載多少個字節 

event 狀態,告訴服務器你是準備開始下載,還是停止,還是下載完成了 

以上這個操作默認 5 分鐘做一次,或由服務器設定 

服務器會做甚麼 

服務器中有個一個 track 程序來管理這些請求,得到這一串代碼後就會用 info_hash 來查找列表,找到你就可以下載,找不到就對不起啦。接著它會反連(NatCheck)你的 IP 和 Port這樣就可以知道你是內網用戶還是共網用戶(如果你是內網用戶,它是連不通的,因為它會連到你的服務器上,你的服務器當然沒有這個端口啦),然後服務器返回現在正在下載這個文件的所有公網用戶的IP和port,就像是:d8:intervali1800e5eersld2:ip14:xxx.xxx.xx.xxx7eerid20:00180531904b7e3abdd74orti6881eeee 
interval 1800 是告訴 BT 隔多少秒來查詢一次這裡是 30 分鐘 (有點過分了),最後如果你是公網用戶它會把你提交的 IP 和 Port 放到info_hash 對應的列表中,這樣其它人就可以找到你 

下載 

得到這些 peer IP後,BT就可以找到對應的IP下載了,BT會到所有的peer去尋找自己要下載的東西,不是一定要到seed下載。BT每找到一個peer就和建立一個Socket來下載,所以下載的人越多,速度就越快。 

內網用戶可以做Send的原理 

上面說到服務器只會返回公網的ip的,那內網用戶怎麼可以做Send呢,這是因為BT是一個主動連接的軟件(即使你已經下載完了,也不也會主動連接他人)下面是一個仿真流程: 

1 內網用戶開始做 seed, 
2 服務器收到請求,由於是第一個所以也沒有peer返回 
3 公網用戶提交請求,由於seed是內網用戶所以也沒有peer返回,等待下載,但服務器會把它的IP放到列表中 
4 內網經過 interval 時間間隔後,再向服務器放出請求,得到上面得公網IP 
5 得到公網IP後,內網馬上進行連接 
6 公網用戶建立連接,數據開始傳輸 (注意現在是公網用戶做服務器,內網用戶做客戶端,是不是有點怪) 
7 其它內網用戶去上面公網用戶下載數據 

所以,內網用戶做 seed 一定要有公網用戶得參與,否則其它內網用戶無法下載。如果全部是內網用戶,那個所有連接都不會成立,當然這是比較極端的情況。 

以上可見,內網用戶不能和內網用戶連接,其它用戶無法從服務器查到你,所以無法主動連接你,你只能每隔30分鐘從服務器找到公網用戶一個個進行連接。 

由於中國很多用戶的是內網用戶(我從服務器上查回來的peer還沒試過超過10個的),所以內網用戶用BT的確要比公網用戶要慢很多。 
BT全名為BitTorrent,是一個p2p軟件,你在下載download的同時,也在為其他用戶提供上傳upload,因為大家是「互相幫助」,所以不會隨著用戶數的增加而降低下載速度。

转载于:https://www.cnblogs.com/wpjamer/p/4531335.html

相关文章:

  • linux -- ubuntuserver 安装图形界面
  • 阅读小记3(《C编程专家》)
  • C# 获取web.config配置文件内容
  • APIX招聘
  • 性能测试
  • linux cmd
  • VS2010中的调试技巧
  • 关于最短增广路算法和连续最短增广路算法的操作步骤
  • 函数的封装
  • ASP.NET OWIN OAuth:refresh token的持久化
  • [译] 一、为何要推出AppCoda系列?
  • HDU4685 Prince and Princess 完美搭配+良好的沟通
  • 如果项目使用HOLO或加载V7包就会出现小按钮变大
  • Spring AOP在pointcut expression解析表达式 并匹配多个条件
  • 复合索引(组合索引)
  • JS 中的深拷贝与浅拷贝
  • 【React系列】如何构建React应用程序
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Java的Interrupt与线程中断
  • Linux CTF 逆向入门
  • Python利用正则抓取网页内容保存到本地
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 分类模型——Logistics Regression
  • 浅谈web中前端模板引擎的使用
  • 什么软件可以剪辑音乐?
  • 在Mac OS X上安装 Ruby运行环境
  • 怎样选择前端框架
  • 做一名精致的JavaScripter 01:JavaScript简介
  • ​2021半年盘点,不想你错过的重磅新书
  • #HarmonyOS:基础语法
  • #pragma 指令
  • #宝哥教你#查看jquery绑定的事件函数
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (七)理解angular中的module和injector,即依赖注入
  • (转)Windows2003安全设置/维护
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET上SQLite的连接
  • .net实现客户区延伸至至非客户区
  • /etc/fstab和/etc/mtab的区别
  • []常用AT命令解释()
  • [2018-01-08] Python强化周的第一天
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强
  • [CTO札记]如何测试用户接受度?
  • [Effective C++读书笔记]0012_复制对象时勿忘其每一部分
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART
  • [HackMyVM]靶场 VivifyTech
  • [hdu 3746] Cyclic Nacklace [kmp]
  • [IDF]被改错的密码