转自:http://blog.csdn.net/lithe/article/details/525207

由于内网用户无法提供一个对外的端口,所以无法做服务器.但用BT的时候,发现它可以让内网用户做 Send,作为程序员就忍不住下载了它的源代码分析了一把(为了看它,还专门去写了一下Python:})

比起其它的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/announc...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:intervali1800e5 eersld2:ip14:xxx.xxx.xx.xxx7 eer id20:00180531904b7e3abdd74 orti6881eeee
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的确要比公网用户要慢很多.于是有了下面的

内网提速大法

了解了原理我们就有解决的方法,不就是外面的人找不到我们吗,让他们找到不就行了
终极武器 NAT --端口映像(又叫网络地址翻译) 其原理这里就不说了(其实也不是很复杂), 其作用是让服务器把指定端口的请求转发到指定的IP上,让其它的机器来响应这些请求,而内网向外网发送的时候不再是像其它网关服务那样随机分配端口,而是用上面指定的端口

可以用的软件有 
WinRoute Pro 
PortTunnel
软件下载和使用方法见  http://www.pconline.com.cn/pcedu/so...1/127157_2.html

但如果你的服务器是 win2000,并用自带的网络共享功能,那么有更简单的方法
在你共享的连接上按右键 ->属性
到公用设定板按下面的设定按钮,系统会弹出设置窗口
到服务板,按新增
名称 随便填
端口 6881
勾选TCP
私人网络中的计算机名称或ip 填你的本机ip 
然后保存,再按同样的方法增加 6882-6889端口的映像,把它们通通指向你的计算机
(因为我的系统是繁体系统,所以以上的名称不一定和你的相同)
不明白的可以看看WIn2000帮助系统中有关 NAT的说明

用了端口映射后,只有你一个人爽,其它人还是老样子(包括服务器) ,不过你可以搞一台BT下载专用机 
现在享受以下速度的快感吧

BT的缺点:
1 用Python编写,须然可以跨平台,但再Windows下耗资源比较多,特别是服务器应该考虑用C重写 track  www.torrentse.cx 好像已经这样做(其返回得东西和标准的不大一样),但是不是重写不得而知.

2 track 碰到内网Seed的时候,应该把 interval 设小一点
3 正在想.......

BT 运行及内网穿透原理相关推荐

  1. 内网穿透原理和实现思路介绍

    内网穿透技术,简单理解就是将内网的服务映射到公网中,这样可以随时随地访问. 那什么是内网?什么是公网?先从这个基本概念来简单介绍吧 1. 公网.内网和外网 首先声明,公网.内网和外网这几个概念,不是专 ...

  2. ngrok内网穿透原理分析和实现

    转载: ngrok内网穿透原理分析和实现 在互联网终端急剧增长的今天,公网ip已经成为稀缺资源,对于国内垄断的电信运营商来讲,更是不可能随便免费给你一个公网ip,许多家庭宽带都无法分配到 公网ip,又 ...

  3. frp内网穿透原理及配置应用

    1 Frp介绍 frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP.UDP.HTTP.HTTPS 等多种协议.可以将内网服务以安全.便捷的方式通过具有公网 IP 节点的中转暴露到公网. ...

  4. 内网穿透原理,以及用花生壳实现内网穿透

    在做自学项目部署nginx的时候,nginx部署在阿里云服务器上,项目在本地,阿里云的nginx无法访问到本地的ip,所以需要做一下内网穿透.记录一下 什么是内网穿透? 内网和外网的概念: 内网:即所 ...

  5. 大白话告诉你内网穿透原理和验证

    内网穿透到底干啥的这里不做详述,这篇文章主要是讲这玩意怎么做的 分析 网上有很多原理图,但是说实话鄙人天资愚钝没咋看懂,在网上疯狂百度和个人的验证之后,得出如下简图 其实很简单 想让我们内网的服务能被 ...

  6. 内网穿透实现原理及三种实现方式

    1.操作系统 Deepin - 基于Linux的开源国产操作系统(软件生态好,缺点不够流畅) 官网 Ubuntu | 全球领先的用于个人电脑.平板及手机的操作系统 我使用的版本 Ubuntu乌班图-桌 ...

  7. ZEROTIER ONE实现内网穿透

    原文链接:https://post.smzdm.com/p/741270/ 原文链接:https://www.jianshu.com/p/77abb0a64a82 传统的内网穿透: 内网设备<- ...

  8. 【转载】无公网IP搞定群晖+ZEROTIER ONE实现内网穿透

    前言 最近刚开始折腾群晖,从5.2到6.0再到5.2再到6.1,期间过程曲折复杂,血泪交融,参考了无数文章,重启了无数次机器,拷贝了无数文件,以及损失了无数数据.再次提醒大家,数据一定要做好备份,一定 ...

  9. 【技术备忘录】广和通ADP-L610-Arduino模块实现基于内网穿透的TCP通信

    前言 ​ 在使用ADP-L610开发板进行开发过程中,如果需要使用TCP通信,那么往往需要本地机器具有公网IP或者是准备一台具有公网IP的云服务器(或者VPS),这往往是需要成本的.现在公网IPv4地 ...

  10. 内网安全:内网穿透详解

    目录 内网穿透技术 内网穿透原理 实验环境 内网穿透项目 内网穿透:Ngrok 配置服务端 客户端配置 客户端生成后门,等待目标上线 内网穿透:Frp 客户端服务端建立连接 MSF生成后门,等待上线 ...

最新文章

  1. Ansible常用模块介绍及使用
  2. VB.NET开发人员必备参考10本书目
  3. linux下tomcat的安装和配置
  4. EXT.NET复杂布局(四)——系统首页设计(下)
  5. FLEX XMLLIST 详解
  6. IOS autosizing(设置控件的固定位置大小)
  7. php post 302,php – Laravel 5.2 Post 302重定向到GET
  8. LeetCode之猜数字大小
  9. win7连接共享打印机时安装驱动程序出现0x00000bcb错误
  10. 【Unity3D】【UI】Cannot restructure Prefab instance.
  11. CCF优秀博士学位论文奖初评名单出炉!清华入选4人,数量第一
  12. 诚风老师-直销立法十年 直销企业迎来新机遇
  13. pvs安装配置_配置警告下一代插件以与PVS-Studio集成
  14. [jzoj 4249] 【五校联考7day1】游戏 {贪心/斜率优化}
  15. Linux 内核同步(一):原子操作
  16. us news2017计算机科学,2017年USNews最新美国大学计算机专业研究生排名TOP120
  17. Linux:安装和配置tomcat详细教程
  18. 手机信号塔机房里的服务器,各种通信铁塔和机房类型介绍,别再傻傻分不清了...
  19. 一个大四前端实习生的2018年总结
  20. (笔记))oracle SCN 异常增长问题 以及 ORA-19706

热门文章

  1. 最好用的视频压缩软件压缩教程
  2. [二进制学习笔记]LibcSearcher报错no matched libc
  3. openwrt路由器打印机服务器设置_OpenWRT路由器——网络打印服务器
  4. vmd安装包_VMD分子模拟软件下载
  5. Could not find conduit initiator for address
  6. 用计算机弹音乐的歌谱《奇迹再现》,奇迹再现曲谱_奇迹再现的歌谱
  7. Django项目(五):注册模块—登录注册
  8. IDEA 2019 修改中文字体
  9. 计算机课堂活跃小游戏,几个课堂小游戏(能活跃课堂气氛)
  10. “出轨照”背后的真相:防骗启示录之相册病毒报告