P2P网络学习笔记

1,273 阅读14分钟

P2P原理

什么是P2P

P为英文Peer的简写,P2P意为peer to peer即对等网络。P2P是一种区别于传统的客户端/服务端(client/server,C/S)结构的网络模型,没有统一的中心服务器结点,各个Client也是提供服务的Server。

P2P可以看作是一种通信模式、一种逻辑网络模型、一种技术、甚至一种理念。在P2P网络中,所有通信节点的地位都是对等的,每个节点都扮演着客户机和服务器双重角色,节点之间通过直接通信实现文件信息、处理器运算能力、存储空间等资源的共享。

P2P网络具有分散性、可扩展性、健壮性等特点,这使得P2P技术在信息共享、即时通讯、协同工作、分布式计算、网络存储等领域都有广阔的应用。

P2P的特点

P2P的优势

优秀的并行处理能力,P2P与传统的C/S架构相比,P2P不会随着客户端越来越多而速度越来越慢,因为所有的客户端都能提供带宽、存储空间、计算能力等资源。

P2P架构天生具有耐攻击、高容错的优点。由于服务是分散在各个结点之间进行的,部分结点或网络遭到破坏对其它部分的影响很小。

中央服务器的成本大幅度降低,可以通过利用网络中的大量空闲资源,以更低的成本提供更高的计算和存储能力。

P2P的劣势

P2P架构往往较为复杂,而且节点之间通常存在NAT隔离,无法直接通信,需要额外的通路建设过程,以及各个节点的资源协调管理。

P2P节点遍布整个互联网,给开发者、组织、政府带来监控难题。

随着P2P网络规模的增大,容易遇到资源分享紊乱,管理较难等问题。

安全性较低。

P2P分类

我们从拓扑结构入手,拓扑结构是指系统中各个计算单元之间物理或逻辑的互联关系,结点之间的拓扑结构一直是确定系统类型的重要依据。

P2P系统一般要构造一个非集中式的拓扑结构,在构造过程中需要解决系统中所包含的大量结点如何命名、组织以及确定结点的加入/离开方式、出错恢复等问题。P2P系统拓扑结构的变化也反映了P2P系统的不同发展阶段。

中心化

中心化的特点是存在一个中心节点,在一个中心节点保存了其他所有节点的索引信息,索引信息一般包括节点 IP 地址、端口、节点资源等。

这也是第一代P2P网络采用的结构模式,著名的MP3共享软件Napster就是中心化的经典案例。

Napster实质上并非是纯粹的P2P系统,它通过一个中央服务器保存所有Napster用户上传的音乐文件索引和存放位置的信息。当某个用户需要某个音乐文件时,首先连接到Napster服务器,在服务器进行检索,并由服务器返回存有该文件的用户信息;再由请求者直接连到文件的所有者传输文件。

1.jpg

中心化的优点很明显,它结构简单、实现容易,且资源发现效率高。

但缺点也很明显。

  1. 容易造成单点故障,中央服务器的瘫痪容易导致整个网络的崩溃,可靠性和安全性较低。

  2. 存在单点性能瓶颈问题,中央服务器的性能会制约整个网络的性能,

  3. 随着网络规模的扩大,中央服务器所需的成本也会增大。

  4. 中央服务器的存在引起共享资源在版权问题上的纠纷。

全分布式非结构化

这种方式移除了中心节点,在P2P节点之间建立随机网络,即在一个新加入节点和P2P网络中的某个节点间随机建立连接通道,从而形成一个随机拓扑结构。

典型的案例是Gnutella,这是一个P2P文件共享网络。新节点在加入P2P网络的时候,客户端软件必须进行自举(Bootstrapping)并找到至少一个其它节点,有多种不同的方法可以达到这一功能,包括软件内置的一组正在工作的已经存在的地址栏表,Web缓存的已知节点更新(称为GWebCaches), UDP服务器缓存以及IRC。一旦连接上,客户端就会请求一张活动地址栏表。

当用户需要查找某个文件时,客户端向每一个活动联接节点发送请求。每一个收到请求的联接节点都会再向其自身的所有联接节点转发该条请求,如此继续下去,直到该请求数据包在网络中被转发的“跳数”超过一个预先设定的数值。这种查询方法也称为洪泛(Flooding)机制。

2.jpg

纯分布式结构解决了中心化结构的单点性能瓶颈问题和单点故障问题。

