美文网首页
去中心化 P2P 网络穿透

去中心化 P2P 网络穿透

作者: besmallw | 来源:发表于2020-03-26 23:37 被阅读0次

    由于我对一些奇奇怪怪的技术比较感兴趣,就特别想去了解它的原理。
    最近看到两个关键词——去中心化,网络穿透。
    了解了相关技术我终于明白,为什么当年王欣说:“技术无罪”。
    用到这类技术的有:kuaibo (王欣),TeamViewer

    简介

    简单来说,去中心化之后就是点对点通信。没有服务器作为中介,两个节点直接通信而不通过服务器。

    中心化网络

    为了更好地理解什么是去中心化网络,先要了解传统的中心化网络。中心化的节点必须是服务器,客户端只能和服务器通信,而不能单独地与另一个客户端直接通信。若客户端想发送信息给另一个客户端,必须通过服务器。在这种模型中,服务器扮演提供服务的角色,而客户端则是被服务的。这样的通信网络,就是传说中的中心化网络。


    中心化网络.png

    去中心化网络

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


    去中心化网络.png

    网络地址映射 NAT

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


    子网与公网通信.png

    NAT 原理

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


    NAT.png

    NAT 实现

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

    端口地址映射.png

    NAT 种类

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

    NAT种类.png

    如何区分?

    1.对称NAT vs 锥形NAT

    在区分之前,必须先明白一点:NAT 会为子网机器的每一个网络进程都分配一个地址和端口,从而能够将子网网络进程与公网地址做映射。

    准备一个子网客户端,两台公网服务器。

    1. 用客户端上的同一个进程,同一个socket,分别给两台服务器发数据
    2. 服务器收到数据后,会得到客户端的IP地址(公网的IP)
    3. 将两台服务器获取到的客户端的IP地址做对比。如果相同,则为锥形NAT,如果不同,则为对称NAT。

    2.限制锥形NAT vs 完全锥形NAT

    准备一个子网客户端,两台公网服务器。

    1. 客户端给服务器1发数据,服务器1收到数据后,会得到客户端的IP地址(公网的IP)
    2. 服务器1将客户端的IP地址告诉服务器2,由服务器2发数据到客户端的IP地址(服务器1告知的)
    3. 如果子网机器能收到数据,则为完全锥形NAT,如果收不到数据,则为限制锥形NAT。

    3.IP限制锥形NAT vs 端口限制锥形NAT

    准备一个子网客户端,一台公网服务器。

    1. 客户端给服务器的8888端口发数据
    2. 服务器获取到客户端IP地址后,用另一个端口给客户端发数据(8889)
    3. 如果客户端收到数据,则为IP限制锥形NAT,如果客户端收不到数据,则为端口限制锥形NAT。(这里的结论还不严谨)
    4. 最后一步,子网机器用同一个socket,再给服务器8888端口发数据,服务器收到数据,则上面结论成立(严谨)。

    网络穿透

    网络穿透,就是能够让公网的机器(多数指的是网关)找到子网的机器。
    穿透下图中的两个网关,使得在两个在不同子网下的机器可以相互通信。网络穿透的本质就是一个子网的机器给另一个网关的公网IP地址和端口发送数据,利用其记录的映射表,使得另一个子网的机器可以接收到数据。
    举个栗子,子网机器192.168.1.3:2341给公网机器180.93.45.46:8888发送数据的过程中,在网关(NAT1)会产生一条映射记录。后续其他公网或者子网的机器发送数据到112.93.13.56:43891,就可以让子网机器192.168.1.3:2341收到数据。


    网络穿透.png

    穿透完全锥形NAT

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


    穿透完全锥形NAT.png
    1. 子网机器192.168.1.3:2341给服务器180.93.45.46:8888发送数据。服务器可以获取到公网的IP地址和端口号112.93.13.56:43891
    2. 服务器告知子网机器192.168.2.6:6583的子网机器1的网关信息112.93.13.56:43891
    3. 子网机器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)
    4. 子网机器192.168.1.3:2341回发数据给180.20.198.42:9681,子网机器192.168.2.6:6583可以收到数据。穿透成功。

    穿透限制锥形NAT

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

    穿透对称NAT

    下面以限制锥形NAT(NAT1),穿透对称NAT为例


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

    (图片均来自网络)

    感谢King老师


    2020.3.26 23:37 广州

    相关文章

      网友评论

          本文标题:去中心化 P2P 网络穿透

          本文链接:https://www.haomeiwen.com/subject/uslfuhtx.html