由于我对一些奇奇怪怪的技术比较感兴趣,就特别想去了解它的原理。
最近看到两个关键词——去中心化,网络穿透。
了解了相关技术我终于明白,为什么当年王欣说:“技术无罪”。
用到这类技术的有:kuaibo (王欣),TeamViewer
简介
简单来说,去中心化之后就是点对点通信。没有服务器作为中介,两个节点直接通信而不通过服务器。
中心化网络
为了更好地理解什么是去中心化网络,先要了解传统的中心化网络。中心化的节点必须是服务器,客户端只能和服务器通信,而不能单独地与另一个客户端直接通信。若客户端想发送信息给另一个客户端,必须通过服务器。在这种模型中,服务器扮演提供服务的角色,而客户端则是被服务的。这样的通信网络,就是传说中的中心化网络。

去中心化网络
在去中心化的网络中,实际上是没有客户端和服务器的说法,客户端之间相互地提供服务。客户端之间相互连接,每个客户端同时对外提供相应的服务,同时也使用其他客户端提供的服务。在这种情况下,就没有客户端的说法了,我们可以称它为节点。这样的通信网络,就是传说中的去中心化网络。这种通信网络去除了中心服务器的绝对控制,也提高的网络传输效率,同时中心服务器的压力也变小了。

网络地址映射 NAT
NAT(Network Address Translation,网络地址映射)是将公网地址映射为子网地址。能够进行映射的网络装置被称为 NAT 路由器。
在子网与外网通信的过程中,子网和公网连接的节点称为路由器。假设子网在192.168.1.0网段。路由器的公网IP为112.93.114.32,服务器的公网IP地址为120.93.24.180。当服务器给子网机器发送数据时,实际上是发送到路由器上,路由器能够通过路由器上记录的映射表,将数据映射到子网的机器中;相对的,当子网机器给服务器发送数据时,先将数据发送到路由器,再由路由器发送给服务器。

NAT 原理
2019年11月25日,世界互联网组织宣布,最后一个IPv4地址已经分配完毕。现在,我们已经用完了IPv4地址。
在更早之前,由于 IPv4 地址紧缺,提出了NAT理论,通过公网IP地址与端口的组合,映射到子网机器的IP和端口。这样就可以用少量的公网IP来表示更多的子网IP,可以减缓IPv4地址耗尽。

NAT 实现
NAT 实现方案有三种:静态转换,动态转换,端口地址映射。
1. 静态转换
一个子网IP对应一个公网IP,且配置后不能更改,这并不能节省公网IP。
2. 动态转换
公网IP数量大于子网IP数量,公网IP组成一个IP地址池。当子网IP需要转换时,NAT路由器就从地址池中取出一个空闲的公网IP,分配给子网机器,使得子网机器可以和公网进行通信。当数据传输完后,就回收此公网IP到地址池中。
3.端口地址映射
通过改变子网机器发送到公网的源端口号(对外的公网IP为路由器的公网IP,修改后的端口号为路由器上的端口号),最大限度地节省IPv4地址。

NAT 种类
从NAT功能上做区分,可以将NAT分为四种:对称NAT,完全锥形NAT,IP限制锥形NAT,端口限制锥形NAT。

如何区分?
1.对称NAT vs 锥形NAT
在区分之前,必须先明白一点:NAT 会为子网机器的每一个网络进程都分配一个地址和端口,从而能够将子网网络进程与公网地址做映射。
准备一个子网客户端,两台公网服务器。
- 用客户端上的同一个进程,同一个socket,分别给两台服务器发数据
- 服务器收到数据后,会得到客户端的IP地址(公网的IP)
- 将两台服务器获取到的客户端的IP地址做对比。如果相同,则为锥形NAT,如果不同,则为对称NAT。
2.限制锥形NAT vs 完全锥形NAT
准备一个子网客户端,两台公网服务器。
- 客户端给服务器1发数据,服务器1收到数据后,会得到客户端的IP地址(公网的IP)
- 服务器1将客户端的IP地址告诉服务器2,由服务器2发数据到客户端的IP地址(服务器1告知的)
- 如果子网机器能收到数据,则为完全锥形NAT,如果收不到数据,则为限制锥形NAT。
3.IP限制锥形NAT vs 端口限制锥形NAT
准备一个子网客户端,一台公网服务器。
- 客户端给服务器的8888端口发数据
- 服务器获取到客户端IP地址后,用另一个端口给客户端发数据(8889)
- 如果客户端收到数据,则为IP限制锥形NAT,如果客户端收不到数据,则为端口限制锥形NAT。(这里的结论还不严谨)
- 最后一步,子网机器用同一个socket,再给服务器8888端口发数据,服务器收到数据,则上面结论成立(严谨)。
网络穿透
网络穿透,就是能够让公网的机器(多数指的是网关)找到子网的机器。
穿透下图中的两个网关,使得在两个在不同子网下的机器可以相互通信。网络穿透的本质就是一个子网的机器给另一个网关的公网IP地址和端口发送数据,利用其记录的映射表,使得另一个子网的机器可以接收到数据。
举个栗子,子网机器192.168.1.3:2341给公网机器180.93.45.46:8888发送数据的过程中,在网关(NAT1)会产生一条映射记录。后续其他公网或者子网的机器发送数据到112.93.13.56:43891,就可以让子网机器192.168.1.3:2341收到数据。

