一直对p2p都感觉很神秘,第一次听p2p还是快播被抓的时候,才听过p2p,然后一直都觉得p2p比较牛,现在蹭着学习King老师的课程,来总结一下。
1. p2p介绍
现在服务器框架有两种方式,一种是BS,一种是CS,这两种方式都是使用了服务器。
B/S结构(Browser/Server,浏览器/服务器模式),客户机上只要安装一个浏览器(Browser),如谷歌,服务器安装Oracle、Sybase、Informix或 SQL Server等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。
C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或 SQL Server。客户端需要安装专用的客户端软件。
这两种方式都是使用了服务器,把服务器当做中心,有服务器的网络拓补图:
客户端跟客户端通信就要通过服务器转发,然而去中心化就比较牛逼了,他可以跳过服务器,可以客户端直接跟客户端通信,减轻了服务器的负担,去中心化的拓补图:
2. 网络地址映射NAT
NAT:Network Address Tranfrom,网络地址映射,NAT的主要作用将公网地址映射为私网地址,我们路由器下面的机器,都是192.168.1.2都是内网IP的,怎么样才能让公网的IP访问到私网的机器呢,就是因为有NAT,NAT把公网地址映射到私网的地址上,这样才能进行通信。
如图所示:192.168.1.23的机器被NAT映射成112.93.114.32:23432的地址,这个地址是可以跟公网服务器直接通信的地址。这就是NAT。
2.1 NAT实现
NAT的实现方案有三种:静态转换,动态转换,端口地址映射。
2.2 静态转换
静态转换看名字就知道是静态的,其实还真是,这个是私网地址和公网地址一对一配置,配置后是不能更改的。因为是固定的,所以并不节省公网IP地址,所以一般不使用。
2.3 动态转换
为私网分配多个公网IP,这些IP组成一个公网的IP地址池,如果使用通信的时候,会从IP地址池里面获取到数据,然后分配给私网机器用于通信,通信完成之后,IP地址池会回收IP地址。
2.4 端口地址映射
私网内部所有主机共享一个IP地址,这是不同的主机使用的端口号不一样,这样形成一种映射。这样能最大限制的节约了IP地址资源,同时也隐藏了私网中所有主机。这种是目前使用最多的一种方式,我们路由器就是这样。
3. NAT种类
NAT从技术的角度可以分为三类:静态转换,动态转换,端口地址映射。
从功能上划分可以分为四类:完全锥形,对称NAT,IP限制NAT,端口限制NAT。
3.1 完全锥形NAT
私网中的一个网络进程被NAT映射到公网地址之后,公网上任何一台服务器往这个端口发送,私网网络进程都可以接受到数据。
3.2 对称NAT
私网机器一个网络进程每与一台公网机器通信,都会重新分配一个地址端口。(穿透时也比较麻烦)
3.3 IP限制锥形NAT
只允许映射关系表中对应的公网IP地址发送数据到私网机器,其他公网IP地址会被路由器丢弃。如果先由私网机器发送报文到公网机器,限制锥形NAT路由器就会自动生成映射关系表,这样公网机器就可以访问到私网的机器了。
3.4 端口限制锥形NAT
在IP限制锥形NAT的基础上,又添加了一层端口限制,限制了发送报文到私网的IP地址和端口。如果由私网地址先发送数据到公网机器的其他端口的话,也会自动形成一个记录,这样会允许该端口发送报文到私网机器。
4. 如何判断网关类型
我们已经了解了NAT有四种类型,那如何判断一个NAT是哪种类型呢?我们可以借助那个二叉树的格式,逐一判断:
4.1 对称NAT和锥形NAT
这个判断比较简单,先复习一个啥是对称NAT,对称NAT就是每次跟服务器通信都会重新分配一个地址端口,而锥形NAT就是固定一个,所以我们要利用这个方式去测试。
准备两台服务器,一台客户端,然后下面我说步骤:
步骤1:客户端往服务器1发送数据,这是服务器1获取到了客户端的NAT地址
步骤2:客户端往服务器2发送数据,这是服务器2获取到客户端的NAT地址
步骤3:服务器1把客户端的NAT地址发送给服务器2,服务器2对比一下两个IP地址是否一样,如果一样则为锥形NAT,否则为对称NAT。
4.2 完全锥形NAT和限制锥形NAT
完全锥形NAT是不限制公网IP地址的,而限制锥形NAT是有限制的。
步骤1:服务器1往客户端发送数据
步骤2:客户端收到服务器1的数据之后返回一个回答
步骤3:服务器1把接收的客户端的NAT地址发送给服务器2
步骤4:服务器2使用这个客户端的NAT地址往客户端发送数据
步骤5:如果能接收到服务器2的数据,就往服务器1发送(则为完全锥形NAT)
如果接收不到服务器2的数据,也就不往服务1发送数据(为限制锥形NAT)
4.3 IP锥形NAT和端口限制锥形NAT
这个就比较简单了,一台服务器一台客户端
步骤一:客户端往服务器一个端口发送数据,这个端口接收到数据之后,用另外一个端口发送数据给客户端
步骤二:如果客户端能收到另外一个端口发送的数据,为IP锥形NAT,如果接收不到数据为限制锥形NAT
步骤三,客户端接收到数据之后,会发送数据给服务器的第一个端口,如果服务器能接收到数据为IP地址限制NAT,否则为端口限制NAT。
5. 如何穿透
讲了这么多,终于来到我们的重点知识了,如何穿透,穿透的本质其实是两个网关相互发送数据,而不经过服务器。
经过上面介绍,我们有4种网关类型,两边的话就有16种,难道我们要穿透16种么,其实不然,我们可以总结一下:
完全锥形 完全锥形
IP限制锥形 IP限制锥形
端口限制锥形 端口限制锥形
对称NAT 对称NAT
因为完全锥形的IP地址固定,并且不限制服务器地址,所以比较好穿透,
5.1 任何一边是完全锥形
穿透的过程就是一台服务器,然后两台客户端在网关下,我们现在是要穿透成功的话,就可以两个网关相互发送消息了。
如图,NAT1是完全锥形NAT,NAT2是任意一种:
步骤1:NAT1发送数据到服务器,服务器获取到NAT1的地址。
步骤2:服务器把NAT1的地址发送给NAT2
步骤3:NAT2直接发送数据给NAT1,因为NAT1是完全锥形NAT,是一个固定的IP,所以能接收到NAT2的数据,并且能获取到NAT2的IP地址。
步骤4:NAT1再直接发送数据到NAT2,这是NAT2能接收到数据(因为不管是哪种NAT,如果获取到IP地址之后,都可以直接发送数据)。然后穿透成功。
这样子16中NAT就减了7种,还剩下10种。
5.2 限制锥形NAT和限制锥形NAT
这个其实也不难,如图:NAT1和NAT2都是限制锥形NAT
步骤1:NAT1发送数据给服务器,服务接收数据后,能获取到NAT1的IP地址。
步骤2:服务器把NAT1的IP地址发送给NAT2。
步骤3:NAT2获取到服务器发送的NAT1地址,直接发送给NAT1。(这时候因为NAT1是限制锥形,所以没接收到数据,NAT2也是限制锥形,但是已经留下NAT1的记录)
步骤4:NAT2发送数据给服务器。
步骤5: 服务器把NAT2IP地址发送给NAT1.
步骤6:NAT1收到NAT2的数据之后,直接发送给NAT2。(NAT2已经有NAT1的记录了,所以能接收到数据)
步骤7:NAT2回复消息给NAT1。NAT1也能接收到数据。穿透成功。
这样子10中NAT就减了4种,还剩下7种。
5.3 任意一边为对称NAT
对称NAT比较麻烦,不同的公网机器的通信,都会直接分配一个新的映射端口。
如图:NAT1为限制锥形NAT,NAT2为对称NAT
步骤1:NAT1发送数据给服务器(8888端口)。服务器接收到数据之后,能获取到NAT1的IP地址。
步骤2:服务器(8888端口)往NAT2发送NAT1的IP地址。
步骤2-1:可以选加:这时候NAT2往服务器(8888端口发送数据)得出NAT2IP1
步骤3:NAT2直接往NAT1发送数据,这时NAT1为限制锥形,所以接收不到数据(如果是对称NAT也接收不到数据),这时候NAT2IP2。
步骤4:NAT2发送数据给服务器(8889端口),服务器(8889端口)能获取到NAT2IP3(又重新生成了一个新的ip)。
步骤5:服务器(8889端口)会把NAT2IP1和NAT2IP3发送给NAT1。
步骤6:NAT1根据NAT2IP1和NAT2IP3,推测出NAT2IP2,然后发送给NAT2,如果猜测成功,则穿透成功。
步骤7:NAT2接收到数据之后发送数据到NAT1,穿透成功。
这样子7中NAT就减了5种,还剩下3种。
最后一点写的不太好,因为涉及比较多的端口,和夹逼原则,用语言描述只能先这样了,以后有空分享一篇p2p源码的。