p2p传输协议是怎么实现两个不在同一个局域网的内网IP的通信的呢?

您所在的位置: &
QQ通信原理及QQ是怎么穿透内网进行通信的?(2)
QQ通信原理及QQ是怎么穿透内网进行通信的?(2)
QQ是一个基于TCP/UDP协议的通讯软件。QQ的通信的原理是什么?QQ是怎样穿透内网进行通信的?本文将从登陆和聊天消息通信两方面为你解答。
呵呵,上面的基础知识可能很多人都知道了,那么下面是关键的部分了。
看看下面的情况:
接上面的例子,如果Client A的原来那个Socket(绑定了1234端口的那个UDP Socket)又接着向另外一个Server S2发送了一个UDP包,那么这个UDP包在通过NAT时会怎么样呢?
这时可能会有两种情况发生,一种是NAT再次创建一个Session,并且再次为这个Session分配一个端口号(比如:62001)。另外一种是NAT再次创建一个Session,但是不会新分配一个端口号,而是用原来分配的端口号62000。前一种NAT叫做SymmetricNAT,后一种叫做ConeNAT。我们期望我们的NAT是第二种,呵呵,如果你的NAT刚好是第一种,那么很可能会有很多P2P软件失灵。(可以庆幸的是,现在绝大多数的NAT属于后者,即Cone NAT)
好了,我们看到,通过NAT,子网内的计算机向外连结是很容易的(NAT相当于透明的,子网内的和外网的计算机不用知道NAT的情况)。
但是如果外部的计算机想访问子网内的计算机就比较困难了(而这正是P2P所需要的)。
那么我们如果想从外部发送一个数据报给内网的计算机有什么办法呢?首先,我们必须在内网的NAT上打上一个&洞&(也就是前面我们说的在NAT上建立一个Session),这个洞不能由外部来打,只能由内网内的主机来打。而且这个洞是有方向的,比如从内部某台主机(比如:192.168.0.10)向外部的某个IP(比如:219.237.60.1)发送一个UDP包,那么就在这个内网的NAT设备上打了一个方向为219.237.60.1的&洞&,(这就是称为UDP HolePunching的技术)以后219.237.60.1就可以通过这个洞与内网的192.168.0.10联系了。(但是其他的IP不能利用这个洞)。
呵呵,现在该轮到我们的正题P2P了。有了上面的理论,实现两个内网的主机通讯就差最后一步了:两边都无法主动发出连接请求,谁也不知道谁的公网地址,那我们如何来打这个洞呢?我们需要一个中间人来联系这两个内网主机。
现在我们来看看一个P2P软件的流程,以下图为例:
Server S (219.237.60.1)
+-----------------------+----------------------+
NAT A (外网IP:202.187.45.3) NAT B (外网IP:187.34.1.56)
| (内网IP:192.168.0.1) | (内网IP:192.168.0.1)
Client A (192.168.0.20:60000) Client B (192.168.0.10:40000)
首先,Client A登录服务器,NAT A为这次的Session分配了一个端口60000,那么ServerS收到的Client A的地址是202.187.45.3:60000,这就是Client A的外网地址了。同样,ClientB登录Server S,NAT B给此次Session分配的端口是40000,那么ServerS收到的B的地址是187.34.1.56:40000。
此时,Client A与Client B都可以与ServerS通信了。如果Client A此时想直接发送信息给Client B,那么他可以从ServerS那儿获得B的公网地址187.34.1.56:40000,是不是Client A向这个地址发送信息ClientB就能收到了呢?答案是不行,因为如果这样发送信息,NATB会将这个信息丢弃(因为这样的信息是不请自来的,为了安全,大多数NAT都会执行丢弃动作)。那该怎么办呢? 首先我们假设Server S是219.237.60.1:7000,当Clinet A(202.187.45.3:60000)向Server S(219.237.60.1:7000)发送数据包,Server S是可以正常接收到数据,因为它是属于外型开放的服务器端口。当Server S收到数据包后可以获知Clinet A(202.187.45.3:60000)对外通信的临时session信息(这个叫临时的端口,假设是60000会过期,具体时间不同,一般是每30S发送一个keep住连接以保证端口维持通信连接不断)Server S此时应将次信息保存起来。而同时,Client B (192.168.0.10:40000)也在时刻向
Server S发送心跳包,Server S就向Client B (192.168.0.10:40000)发送一个通知,让Client B (192.168.0.10:4000) 发送探测包(这个数据包最好发几个),Client B (192.168.0.10:4000)在收到通知后在向Server S发送反馈包,说明以向自己以向Client A (192.168.0.20:60000)发送了探测包,Server S在收到反馈之后再向Client A (192.168.0.20:60000)转发反馈包,Client A (192.168.0.20:60000)在收到数据包之后在向原本要求请求的Client B (192.168.0.10:4000)发送数据包,此时连接已经打通,实现穿透。Client B (192.168.0.10:4000)会将数据包转发给
Client A (192.168.0.20:60000)从而在转发给内网内网IP:192.168.0.1。
对于Symmetric NAPT的情况,网上有人说可以通过探测端口的方式,不过成功率并不高,我建议可用服务器进行中转。另外,最好在数据包发送前先检测是否进行的是同个NAT的情况,也就是内网发内网,如果是,直接发送即可,而无需通过外网再绕回来。
ps:探测包其实就是为了在双方的NAT上建立session,比如A要发给B,但B在NAT上找不到session,就会把包丢弃;但A通过发这个探测包,会在自己所在的ANT上建session。同理,B也发探测包。当然,这种探测包一般会发好几次,直到对方应答。所谓的心跳包,其实就是为了让session保持活动,不至于被NAT清除。
【编辑推荐】
【责任编辑: TEL:(010)】
内容导航&第 1 页: &第 2 页:
关于&&的更多文章
2013年是中国通信业具有阶段性历史意义的一年,这一年年末,期盼
随着云计算、物联网、大数据、移动互联网的大发展,你应该知道这些。
讲师: 0人学习过讲师: 53人学习过讲师: 4人学习过
思科统一计算系统(UCS)和服务器将计算、网络、管理、
就终端用户的满意度和生产率而言,提高关键业务及时延
当下,软件与应用也已成为CIO部署、发展其基础架构时
《程序员密码学》涉及密码学的各个研究方向,分组密码、散列函数、公钥密码以及相关的攻击,同时也讲解了密码学算法实现上常用的
51CTO旗下网站查看: 166396|回复: 324
内网穿透教程:让你的内网机器实现远程访问(完工)
主题帖子积分
本帖最后由 小宝 于
21:22 编辑
此教程最后一步,在路由器配置脚本那一段,已经集成于路由器.亲们直接使用路由器的界面配置就好了!&&by小宝.
为什么我们要用内网穿透:
1、大前提,你有需要远程访问的机器,对于大部分的人群来说,需要会远程访问的服务可能会是NAS、路由器管理
(什么,你想远程控制电脑?远程开机?很遗憾,这个教程让你穿透了你也得配合其他东西,比较复杂,不在讨论范畴)
什么是NAS?群晖为代表的家庭云,可能是在线电影,建立自己的私人Cloud文件保存服务器,也有可能是远程记事本(黑群晖教程:)
nas1.jpg (52.07 KB, 下载次数: 13)
18:27 上传
↑白群晖(正版,这款台湾1900,国行),同样性能的盗版大概是600-700元
2、你身处大中华局域网无法直接做花生壳解析(如果外网IP,其实不用看这个教程了,直接在群晖外部访问做个花生壳就好了)——如果有需求再额外做教程
因为现在的IPV4 IP段越来越稀少,所以不单单是普通小运营商,连电信联通都逐步的加入到将用户丢到私有IP里(当然你可以电话投诉将你丢出去外网IP,但是相对麻烦,也不是每个地区的投诉有用)————注:很多地方是直接外网IP无法双拨叠加带宽,可申请进入内网IP后获得双拨带宽,例如我(),这时候也有需要用到内网的解析。
OK,符合以上的,你远程访问的需求了(第一点),又因为被锁在内网里(第二点)。那么看下去吧
----------------------------------------华丽的分割线----------------------------------------------
我们怎么做内网穿透?
现在内网穿透比较出名的是花生棒内网版,NAT123穿透,但是他们的缺点也很明显,贵(特别贵在你需要穿透N个端口的时候,价格是成倍的叠加)
OK,还有一个高端人士使用的穿透工具,也就是我们今天要探讨的主角“ngrok”
比较麻烦的是这玩意网上教程相对都是很简单(摔桌子,都是大神写的,都是默认的认为,我擦,这么简单的道理肯定都会,我就不说这个流程了)
经过这2天小宝大神的教导,终于给我这个小白学会了怎么使用,故来和大家说一说
----------------------------------------华丽的分割线----------------------------------------------
提前准备的东西:
怎么获得?直接去阿里云购买,选择最便宜的,买一年只要5元。()(有钱任性随便),域名买好了放在那,怎么设置从操作步骤中说吧,不在这里说了。
yuming.jpg (58.94 KB, 下载次数: 5)
14:07 上传
虚拟服务器,不要买国内的,国内的需要备案80端口,个人很麻烦,咱们也不对外做网站,所以直接选择香港的或者美国的。
()——香港
() ——香港,性价比挺高的(3个月8美刀)(可以架SS+内网穿透一起,值这票价)
()——美国搬瓦工,便宜但是的确慢。。。
需要欧美的(例如有些服务,游戏只接受欧美),看这里推荐:
香港的速度好点,但是贵点,美国的便宜,速度慢点。还有狠多其他的选择。
以搬瓦工(美国)的为例-其他的vps管理大同小异,注册,选择你需要的然后购买,可以直接支付宝支付,购买完登陆帐号如下图操作,点services
vps1.jpg (47.96 KB, 下载次数: 116)
14:19 上传
进入下图后(左边涂掉的是我的IP,每个vps一个固定IP),选择右边的KiwiVM Control Panel按钮进入服务器管理
vps2.jpg (29.91 KB, 下载次数: 3)
14:21 上传
进入你的操作管理窗口后点左侧的导航栏,install new os,选择右边框好的系统(这个系统回头也可以装SS)——如有需要另外一个文章再说
vps3.jpg (73.33 KB, 下载次数: 3)
14:23 上传
OK,安装好系统他会蹦出来一个IP,一个端口,一个密码给到你,这个就是以后你用来ssh连接服务器(winscp也是)的信息了,绝对不要遗忘,遗忘就要重装系统了。
3、一台路由器,不一定非得是能刷小宝系统的,但是得是可以ssh进去路由,路由有可以执行穿透程序的ROM。(So,你是R6200之类的也是可以的,TP什么的应该也没问题,)
----------------------------------------华丽的分割线----------------------------------------------
服务器正式步骤:
1、登陆阿里云后台,选择你的域名进行解析
yuming2.jpg (59.79 KB, 下载次数: 2)
15:02 上传
2、(以阿里云DNS为例)进入解析后台,点击添加新解析,在主机记录那填*(作用就是等会的设置你写什么域名他就生效什么),然后记录值写你的服务器IP,保存OK,域名设置完成(泛解析)
yuming3.jpg (48.66 KB, 下载次数: 4)
15:03 上传
3、下载Putty用来连接服务器,获得方法,百度搜索,即可(记得取消掉安装百度杀毒软件)
putty.jpg (51.77 KB, 下载次数: 4)
14:49 上传
4、执行(绿色文件),在服务器里输入你的vps ip,port输入端口号,点下面Open
putty2.jpg (63.15 KB, 下载次数: 3)
14:51 上传
5、打开Putty的终端。输入帐号root,然后复制你的密码,在窗口里右键一次即可(由于linux的机制,此处不显示*),回车即可连接到你的VPS
putty3.jpg (25.34 KB, 下载次数: 3)
14:54 上传
6、复制下面的代码丢到窗口里wget -q --no-check-certificate&&https://koolshare.github.io/ngrokd/install.sh -O install.sh复制代码,回车,会自动下载小宝出品一键安装包,下载完毕输入sh install.sh,然后输入下你购买的域名(不需要www,只要)
(本来有很多步骤的,但是给小宝直接浓缩了一个一键安装,鼓掌)
如果出现错误提示(一般是端口被占用导致),使用winscp(百度输入,安装),进入服务器根目录执行下config.sh修改下端口(为什么这里没教,因为一般服务器都是不会有占用端口,既然会端口的说明已经架设过服务,会架设服务的人不需要看WINSCP软件使用介绍了)
端口被占用是因为自动脚本里有这么一个代码
./bin/ngrokd -domain=&& -httpAddr=&:80& -httpsAddr=&:443& -tlsCrt=device.crt -tlsKey=device.key -tunnelAddr=&:4443& &font color=&#ff0000&&-pass=&xxxx&&/font&复制代码
而这个代码会用到http 80 443 htts tunnel(接路由器) 4443 的几个接口,So,一般可能都是80端口被占用,如果不行的同学就修改config里的80为其他的就好了(例如,8080)——如果是国内VPS那就要设置http 80为其他,然后对应的所有访问都要跟个:8080,例如:8080,标红的地方为新版的程序额外的加密方法,如果你想给你的服务器加密请在这里输入你需要的密码
----------------------------------------华丽的分割线----------------------------------------------
路由器设置环节:
0、确定以上环节没有问题,如果成功了如下图展示,没成功的话一般是端口问题,防火墙问题之类,到时候往下贴问题再解答
可以直接看这里:
1、进入路由开启JJFS,重启路由(第一次将上面的格式化也勾上)
QQ截图56.jpg (23.88 KB, 下载次数: 5)
20:29 上传
2、打开Winscp,连接路由器,如下图,选择文件协议为SCP,然后输入路由地址,登陆帐号密码
QQ截图01.jpg (43.84 KB, 下载次数: 5)
20:28 上传
3、下载文件(链接: 密码:a4j5),解压,会出来2个文件,json和tunnel,上传至路由根目录的JFFS目录里(可以改名,默认是default.json,注意文件权限,全部可读可写。
QQ截图10.jpg (50.29 KB, 下载次数: 3)
20:32 上传
QQ图片27.png (10.97 KB, 下载次数: 5)
22:59 上传
QQ截图10.jpg (37.37 KB, 下载次数: 3)
22:59 上传
4、双击json文件,会弹出编辑框来让你修改(下面的图里的auth是密码,如果你设置了服务器上有密码,那么这里你要在auth的引号区间里面填进去密码)
QQ截图20.jpg (44.63 KB, 下载次数: 2)
20:35 上传
详细介绍下这里,这里的作用其实很简单,就是配置端口映射了,上面一段仅需要修改server为VPS的域名,除非你冲突了。
各项参数解释:
proto: 端口协议解释:目前这个支持比较良好的协议有http和tcp,群晖和路由远程管理用的都是http,subdomain为二级域名,随便你起名,反正你前面已经用了*做泛域名解析了。
*注意:proto可选的协议仅有http https tcp
localhost:本地设备IP地址
localport:本地设备端口
*remoteport:远端端口
注意:在使用tcp协议的时候可以指定远程服务器开放的端口,映射关系为ip:remoteport & -- & localhost:localport
说明,比如说我这里的2个http协议一个是a域名一个是b域名,访问的时候他将会直接到我197这个机器(nas)上的5000端口,访问他会访问另外个局域网(路由器)的80端口
而每个端口都有对应的作用,例如下图是群晖的端口介绍(其实群晖的https都是http端口),没有特别标注的http端口都是tcp的
QQ截图47.jpg (82.49 KB, 下载次数: 5)
20:40 上传
继续举栗:我想在我的手机端里群晖PHOTO APP能用,那么我就是这么操作
& && && && && & &proto&: &tcp&,
& && && && && & &subdomain&: &&,
& && && && && & &localhost&: &10.0.0.197&,
& && && && && & &localport&: 80,
& && && && && & remoteport&: 12345
& && &&&},
然后在手机app里输入:12345为访问地址了(主要是手机端APP用),(注:切记,tcp的格式是有区别的,而且不能直接映射,需要做个假跳)而且localport后面要跟个英文&,&
以此类推,可以建立多个tcp映射,最后一个的}后不用跟“,&了,应为tcp是不用域名来区分的,所以直接以你http最开始设置的域名为访问二级域名就可以了。
OK,配置好以上的文件后保存,然后进入下一步骤了
5、打开路由的SSH功能,如下图,如果你是ddwrt、opnewrt也无所谓,只要有就可以了
6、使用putty连接路由器,和上面连接vps一样,只不过的差别在连接的IP是你路由访问IP,输入的帐号是admin,密码是你登陆路由管理的密码,端口是你路由设置SSH的时候下面那个数字。
7、输入
cd /jffs复制代码
QQ截图36.jpg (18.57 KB, 下载次数: 4)
20:49 上传
8、输入以下代码即可运行了,一切无错的话,你的端口映射成功了,可以尝试下按照你的json来定义的端口访问了
./tunnel -c &span style=&color: rgb(102, 102, 102); line-height: 22.4 background-color: rgb(249, 249, 249);&&default&/span&.json -p /tmp/tunnel.pid复制代码
9、我是来介绍下重启后怎么办的
如VPS重启了,那么请用putty进入到vps根目录后,运行“sh install.sh”。
如果路由重启了,那么请如上所说运行一次./tunnel -c defaut.json -p /tmp/tunnel.pid
如果嫌麻烦,那么写到你的vps和路由的开机执行命令里也是可以的
----------------------------------------销魂的分割线----------------------------------------------
实际运用环节:
我只拿我自己来做举例吧,我为什么会使用这个玩意,上面说的,首先我在网内,但是我有着控制路由的需求,家妻经常在我出差后看小说电影之类不睡觉,我会远程关掉路由
然后我有需求会手机访问我的NAS来获得一些文件,或者WEB端 访问群晖管理或者pc端访问群辉的cloud文件,SO,又有需求了
QQ截图22.jpg (109.48 KB, 下载次数: 0)
20:57 上传
ds video app用的是http 端口5000,直接设置好访问即可(和群晖web管理页面同一个,访问上后手机可以直接看了),当然在家里的话还是直接局域网访问,外网的话你的vps给力的话,你也可以当成在线影院了。
QQ截图08.jpg (49.32 KB, 下载次数: 2)
12:56 上传
QQ截图39.jpg (45.8 KB, 下载次数: 3)
12:53 上传
而下面的photo,他用的就是tcp端口了,需要用到和我上面说的端口对端口跳转
QQ截图57.jpg (50.6 KB, 下载次数: 3)
12:56 上传
其实每个人的需求都不一样,这只是我的一些玩法,也是我认为最重要的作用。文章就写到这里了,不定期会对文章的回复提出的疑问进行解答更新。
zl3301兄弟这么问道:
问题是白裙有 quickconnet,黑裙3322,花生壳,甚至于梅林都可以用 asuscomm,端口转发下就好。**么 ss,好像没有 LZ 介绍的那么复杂吧?甚至于用 Teamviewer 都可以操控。
白群直接quickconnet就好了。
但是黑裙的话,你没有外网iP(这个是趋势,越来越多人没外网IP),根本花生壳公网版用不了。
花生棒内网贵,映射多几个端口的钱你可以买一个很好的vps了。
open v pn之类的也是一个前提,有外网IP。然后SS和内网映射不是一个回事。
这样做的内网穿透,数据经由vps做第三方转发吗,如果是使用video station会怎么样?
流量跑VPS的,速度快慢取决VPS带宽,p2p直连的小宝在研究,但是可能会非常的麻烦
<p id="rate_55649_1" onmouseover="showTip(this)" tip="很给力!&魔力币 + 200
" class="mtn mbn">
主题帖子积分
高级魔法师, 积分 648, 距离下一级还需 352 积分
板凳先坐了
主题帖子积分
高级魔法师, 积分 595, 距离下一级还需 405 积分
学习一下,还没有玩过呢
主题帖子积分
初级魔法师, 积分 155, 距离下一级还需 45 积分
好的 先码上
主题帖子积分
初级魔法师, 积分 125, 距离下一级还需 75 积分
支持一个...这个很需要...
主题帖子积分
中级魔法师, 积分 294, 距离下一级还需 206 积分
这个很实用可以有!
主题帖子积分
初级魔法师, 积分 133, 距离下一级还需 67 积分
学习学习。。
主题帖子积分
门户文章20
魔力币5794
坐等补全。
主题帖子积分
高级魔法师, 积分 780, 距离下一级还需 220 积分
这个不错,支持下,得自己买个VPS
主题帖子积分
高级魔法师, 积分 821, 距离下一级还需 179 积分
这么一首好贴,先收藏了。
主题帖子积分
魔力币3996
写得最近看着最爽眼的文章了。
主题帖子积分
大魔法师, 积分 1073, 距离下一级还需 927 积分
魔力币1009
先mark~~~暂时不折腾这个~嘿嘿
主题帖子积分
中级魔法师, 积分 426, 距离下一级还需 74 积分
很详细的教程,谢谢
主题帖子积分
中级魔法师, 积分 351, 距离下一级还需 149 积分
教程很详细,先收了再说,多谢楼主
主题帖子积分
中级魔法师, 积分 386, 距离下一级还需 114 积分
请教一下,这个配置完了以后怎么连回路由做V P N?
主题帖子积分
请教一下,这个配置完了以后怎么连回路由做V P N?
VP N?内网穿透还是什么?没太看懂
如果你指的**是内网穿透,那么配置完了,就可以访问了
如果你指VP N是F墙的,那没冲突
主题帖子积分
中级魔法师, 积分 386, 距离下一级还需 114 积分
本帖最后由 wssjy1234 于
02:53 编辑
我是想让路由做v pn服务器,自己在外面的时候能连回家里
主题帖子积分
初级魔导师, 积分 2255, 距离下一级还需 1245 积分
魔力币1072
这样做的内网穿透,数据经由vps做第三方转发吗,如果是使用video station会怎么样?
主题帖子积分
本帖最后由 月亮上梦游 于
08:53 编辑
这样做的内网穿透,数据经由vps做第三方转发吗,如果是使用video station会怎么样?
会流量跑VPS,速度快慢取决VPS带宽
手机端的video station端口是http的5000,和web端的管理页面同一个端口,开放了5000端口后用5000端口对应域名即可访问video station
主题帖子积分
高级魔法师, 积分 657, 距离下一级还需 343 积分
实用教程& &感谢~~~
DDOS纪念勋章
DDOS纪念勋章
Powered by本帖子已过去太久远了,不再提供回复功能。Google提供的广告2011年12月 硬件/嵌入开发大版内专家分月排行榜第三2011年10月 硬件/嵌入开发大版内专家分月排行榜第三2011年6月 硬件/嵌入开发大版内专家分月排行榜第三
2011年12月 硬件/嵌入开发大版内专家分月排行榜第三2011年10月 硬件/嵌入开发大版内专家分月排行榜第三2011年6月 硬件/嵌入开发大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 p2p文件传输 的文章

 

随机推荐