但完全随机的网络也造成了新的问题。

  1. 容易形成洪泛循环。

  2. 随着联网节点的不断增多,网络规模不断扩大,通过这种洪泛方式定位的方法将造成网络流量急剧增加。

  3. 非结构化的网络无法保证资源的发现,并且即使需要查找的目的结点存在发现也有可能丢失。

全分布式结构化

全分布式结构化网络就是在全分布式非结构化网络上的升级,它将所有节点按照某种结构进行有序组织,比如形成一个环状网络或树状网络。结构化网络普遍采用分布式hash表(Distributed Hash Table)思想。这是一种分布式存储方法,将信息或者资源进行唯一标识,同时按照约定分散存储在多个节点上,每个节点负责一个小范围的路由并负责存储一小部分数据,从而实现DHT网络的寻址和存储。

首先DHT会对网络中的节点利用hash函数映射为节点id(NID)。在一个节点进行资源上传之后,会对该资源通过hash运算产生一个唯一的资源id(key),同时记录一个键值对(key, value)(value可以简单理解为文件共享中网络中的ip)。该节点会首先计算自己的NID与key之间的"距离"(逻辑上的距离,与路由算法有关),如果自己与key之间的距离最小那就把键值对保存在自己这里。否则的话,把这个数据转发给距离最小的节点。收到键值对的节点,会进行相同的处理(递归处理)。
当收到查询请求的时候,就会根据key分步去查找相邻的节点,查找到的这些NID在"距离"上逐步接近key,如果有节点直接返回搜索的值或者再也无法找到与key更为接近的NID的时候搜索便会停止。

3.png

DHT解决了无结构化模型的很多问题,它有着良好的可扩展性、健壮性、结点ID分配的均匀性。并且由于其确定的结构化,只要目的结点存在于网络中,DHT总能够精确的找到它。

但是DHT的维护机制较为复杂,尤其是结点频繁加入退出造成的网络波动(Churn)会极大增加DHT的维护代价。DHT所面临的另外一个问题是DHT仅支持精确关键词匹配查询,无法支持内容/语义等复杂查询。

半分布式

所谓半分布式,其实就是吸取了中心化结构和全分布式非结构化拓扑的优点。在半分布式网络中,会选择一些节点作为超级节点(SuperNodes),这些节点一般具有计算能力强、接入带宽大、在线时间稳定等特点。

KaZaA网络使用的即是这种结构,在该网络中超级节点承担着部分服务器的任务,如管理部分普通节点,负责搜索消息的转发等。每一个节点上线后会寻找一个超级节点挂靠,并和原先挂靠在该超级节点下的其他普通节点随机相连,组成一个小的无结构网络。普通节点的共享文件索引汇报给所挂靠的超级节点。发现算法仅在超级点之间转发,超级点再将查询请求转发给适当的叶子结点。

因而,KaZaA网络大体上可以看作是两层的无结构网络,上层是超级节点组成的无结构网络;下层是普通节点组成的多个无结构网络,按所挂靠的超级节点分成多个簇。

4.png

半分布式结构的优点是性能、可扩展性、可维护性都较好,较容易管理。

但仍然存在对超级点依赖性大,更容易受到攻击,容错性也受到影响。

不同的结构对比

5.jpg

NAT穿透

想要实现p2p链接,有一个核心技术,就是NAT穿透技术。

我们首先来了解一下什么是NAT。

什么是NAT

NAT的由来

NAT,也就是Network Address Translation,即网络地址转换。由于接入互联网的设备与日俱增,早在20世纪90年代初,网络专家们就在考虑IPv4的替代方案,同时采取一系列的措施来减缓IPv4地址的消耗。在此背景之下,网络地址转换技术——NAT应运而生。

在IPv4协议中,RFC1918规定了三个保留地址段落:10.0.0.0-10.255.255.255;172.16.0.0-172.31.255.255;192.168.0.0-192.168.255.255。 这三个范围分别处于A,B,C类的地址段,不向特定的用户分配,被IANA作为私有地址保留。这些地址可以在任何组织或企业内部使用,和其他Internet地址的区别就是,仅能在内部使用,不能作为全球路由地址。NAT设备就部署在一个组织的网络出口位置,NAT设备通过将内部网络IP地址替换为出口的公网IP地址,为组织内部的设备提供公网可达性和上层协议的连接能力。

NAT分类

