去中心化技术分享与 P2P 框架的实现

本文 谈谈去中心化技术分享与 P2P 框架的实现,文尾有彩蛋。

去中心化技术分享与 P2P 框架的实现

关于去中心化的网络架构,也是服务器架构范畴内必不可少的一部分。本章讨论的内容,不涉及任何软件技术框架,也不涉及任何软件代码分析,注重把去中心化网络的原理分析清楚,最后通过 Linux 系统编程实现网络穿透。

去中心化技术分享与 P2P 框架的实现

为了使本章更加容易描述,现对五个概念做一个不严谨的非学术的定义。

  • 1> 客户端:用户直接操作的终端软件。
  • 2> 节点:对通信网络中机器的简称,包括客户端机器,服务器机器,路由器等等
  • 3> P2P:描述终端与终端直接通信的方式。
  • 4> 网络穿透:实现终端与终端直接通信的一种技术方案。
  • 5> 去中心化网络:包含终端,服务器,以及之间通信方式,一起组成的通信网络。

5.1 中心化网络与去中心化

为了更好的理解去中心化网络,先来理解传统的中心化网络拓扑图(图 5-1)。不论常用的 B/S 还是 C/S,都是一种星型结构,而中心化节点正是服务器,每一个客户端只能与服务器通信。如果客户端与客户端之间需要通信,必须要得通过服务器进行路由处理,才能把数据路由到另一个客户端。在通信过程中,服务器与客户端是充当着不同角色的,不同功能的。服务器是对所有客户端提供服务的,这样的通信网络,被称为中心化网络。

去中心化技术分享与 P2P 框架的实现

在去中心化网络中,每个客户端都是平等的,没有客户端与服务器之分,客户端之间互相提供服务,不存在“特殊”身份。客户端之间交互连接,每个客户端同时也对外提供服务,同时也使用其他客户端的提供的服务。在此种情形下,再被称为客户端不太妥了。所以此时的客户端被称为节点。这样没有中心服务器的网络,被称为去中心化网络。不仅仅解除了中心化服务器绝对控制的风险,也提高了网络传输效率,也去除了中心化服务器数据路由的压力。

去中心化技术分享与 P2P 框架的实现

5.2 网络地址映射 NAT

在私网与外网通信的过程中,私网与公网连接的边沿节点被称为路由器。比如私网内部网络为 192.168.1.0 的网络。路由器的公网 IP 为 112.93.114.32,服务器的公网 IP 地址为120.93.24.180。服务器发送数据与路由器公网 IP 时,能够将数据映射到私网中的机器;私网内的机器发送数据给服务器,路由器也能够映射为公网 IP 地址的过程,成为网络地址映射。

去中心化技术分享与 P2P 框架的实现

NAT (Network Address Translation,网络地址映射)是将公网地址映射为私网地址。而能够进行映射的网络装置被称为 NAT 路由器。

5.2.1 NAT 的原理

由于全球网络通信机器增加,IPv4 地址紧缺,所以提出了 NAT 的理论,通过公网 IP 地址与端口映射到私网机器的 IP 地址与端口。这样就能通过少量的公有 IP 地址能够代表较多的私有 IP 地址,有助于减缓可用 IPv4 地址的耗尽。

去中心化技术分享与 P2P 框架的实现

私网内机器上操作系统中的一个网络进程,与公网服务器 120.93.24.180 机器通信,NAT 路由器为每一个网络进程分配一个网络 IP 地址与端口,用于与公网服务器通信。与此同时,公网服务器与私网内的网络进程通信,也是通过 NAT 路由器分配的网络 IP 地址与端口进入私网到达网络进程。

5.2.2 NAT 的实现

NAT 的实现方案有三种,静态转换,动态转换,端口地址映射。

静态转换(Static NAT):私网 IP 地址转换为公网 IP 地址,公网 IP 与私网 IP 地址通过一对一的配置,配置后是不能更改的。通过静态转换,实现对私网中的网络进程进行访问。私网有多少私有地址需要与公网通信,需要配置与之对应的外网 IP 地址,并不节省公网 IP地址,所以一般不用。

去中心化技术分享与 P2P 框架的实现

