P2P

李先生 2021年03月05日 103次浏览

P2P

一、随着社会发展产生了那些问题

  • 直播:随着互联网的发展,人们已经不满足下载视频然后观看的传统观看模式,开始追求信息的实时性,直播行业开始突飞猛进的发展。但是直播需要同时讲数据分发给不同的人。假设有10个人看直播,那么就需要在同一时间内向10个人发送消息。那如果是1w人呢?10万人呢?甚至更多呢?所以问题就来了,随着直播人数的增加,对服务器的压力也是越来越大的。但是直播并不是每天每小时都会有这么大的访问量,所以只为了极限情况下去不断扩充服务器资源,显然是很不划算的,资本能允许不划算吗?显然不能
  • 文件传输:与直播领域大同小异,随着生活需要,网络传输的文件大小从最初几k的图片转换成几M的音乐直到现在动辄几G十几G的游戏等大文件。传统客户端与服务器一对一文件传输会导致某个客户端长时间占用服务器资源,并且当很多客户端一起下载时,并发也会给服务器带来的很大的压力。

二、P2P的引出

​ 经过对上面问题的分析,我们可以发现一个共同点,那就是这些客户端用到的数据都是相同的,就拿直播为例,不论是三个人看还是30个人看,他们看到的资源文件都是一样的,那么既然如此,为什么不能像日常生活中的传消息一样人传人呢?传统的下载方式就像是有一个人知道一个消息,然后后续的人想知道这个消息的话,那就一个一个过来问,然后这个人在一个一个人的回答,如果问的人多了。这个人还会烦。

​ P2P 不是P二P。应该念做P two P。是P to P的谐音叫法。P就是peer。所以也就是点到点的传输。相当于就是你有个消息,你告诉某一个之后,这个人就可以承担起跟你一样的责任,如果有其他人想要这个消息,那么也可以向他询问,这样的后果就是,使用的人越多,那么可以传递消息的人也越多,上面的问题是不是就可以解决了。

三、什么是P2P

百度搜索P2P,会发现很多什么互联金融的P2P,然后又是骗局又是爆雷什么的,我不是搞金融的,所以我不懂。今天说的这个P2P是计算机网络中的p2p。引用一下CSDN中的说法:

P2P是英文Peer-to-Peer(对等)的简称,又被称为“点对点”。“”。“对等”技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上。

四、如何p2p

1. p2p的实现主要是将子节点中的上传资源利用起来,让他不只作为消息的接受者,也担负起消息分发者的角色

2. 但是由于IPv4的ip是不够用的,所以很多设备都是用的NAT的方式进行私有ip地址的转换

NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。

这种方法需要在专用网(私网IP)连接到因特网(公网IP)的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址(公网IP地址)。这样,所有使用本地地址(私网IP地址)的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。

另外,这种通过使用少量的全球IP地址(公网IP地址)代表较多的私有IP地址的方式,将有助于减缓可用的IP地址空间的枯竭。在RFC 2663中有对NAT的说明。

3. 但是这种NAT转换后的私有ip地址是不可以直接作为我们的节点ip的

因为这种映射之后的ip地址在公网环境中是可以重复的,就相当于你们班有个叫张三的,隔壁班也有个叫张三的,一个学校外面来的快递说把东西给张三,门卫首先是懵逼的,所以门卫就把东西扔掉了。

4. 所以我们引出了穿透打洞的概念

穿透也就是说穿过NAT的封锁,打洞就是在A学校的你和B学校的她之间打一个“洞”,然后你们之后的消息只需要通过这个“洞”去传递就可以了。

5. 但是每个学校的门卫虽然都叫门卫(都是NAT),但是每个门卫的习惯也是不一样的(NAT类型不一样),所以不能直接去使用一套通用的规则去打洞,而是先需要去探探门卫的习惯如果,这个过程即是NAT类型探测了。

6. 经过了类型探测,我们摸出来门卫的性格,然后再进行了打洞(建立数据传输的联系),接下来就可以按照我们之前想要的,去进行p2p了

五、NAT类型探测

考虑到UDP的无状态特性,目前针对其的NAT实现大致可分为Full Cone(全锥形NAT)、Restricted Cone(限制锥形NAT)、Port Restricted Cone(端口限制锥形NAT)和Symmetric NAT(对称NAT)四种。值得指出的是,对于TCP协议而言,一般来说,目前NAT中针对TCP的实现基本上是一致的,其间并不存在太大差异,这是因为TCP协议本身便是面向连接的,因此无需考虑网络连接无状态所带来复杂性。

用语定义
1.内部Tuple:指内部主机的私有地址和端口号所构成的二元组,即内部主机所发送报文的源地址、端口所构成的二元组
2.外部Tuple:指内部Tuple经过NAT的源地址/端口转换之后,所获得的外部地址、端口所构成的二元组,即外部主机收到经NAT转换之后的报文时,它所看到的该报文的源地址(通常是NAT设备的地址)和源端口
3.目标Tuple:指外部主机的地址、端口所构成的二元组,即内部主机所发送报文的目标地址、端口所构成的二元组。

详细释义

  1. Full Cone NAT:所有来自同一 个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y,而不管这些请求是不是属于同一个应用或者是多个应用的。除此之外,当X-Y的转换关系建立之后,任意外部主机均可随时将Y中的地址和端口作为目标地址 和目标端口,向内部主机发送UDP报文,由于对外部请求的来源无任何限制,因此这种方式虽然足够简单,但却不那么安全

  2. Restricted Cone NAT: 它是Full Cone的受限版本:所有来自同一个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y,这与Full Cone相同,但不同的是,只有当内部主机曾经发送过报文给外部主机(假设其IP地址为Z)后,外部主机才能以Y中的信息作为目标地址和目标端口,向内部 主机发送UDP请求报文,这意味着,NAT设备只向内转发(目标地址/端口转换)那些来自于当前已知的外部主机的UDP报文,从而保障了外部请求来源的安 全性

  3. Port Restricted Cone NAT:它是Restricted Cone NAT的进一步受限版。只有当内部主机曾经发送过报文给外部主机(假设其IP地址为Z且端口为P)之后,外部主机才能以Y中的信息作为目标地址和目标端 口,向内部主机发送UDP报文,同时,其请求报文的源端口必须为P,这一要求进一步强化了对外部报文请求来源的限制,从而较Restrictd Cone更具安全性

  4. Symmetric NAT:这是一种比所有Cone NAT都要更为灵活的转换方式:在Cone NAT中,内部主机的内部Tuple与外部Tuple的转换映射关系是独立于内部主机所发出的UDP报文中的目标地址及端口的,即与目标Tuple无关; 在Symmetric NAT中,目标Tuple则成为了NAT设备建立转换关系的一个重要考量:只有来自于同一个内部Tuple 、且针对同一目标Tuple的请求才被NAT转换至同一个外部Tuple,否则的话,NAT将为之分配一个新的外部Tuple;打个比方,当内部主机以相 同的内部Tuple对2个不同的目标Tuple发送UDP报文时,此时NAT将会为内部主机分配两个不同的外部Tuple,并且建立起两个不同的内、外部 Tuple转换关系。与此同时,只有接收到了内部主机所发送的数据包的外部主机才能向内部主机返回UDP报文,这里对外部返回报文来源的限制是与Port Restricted Cone一致的。不难看出,如果说Full Cone是要求最宽松NAT UDP转换方式,那么,Symmetric NAT则是要求最严格的NAT方式,其不仅体现在转换关系的建立上,而且还体现在对外部报文来源的限制方面。

NAT类型检测流程

前提条件:有一个公网的Server并且绑定了两个公网IP(IP-1,IP-2)。这个Server做UDP监听(IP-1,Port-1),(IP-2,Port-2)并根据客户端的要求进行应答。

第一步:检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后?

客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端无法进行UDP通信,可能是防火墙或NAT阻止UDP通信,这样的客户端也就 不能P2P了(检测停止)。
当客户端能够接收到服务器的回应时,需要把服务器返回的客户端(IP,Port)和这个客户端socket的 (LocalIP,LocalPort)比较。如果完全相同则客户端不在NAT后,这样的客户端具有公网IP可以直接监听UDP端口接收数据进行通信(检 测停止)。否则客户端在NAT后要做进一步的NAT类型检测(继续)。

第二步:检测客户端NAT是否是Full Cone NAT?

客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用另一对(IP-2,Port-2)响应客户端的请求往回 发一个数据包,客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端的NAT不是一个Full Cone NAT,具体类型有待下一步检测(继续)。如果能够接受到服务器从(IP-2,Port-2)返回的应答UDP包,则说明客户端是一个Full Cone NAT,这样的客户端能够进行UDP-P2P通信(检测停止)。

第三步:检测客户端NAT是否是Symmetric NAT?

客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程直到收到回应(一定能够收到,因为第一步保证了这个客户端可以进行UDP通信)。
用同样的方法用一个socket向服务器的(IP-2,Port-2)发送数据包要求服务器返回客户端的IP和Port。
比 较上面两个过程从服务器返回的客户端(IP,Port),如果两个过程返回的(IP,Port)有一对不同则说明客户端为Symmetric NAT,这样的客户端无法进行UDP-P2P通信(检测停止)。否则是Restricted Cone NAT,是否为Port Restricted Cone NAT有待检测(继续)。

第四步:检测客户端NAT是否是Restricted Cone NAT还是Port Restricted Cone NAT?

客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用IP-1和一个不同于Port-1的端口发送一个UDP 数据包响应客户端, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端是一个Port Restricted Cone NAT,如果能够收到服务器的响应则说明客户端是一个Restricted Cone NAT。以上两种NAT都可以进行UDP-P2P通信。

注:以上检测过程中只说明了可否进行UDP-P2P的打洞通信,具体怎么通信一般要借助于Rendezvous Server。另外对于Symmetric NAT不是说完全不能进行UDP-P2P达洞通信,可以进行端口预测打洞,不过不能保证成功。