常见的NAT有以下两种:

  • 基本网络地址转换(Basic NAT)

    也称“静态NAT”,仅支持地址转换,不支持端口转换(一般拥有多个公网IP池可用)

    由于Basic NAT这种一对一的转换方式并未实现公网地址的复用,不能有效解决IP地址短缺的问题,因此在实际应用中并不常用。

  • 网络地址端口转换(NAPT)

    允许多台主机共享一个公网IP

    通常由以下两种工作同时组成:源地址转换类型(内网主机发出的数据包能够到达外网主机)、目标地址转换类型(外网主机发出的数据包能够到达内网主机)

    在NAPT中,按照端口转换的工作方式不同,又可以进行更进一步的划分

    2-1.jpg

NAT的作用机制

  • 网络被分为私网和公网两个部分,NAT网关设置在私网到公网的路由出口位置,双向流量必须都要经过NAT网关;

  • 网络访问只能先由私网侧发起,公网无法主动访问私网主机;

  • NAT网关在两个访问方向上完成两次地址的转换或翻译,出方向做源信息替换,入方向做目的信息替换;

  • NAT网关的存在对通信双方是保持透明的;

  • NAT网关维护一张关联表,把会话的信息保存下来,用以实现双向翻译的功能。

NAT的弊端

  • 破坏了IP端到端通信的能力

IP协议的重要贡献是把世界变得平等,在理论上,具有IP地址的每个站点在协议层面有相当的获取服务和提供服务的能力,不同的IP地址之间没有差异。人们熟知的服务器和客户端实际是在应用协议层上的角色区分,而在网络层和传输层没有差异。而NAT的最大弊端正是它破坏了这种能力,公网主机无法主动请求内网主机。

  • 使IP会话的保持时效变短

会话建立会在NAT网关上创建关联表,消耗IP端口号,而这些资源是有限的,需要能资源回收机制

  • 内部主机复用IP,使得依赖IP进行主机跟踪的机制都失效

  • 修改IP包头信息,会妨碍一些安全协议的工作

NAT穿透

NAT穿透技术包括应用层网关、中间件技术、中继代理技术、探针技术STUN和TURN等,我们主要关注STUN和TURN。

STUN

STUN(Session Traversal Utilities for NAT),即NAT会话穿越应用程序。

客户端首先向部署到公网上的STUN服务器发起探测请求,接收到之后服务器会记录收到请求的报文地址和端口,并填写到回送的响应报文中。

客户端接下来根据接收到的响应消息中记录的地址和端口与本地选择的地址和端口进行比较,就能识别出是否存在NAT网关。如果存在NAT网关,客户端会使用之前的地址和端口向服务器的另外一个IP发起请求,重复前面的探测。然后再比较两次响应返回的结果判断出NAT工作的模式。

由于除对称型NAT以外的模型,NAT网关对内部主机地址端口的映射都是相对固定的,所以通信双方能够根据上面的结果建立一条数据通道进行相互通信。

2-2.png

TURN

TURN(Traversal Using Relays around NAT),即通过Relay方式穿越NAT,算是STUN的中继扩展。

客户端通过发送请求给TURN服务器,从而让TURN服务器为客户端开启一个relay端口,这时TURN服务器会创建一个peer,开始中继操作,客户端A通过relay端口将数据发送到peer,再由peer准发到客户端B实现通讯。

这个方法更耗时且更占带宽,因此在没有其他替代方案时才会使用这个方法。

2-3.png

ICE

ICE框架,即互动式连接建立(Interactive Connectivity Establishment),它通过整合STUN与TURN等技术实现完整的NAT穿透方案,该技术可以让客户端成功地穿透远程用户与网络之间可能存在的各类防火墙与NAT。WebRTC采用的就是该方式实现NAT穿透功能。

ICE信息的描述格式通常采用标准的SDP,其全称为Session Description Protocol,即会话描述协议,SDP只是一种信息格式的描述标准。

首先连接双方通过STUN协议从STUN Server那里获取到自己的NAT结构,子网IP和公网IP,端口,将这些信息保存起来,称为ICE Candidate。分为以下三种类型:

  • host类型:本机内网,内网P2P连接

  • srflx类型:本机NAT映射后的外网,非对称型NAT网络环境,外网P2P连接

  • relay类型:一般是对称性NAT网络,需要走TURN中继服务器

接下来两端通过singal交换彼此的SDP和ICEcandidate信息,根据不同的NAT结构情况进行连接

最后连接双方(Peer)向目标IP端口发送报文,通过提前获取到SessionDescription中涉及的密钥以及期望传输的内容,建立起加密长连接。如下图所示:

2-4.png

参考引用

《P2P对等网络原理与应用》
再谈P2P技术:网络拓扑结构、核心技术分析
P2P技术详解(一):NAT详解——详细原理、P2P简介
WebRTC简介
WebRTC技术简介