动态转换(Dynamic NAT):为私网分配多个公网 IP 地址,组成一个公网 IP 地址池。私网内部地址需要转换时,NAT 路由器从公网 IP 地址池中取出一个 IP 地址,分配给私网机器用于网络通信。当私网机器数据传输结束后,NAT 路由器收回公网 IP 地址,返回 IP 地址池中。分配后的 IP 地址是不能再用于其他数据传输。在公网 IP 地址数量略少于私网机器数量的时候,可以采用动态转换。

去中心化技术分享与 P2P 框架的实现

端口地址映射(Port Address Translation, PAT):改变私网内机器发送到公网数据包的源端口并进行端口转换 (如图 5-6。私网内部的所有主机均可共享一个公网 IP 地址,实现对公网的访问,从而能够最大限度的节省 IP 地址资源。同时,有隐藏私网中的所有主机,有效避免其他公网机器的攻击。目前 NAT 路由器应用最广的就是端口地址映射。

去中心化技术分享与 P2P 框架的实现

5.2.3 NAT 的应用

NAT 在互联网中被广泛应用,小到家庭网关,大到企业广域网出口甚至到运营商业务网络出口,其实 NAT 在用户身边随处可见。一个用户连接到公网进行上网,本地私有网络机器经过多层 NAT,而用户对此一无所知。

去中心化技术分享与 P2P 框架的实现

私网内有两台机器(如图 5-8)192.168.1.23 和 192.168.1.24 与公网通信,机器上的网络进程分别是 QQ/微信与头条/抖音。在数据传输的过程中,NAT 路由器会为每一个网络进程分配相应端口与公网通信。

5.3 NAT 种类

从 NAT 的技术实现角度,可以分为三种,静态转换(Static NAT),动态转换(DynamicNAT),端口地址映射(Port Address Translation,PAT)。从 NAT 的功能,可以分为四种:完全锥型 NAT(Full Cone NAT),对称 NAT(SymmetricNAT),IP 限制锥型 NAT(IP Restricted Cone NAT),端口限制锥形 NAT(Port RestrictedCone NAT)。

5.3.1 完全锥型 NAT

完全锥型 NAT(Full Cone NAT),私网机器的网络进程(iAddr:iPort)被 NAT 路由器映射为公网地址(pAddr:pPort),后续该网络进程的所有数据报文都被转换为公网地址(pAddr:pPort),公网任何一台机器发送报文到(pAddr:pPort),会被转发到私网机器的网

络进程(iAddr:iPort)。如图 5-10 所示。


去中心化技术分享与 P2P 框架的实现


5.3.2 对称 NAT

对称 NAT(Symmetric NAT),NAT 路由器会为私网机器的每一个网络进程都会分配一个地址与端口,从而把私网网络进程(iAddr1:iPort1)与公网地址(pAddr1:pPort1)。后续NAT 路由器会把私网机器地址端口(iAddr1:iPort1)与公网地址端口(pAddr1:pPort1)完全相同的报文看作一个连接。如图 5-11 所示。

去中心化技术分享与 P2P 框架的实现

私网机器的网络进程每与一台公网机器通信,NAT 路由器都会重新分配一个地址端口。这样使得每一个通信链路都是经过 NAT 路由器不同的端口。公网机器往私网发送报文也是经过不一样的端口。

5.3.3 IP 限制锥形 NAT

限制锥型 NAT(Restricted Cone NAT),又名 IP 限制锥型 NAT。为了更好理解四种 NAT,故本篇中一直称为 IP 限制锥型 NAT。限制锥型 NAT,只允许映射关系的对应公网 IP 地址机器,传输数据到私网机器。其他的公网 IP 地址机器发送数据给 NAT 路由器的公网 IP 地址与端口时,则会被 NAT 路由器丢弃。

去中心化技术分享与 P2P 框架的实现

私网机器网络进程(192.168.1.3:2341)发送报文到公网地址(180.93.45.46:8080)的服务器,在 NAT 路由器上产生了映射公网地址(112.93.114.33:34523)。有以下两种情形分开讨论

情形一:私网机器网络进程没有发送报文给其他公网机器,NAT 路由器只允许公网 IP地址为 180.93.45.46 的机器数据进入,其他地址机器的数据报文则会被 NAT 路由器阻挡,不允许进入内网。

情形二:私网机器网络进程同时发送报文给另一台公网机器,此时 NAT 路由器生成了NAT 映射记录,则另一台公网机器发送报文与公网地址(112.93.114.33:34523),NAT 路由器是允许报文进入私网。先由私网机器发送报文到公网机器,限制锥形 NAT 路由器方能允许公网机器报文进入私网。

5.3.4 端口限制锥形 NAT

端口限制锥形 NAT(Port Restricted Cone NAT),在 IP 限制锥型 NAT 的基础上,又添加了一层端口限制。限制了发送报文进入私网的 IP 地址与端口。如图 5-12 所示,私网机器(192.168.1.3:2341)发送报文数据到公网机器(180.93.45.46:8080)的过程中,在 NAT 路由器上产生了(112.93.114.33:34523)记录。

有以下两种情形讨论。

情形一:私网机器网络进程没有发送报文给公网机器(180.93.45.46)其他端口,则 NAT路由器只允许公网地址(180.93.45.46:8080)的数据报文进入私网。

情形二:私网机器网络进程发送数据给公网机器(180.93.45.46)的其他端口,NAT 路由器生成一条 NAT 记录,则允许该端口的数据报文到达网络进程。

去中心化技术分享与 P2P 框架的实现

5.4 NAT 鉴别方案

已经了解了四种 NAT 的功能,本小节介绍四种 NAT 之间的逻辑关系,并且用计算机逻辑流程实现判断 NAT 的方案。

完全锥型 NAT(Full Cone NAT),对称 NAT(Symmetric NAT),IP 限制锥型 NAT(IPRestricted Cone NAT),端口限制锥形 NAT(Port Restricted Cone NAT)。这四种 NAT 的逻辑关系,可以将 NAT 划分为一颗二叉树,如图 5-13 所示。NAT 分为两种对称 NAT 与锥型NAT,锥型 NAT 分为两种限制锥型 NAT 与完全锥型 NAT。限制锥型 NAT 分为两种端口限制锥型 NAT 与 IP 限制锥型 NAT。叶子节点正好是划分出来的四种 NAT,同级节点互补,合为整集。

判别网关是属于哪种 NAT 的方案,就能参照图 5-13 所示,按照二叉树的层级逐层判断,从而确定网关的 NAT 类型。三次判断分别为对称 NAT 与锥型 NAT,限制锥型 NAT 与完全锥型NAT,端口限制锥型 NAT 与 IP 限制锥型 NAT。

去中心化技术分享与 P2P 框架的实现


5.4.1 对称 NAT 与锥型 NAT

对称 NAT 与锥型 NAT 的区别,在于私网机器与不同的公网机器通信在 NAT 路由器上产生映射表记录的条数。对称 NAT 与 N 台公网机器通信则生成 N 条记录;而锥形 NAT 与 N 台公网机器通信则生成 1 条记录。

去中心化技术分享与 P2P 框架的实现

判断流程如下,如图 5-14 所示:

  • 步骤 1:私网机器(192.168.1.3:2341)发送报文到服务器 1(180.93.45.46:8888)的 NAT路由器产生了对外公网 IP(112.93.114.33:23454),此时服务器 1 获取客户端 IP 地址即为对外公网 IP(112.93.114.33:23454)
  • 步骤 2:私网机器(192.168.1.3:2341)发送报文到服务器 2(118.56.189.34:8888)。服务器 2 获取客户端 IP 地址(iAddr:iPort)
  • 步骤 3:服务器 1 获取客户端的 IP 地址,发送给服务器 2。服务器 2 对比服务器 1 发过来的地址与服务器 2 获取的客户端 IP 地址。若两个客户端 IP 地址一致,则为锥型 NAT;若不一致则为对称 NAT。

5.4.2 完全锥形 NAT 与限制锥形 NAT

完全锥型 NAT 与限制锥形 NAT 的区别,在于其他公网机器发送报文到 NAT 路由器对外公网 IP 地址能否到达私网机器,NAT 路由器的 NAT 类型是完全锥型 NAT 的话,私网机器能够收到报文数据,限制锥形 NAT 则不能收到报文数据。

去中心化技术分享与 P2P 框架的实现

判断流程如下,如图 5-15 所示:

  • 步骤 1:私网机器网络进程(192.168.1.3:2341)发送报文给服务器 1(180.93.45.46:8888)。服务器 1 获取到客户端 IP 地址(即 NAT 路由器对外公网 IP 地址)。
  • 步骤 2:服务器 1 将获取的客户端 IP 地址发送给服务器 2。
  • 步骤 3:服务器 2 收到客户端 IP 地址以后,发送报文给客户端 IP 地址。探测客户端 IP 地址能否收到报文数据。若是完全锥型 NAT,则私网机器能够收到报文;若是限制锥形 NAT,则私网不能收到报文数据。
  • 步骤 4:私网机器网络进程收到报文数据,继续发送报文给服务器 1。服务器 1 收到了报文数据。判断结束。服务器 1 收到报文数据,则为完全锥型 NAT;否则为限制锥型 NAT。

5.4.3 IP 限制锥形 NAT 与端口限制锥形 NAT

IP 限制锥型 NAT 与端口限制锥型 NAT 的区别,在于公网机器的其他端口发送报文数据给私网机器网络进程能否收到。网络进程能收到同一台公网机器的其他端口发送的报文数据则为 IP 限制锥型 NAT,否则为端口限制锥型 NAT。

判断流程如下,如图 5-15 所示:

  • 步骤 1: 私网机器网络进程(192.168.1.3:2341)发送报文给服务器(180.93.45.46:8888)。服务器获取到客户端 IP 地址。
  • 步骤 2:服务器从另一个端口(180.93.45.46:8888),发送报文数据给客户端 IP 地址。若私网机器能够收到报文则为 IP 限制锥型 NAT,若不能则为端口限制锥型 NAT。
  • 步骤 3:私网机器网络进程回发报文给服务器 8888 的端口,收到报文数据,判断结束。若收到数据则为 IP 限制锥形 NAT,否则为端口限制锥型 NAT。
去中心化技术分享与 P2P 框架的实现

5.4.4 STUN 协议

STUN 最早是在 RFC3489 中定义,(Simple Traversal of UDP Through NATs),即用 UDP简单的穿透 NAT,作为一个完整的 NAT 穿透解决方案。在 RFC5389 中,把 STUN 协议定义为穿透 NAT 提供工具,而不是一个完整的解决方案。STUN(Session Traversal Utilities forNAT,NAT 会话穿越应用程序)是一种网络轻量级协议,它允许私网应用程序发现它们与公共互联网之间存在的 NAT 和防火墙及其他类型。它也可以让应用程序确定 NAT 分配给它们的公网 IP 地址与端口,STUN 是一种 Client/Server 的协议,也是一种 Request/Response的协议,默认端口 3478。本小节描述的 NAT 类型鉴别,是将 STUN 实现原理与细节,分析与展示出来。

5.5 网络穿透

网络穿透,即 NAT 穿透,能够让公网机器找到私网机器,并提高下载速度。如图 5-17所示,穿透图中两个网关路由器,从而报文数据能够直接到达私网机器。穿透的本质是给一个 NAT 路由器的公网 IP 地址与端口发送报文数据,对应私网机器能够收到报文数据。比如图中 NAT1,私网机器(192.168.1.3:2341)发送报文到公网服务器(180.93.45.46:8888)的过程中,在 NAT 路由器上产生了一条公网映射记录(112.93.14.56:43891)。后续其他外网机器(192.168.2.6:6583)发送报文数据给公网映射记录(112.93.14.56:43891),使得私网机器(192.168.1.3:2341)能够收到该报文数据。

去中心化技术分享与 P2P 框架的实现

5.5.1 穿透完全锥形 NAT

穿透过程中,两端私网机器都是在 NAT 路由器之下的。两端 NAT 只要有一方为完全锥型NAT 的时候,是可以穿透的。穿透逻辑如图 5-18 所示。比如 NAT1 为完全锥形 NAT,NAT2 为任意 NAT。

去中心化技术分享与 P2P 框架的实现


  • 步骤 1:私网机器 1(192.168.1.3:2341)发送报文给服务器(180.93.45.46:8888)。服务器获取到私网机器 1 的公网 IP 地址与端口(112.93.14.56:43891)。
  • 步骤 2:服务器收到信息后,通知私网机器 2(192.168.2.6:6583),通知信息内含私网机器1 的公网 IP 地址与端口(112.93.14.56:43891)。
  • 步骤 3:私网机器 2(192.168.2.6:6583)发送数据给私网机器 1 的公网 IP 地址与端口(112.93.14.56:43891),此时私网机器 1 就能收到私网机器 2 发送的报文数据,并且能过获取私网机器 2 的公网 IP 地址与端口(iAddr:iPort)。
  • 步骤 4:私网机器 1 回发报文信息给私网机器 2 的公网 IP 地址与端口(iAddr:iPort),此时私网机器 2 能够收到报文数据。穿透流程结束。

5.5.2 穿透限制锥形 NAT

限制锥型 NAT 的特点是限制了其他公网机器报文数据传输。如果在采用完全锥型 NAT 的穿透步骤,就会在步骤 3 不能到达私网机器。针对于两端 NAT 都是限制锥形 NAT 的情况,穿透流程如图 5-19 所示。

去中心化技术分享与 P2P 框架的实现


  • 步骤 1:私网机器 1(192.168.1.3:2341)发送报文给服务器(180.93.45.46:8888),服务器获取私网机器的公网 IP 地址(112.93.14.56:43891)。
  • 步骤 2:服务器发送通知报文给私网机器 2(192.168.2.6:6583),通知报文中内含私网机器1 的公网 IP 地址(112.93.14.56:43891)。
  • 步骤 3:私网机器 2 发送报文数据到私网机器 1 的公网 IP 地址(112.93.14.56:43891)。由于 NAT1 是限制锥型 NAT,此时私网机器 1 是不能收到报文数据的。
  • 步骤 4:私网机器 2 进行完步骤 3 以后,立即发送报文给服务器(180.93.45.46:8888),要求私网机器 1 发送数据给私网机器 2 的公网 IP 地址。
  • 步骤 5:服务器通知私网机器 1,通知信息内含公网 IP 地址(180.20.198.42.9681)。
  • 步骤 6:私网机器 1 发送报文数据给私网机器 2 的公网 IP 地址。由于步骤 3 发送报文给私网机器 2 的公网 IP 地址,此份报文会被 NAT2 的路由器认为是步骤 3 的回复。所以此步骤会被允许通过。此时已经穿透了 NAT2。
  • 步骤 7:私网机器 2 回发报文给私网机器 1,此时穿透了 NAT1。穿透流程结束。

5.5.3 穿透对称 NAT

对称 NAT 的特点是每一个不同公网机器的通信,都会被分配不同的映射端口通信。若参照限制锥型 NAT 的穿透流程,则在不能准确地知道步骤 3 所产生的公网 IP 地址与端口。穿透流程如图 5-20 所示。NAT1 为限制锥型 NAT,NAT2 为对称 NAT。

去中心化技术分享与 P2P 框架的实现


  • 步骤 1:私网机器 1(192.168.1.3:2341)发送报文数据给服务器(180.93.45.46:8888),请求与私网机器 2 进行透传。
  • 步骤 2:服务器(180.93.45.46:8888)发送通知信息给私网机器 2。通知信息内含私网机器1 的公网 IP 地址(112.93.14.56:43891)。
  • 步骤 3:私网机器 2 收到通知信息,发送报文数据给私网机器 1 的公网 IP 地址。此时由于NAT1 为限制锥形 NAT,数据是不被允许进入私网的。同时由于 NAT2 为对称 NAT,所以会在此次报文发送过程中,会被产生新的映射记录,分配公网地址与端口(iAddr:iPort)。
  • 步骤 4:私网机器 2 进行完步骤 3 以后,发送报文信息给服务器的另一个端口 8889,此步骤也会在路由器上产生一条新的映射记录,分配公网地址与端口(mAddr:mPort)。服务器同时也获取到新的公网地址与端口(mAddr:mPort)。
  • 步骤 5:服务器(180.93.45.46:8889)发送通知信息给私网机器 1。通知信息内含步骤 4 产生的新记录公网地址与端口(mAddr:mPort)。此时根据 iPort 与 mPort 产生的相隔时间很短,可以来判断 iPort 的值,即需要穿透的端口。为了判断的根据准确,可以在产生 mPort之前也加上一次新记录,即再步骤 3 以前让 NAT 路由器产生一条记录,这样准确度会大大穿透的概率。
  • 步骤 6:根据 mPort 的值,来猜测 iPort 的值,发送报文信息给私网机器 2 的公网地址与端口(mAddr:mPort)。准确的 mPort 值,则能够穿透 NAT2。
  • 步骤 7:收到穿透报文信息后,回复报文信息。流程完毕。

希望本文技术点,对你有帮助。

关注+回复:1 领取相关教程

去中心化技术分享与 P2P 框架的实现

小编专注于C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等多个知识点高级技术分享


分享到:


相關文章: