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,因為大家是「互相幫助」,所以不會隨著用戶數的增加而降低下載速度。
BT原理分析的更多相关文章
- [转]BT原理分析
BitTorrent协议. BT全名为BitTorrent,是一个p2p软件,你在下载download的同时,也在为其他用户提供上传upload,因为大家是“互相帮助”,所以不会随着用户数的增加而降低 ...
- BT原理分析(转)
BT种子文件结构分析,参考:http://www.cnblogs.com/EasonJim/p/6601047.html BT下载,参考:http://baike.baidu.com/item/BT下 ...
- BT下载原理分析
版权声明:本文为博主原创文章,未经博主允许不得转载. BitTorrent协议. BT全名为BitTorrent,是一个p2p软件,你在下载download的同时,也在为其他用户提供上传upload, ...
- Holt-Winters模型原理分析
Holt-Winters模型原理分析及代码实现(python) from:https://blog.csdn.net/u010665216/article/details/78051192 引言 最近 ...
- Handler系列之原理分析
上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...
- Java NIO使用及原理分析(1-4)(转)
转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...
- 原子类java.util.concurrent.atomic.*原理分析
原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...
- Android中Input型输入设备驱动原理分析(一)
转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...
- 转载:AbstractQueuedSynchronizer的介绍和原理分析
简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...
随机推荐
- Github的gitignore
Git Bash Here的时候自动产生一个.gitignore文件,.gitignore文件的作用上让没有track,也就是没有被add的,如果想ignore已经track的,用git rm --c ...
- windows 系统分布式版本控制 git 使用学习
1. 在 Windows 上安装 Git 在Windows上使用Git,可以从Git官网直接下载安装程序,(网速慢的同学请移步国内镜像),然后按默认选项安装即可. 安装完成后,在开始菜单里找到“Git ...
- python assert使用说明
python assert断言的作用 python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假. assert断言语句的语法格式 判断a与1.b是否一致,msg类似备注 ...
- [contest 782] 9.7
[contest 782] 9.7 - XJOI 个人觉得温暖题啊,,,可是卡毛空间呀!!! T1 传送
- 一些input用法
//设定选中范围someInput.setSelectionRange(0, 2); //只读<input type="text" value="2" r ...
- 二十四、JAVA的NIO和IO的区别
一.JAVA的NIO和IO 1.NIO:面向缓冲区(buffer)(分为非阻塞模式IO和阻塞模式IO)组成部分:Channels管道,Buffers缓冲区,Selectors选择器 2.IO:面向流( ...
- 二、工作中常用的SQL优化
除了给table建立索引之外,保持良好的SQL语句编写. 1.通过变量的方式来设置参数 比如动态查询的时候,尽量这样写 好:string strSql=" SELECT * FROM PEO ...
- Hadoop--单点故障修复
nameNode单点故障修复 1.启动虚拟机,启动集群 此时我们将主机hadoop1关机(断掉主机),开始抢救: 1.使用 秘书(secondaryNameNode),成功率不是100% (这里我 ...
- js 时间戳转特定格式的日期
var Tools = {}; Tools.formatDate = function (fmt,timestamp) { if(timestamp){ var date = new Date(par ...
- Python3+pdfminer+jieba+wordcloud+matplotlib生成词云(以深圳十三五规划纲要为例)
一.各库功能说明 pdfminer----用于读取pdf文件的内容,python3安装pdfminer3k jieba----用于中文分词 wordcloud----用于生成词云 matplotlib ...