穿透完全锥形NAT
两端的NAT,只要有一方是完全锥形NAT,就可以穿透。

- 子网机器192.168.1.3:2341给服务器180.93.45.46:8888发送数据。服务器可以获取到公网的IP地址和端口号112.93.13.56:43891
- 服务器告知子网机器192.168.2.6:6583的子网机器1的网关信息112.93.13.56:43891
- 子网机器192.168.2.6:6583给112.93.13.56:43891发送数据,此时子网机器192.168.1.3:2341可以收到数据,且能够获取到子网机器192.168.2.6:6583的公网IP和端口号(180.20.198.42:9681)
- 子网机器192.168.1.3:2341回发数据给180.20.198.42:9681,子网机器192.168.2.6:6583可以收到数据。穿透成功。
穿透限制锥形NAT

- 子网机器192.168.1.3:2341给服务器180.93.45.46:8888发送数据。服务器可以获取到公网的IP地址和端口号112.93.13.56:43891
- 服务器告知子网机器192.168.2.6:6583的子网机器192.168.1.3:2341的网关信息112.93.13.56:43891
- 子网机器192.168.2.6:6583给112.93.13.56:43891发送数据,此时子网机器192.168.1.3:2341是收不到数据的
- 在步骤3发送数据后,子网机器192.168.2.6:6583马上发送数据给服务器180.93.45.46:8888,要求子网机器192.168.1.3:2341发数据到180.20.198.42:9681
- 服务器通知子网机器192.168.1.3:2341,数据里包含公网IP地址180.20.198.42.9681
- 子网机器192.168.1.3:2341发送数据给180.20.198.42.9681,由于此数据被认为是步骤3的回复数据,所以此数据会被允许通过。网关180.20.198.42.9681被穿透。
- 子网机器192.168.2.6:6583发送数据给112.93.13.56:43891,子网机器192.168.1.3:2341收到数据。网关112.93.13.56:43891被穿透。
穿透对称NAT
下面以限制锥形NAT(NAT1),穿透对称NAT为例

- 子网机器192.168.1.3:2341发送数据给服务器180.93.45.46:8888,请求与子网机器192.168.2.6:6583进行透传
- 服务器发数据给子网机器192.168.2.6:6583,数据内容包括另一子网网关的公网IP地址和端口号112.93.13.56:43891
- 子网机器192.168.2.6:6583收到数据,发送数据给112.93.13.56:43891。此时数据时不会被允许进入子网机器192.168.1.3:2341的网段。但此时NAT2会产生新的映射记录(iAddr:iPort)(这个端口是不会有人知道的,只能靠猜)
- 子网机器192.168.2.6:6583发送数据给服务器的另一个端口8889,此时NAT2会产生一条新的映射记录(mAddr:mPort)。同时服务器也能获取到mAddr:mPort
- 服务器发送信息通知子网机器192.168.1.3:2341,告知数据mAddr:mPort。此时根据iAddr:iPort和mAddr:mPort产生的时间间隔很短,可以猜测iPort的值。(为了提高猜测的准确性,可以在产生iAddr:iPort之前,做一次步骤4的操作(nAddr:nPort),这样iAddr:iPort就会被夹在nAddr:nPort和mAddr:mPort之间,提高猜测的准确性。)(TeamViewer就是这么做的)
- 猜测到准确iPort的值之后,就可以进行穿透限制锥形NAT的步骤4了
(图片均来自网络)
感谢King老师
2020.3.26 23:37 广州
网友评论