Skip to content

什么是 P2P ?

P2P( Peer-to-Peer), 也称点对点或对等网络,在 Easytier 中指直连(直接连接)。

传统网络架构:客户端-服务端,在 Easytier 中指中转/中继(relay)。

对等网络架构:只有节点,节点可以是服务端也可以是客户端。

相较于传统网络架构,P2P 的优势是什么:

1.成本低:无需购买额外的服务器,大幅度节约联机成本。

2.延迟低:不过经过服务器转发数据,有效降低联机延迟。

3.带宽高:网络带宽取决于节点的上限。

P2P 和 NAT 有什么关系,具体有什么影响?

NAT 类型决定了你是否可以和其他用户建立 P2P 连接,建立 P2P 连接之后,通常可以有效的降低网络延迟,网络带宽较高。

当然即使无法建立 P2P 连接,您依然可以通过 Easytier 的 中转/中继/relay 功能进行联机,通常网络延迟较高,网络带宽较低。

建立 P2P 连接难度表

NAT 类型开放型互联网对称型防火墙完全圆锥型 NAT受限圆锥型 NAT端口受限圆锥型 NAT对称型递增 NAT对称型 NAT
开放型互联网容易容易容易容易容易容易容易
对称型防火墙容易简单简单简单简单简单简单
完全圆锥型 NAT容易简单简单简单简单简单简单
受限圆锥型 NAT容易简单容易中等中等中等中等
端口受限圆锥型 NAT容易简单容易中等中等中等中等
对称型递增 NAT容易简单容易中等中等困难困难
对称型 NAT容易简单容易中等中等困难极难

说明:NAT 类型仅决定了 P2P 的难度,无法保证 P2P 连接的网络质量,此外无论是哪种类型都无法 100% 保证可以建立 P2P 连接!

注:家用宽带的绝大多数 NAT 类型为:端口受限圆锥型 NAT、对称型递增 NAT、对称型 NAT 和对称型防火墙(仅IPv6)。

​ 移动网络(手机卡/移动数据)的绝大多数 NAT 类型为:对称型 NAT 和对称型防火墙(仅IPv6)。

什么是 NAT 和 NAPT ?

NAT(Network Address Translation)网络地址转换,主要用于实现位于内部网络的主机访问外部网络的功能。当局域网内的主机需要访问外部网络时,通过 NAT 技术可以将其私网地址转为公网地址,并且多个私网用户可以共用一个公网地址,这样既可保证网络互通,又节省了公网地址。

NAPT(Network Address Port Translation)也称为 NAT-PT 或 PAT,网络地址端口转换,允许多个私网地址映射到同一个公网地址的不同端口;通常是企业,家庭上网的默认方式。

什么是 NAT 类型?NAT 类型有哪些,它们有什么区别?

NAT 的类型决定了外部主机如何与内部主机建立连接,以下为所有的 NAT 类型极其特点:

Open Internet(开放型互联网/公网/直接映射+端点无关过滤)

该类型不使用 NAT,地址为公网 IP,可以直接被其他用户连接,例如: IPv4 120.120.120.120:25565 ← 111.111.111.111:x(x代表任意端口) 120.120.120.120:25565 ← 222.222.222.222:x(x代表任意端口) 120.120.120.120:25565 ← 333.333.333.333:x(x代表任意端口) 120.120.120.120:25565 ← 444.444.444.444:x(x代表任意端口)

IPv6 [240e:3fd8:256a:3367::1]:25565 ← [240e::1]:x(x代表任意端口) [240e:3fd8:256a:3367::1]:25565 ← [240e::2]:x(x代表任意端口) [240e:3fd8:256a:3367::1]:25565 ← [240e::3]:x(x代表任意端口) [240e:3fd8:256a:3367::1]:25565 ← [240e::4]:x(x代表任意端口)

该类型常见于防火墙放行的公网 IP 或者无防火墙的公网IP。

Symmetric Firewall(对称型防火墙/直接映射+地址和端口相关过滤)

该类型和 Open Internet 相同,但其所在的设备有防火墙对入站进行过滤,此时其他用户无法直接连接该端口,例如: IPv4 120.120.120.120:25565 ↚ 111.111.111.111:x(x代表任意端口) 120.120.120.120:25565 ↚ 222.222.222.222:x(x代表任意端口) 120.120.120.120:25565 ↚ 333.333.333.333:x(x代表任意端口) 120.120.120.120:25565 ↚ 444.444.444.444:x(x代表任意端口)

IPv6 [240e:3fd8:256a:3367::1]:25565 ↚ [240e::1]:x(x代表任意端口) [240e:3fd8:256a:3367::1]:25565 ↚ [240e::2]:x(x代表任意端口) [240e:3fd8:256a:3367::1]:25565 ↚ [240e::3]:x(x代表任意端口) [240e:3fd8:256a:3367::1]:25565 ↚ [240e::4]:x(x代表任意端口)

该类型常见于有防火墙的公网 IP,但可以通过打洞进行连接,能否直连取决于防火墙的策略。

No Pat NAT(Basic NAT/基础 NAT/端点无关映射+端点无关过滤)

该类型只进行地址转换,端口保持一致,例如: IPv4 192.168.1.1:25565 ← 120.120.120.120:25565 ← 111.111.111.111:x(x代表任意端口) 192.168.1.1:25565 ← 120.120.120.120:25565 ← 222.222.222.222:x(x代表任意端口) 192.168.1.1:25565 ← 120.120.120.120:25565 ← 333.333.333.333:x(x代表任意端口) 192.168.1.1:25565 ← 120.120.120.120:25565 ← 444.444.444.444:x(x代表任意端口)

IPv6 [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:25565 ← [240e::1]:x(x代表任意端口) [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:25565 ← [240e::2]:x(x代表任意端口) [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:25565 ← [240e::3]:x(x代表任意端口) [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:25565 ← [240e::4]:x(x代表任意端口)

Full Cone NAT(完全圆锥型 NAT/端点无关映射+端点无关过滤/NAT1)

该类型会将地址和端口都进行转换,例如: IPv4 192.168.1.1:25565 ← 120.120.120.120:35565 ← 111.111.111.111:x(x代表任意端口) 192.168.1.1:25565 ← 120.120.120.120:35565 ← 222.222.222.222:x(x代表任意端口) 192.168.1.1:25565 ← 120.120.120.120:35565 ← 333.333.333.333:x(x代表任意端口) 192.168.1.1:25565 ← 120.120.120.120:35565 ← 444.444.444.444:x(x代表任意端口)

IPv6 [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:35565 ← [240e::1]:x(x代表任意端口) [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:35565 ← [240e::2]:x(x代表任意端口) [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:35565 ← [240e::3]:x(x代表任意端口) [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:35565 ← [240e::4]:x(x代表任意端口)

该类型的策略是:我在内网中开放了25565这个端口,任何用户都可以通过转换后的公网端口35565连接进来。

Restricted Cone NAT(受限圆锥型 NAT/端点无关映射+地址有关过滤/NAT2)

该类型在 Full Cone NAT 基础上限制了其他用户的 IP 地址,例如: IPv4 192.168.1.1:25565 ← 120.120.120.120:35565 ← 111.111.111.111:x(x代表任意端口) 192.168.1.1:25565 ← 120.120.120.120:35565 ↚ 222.222.222.222:x(x代表任意端口) 192.168.1.1:25565 ← 120.120.120.120:35565 ↚ 333.333.333.333:x(x代表任意端口) 192.168.1.1:25565 ← 120.120.120.120:35565 ↚ 444.444.444.444:x(x代表任意端口)

IPv6 [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:35565 ← [240e::1]:x(x代表任意端口) [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:35565 ↚ [240e::2]:x(x代表任意端口) [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:35565 ↚ [240e::3]:x(x代表任意端口) [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:35565 ↚ [240e::4]:x(x代表任意端口)

该类型的策略是:我在内网中开放了25565这个端口,只有我指定的 IP 地址 才可以通过转换后的公网端口35565连接进来。 其中(111.111.111.111和240e::1)为我指定的 IP 地址。

Port Restricted Cone NAT(端口受限圆锥型 NAT/端点无关映射+地址和端口有关过滤/NAT3)

该类型在 Restricted Cone NAT 基础上限制了其他用户的端口号,例如: IPv4 192.168.1.1:25565 ← 120.120.120.120:35565 ← 111.111.111.111:11010 192.168.1.1:25565 ← 120.120.120.120:35565 ↚ 111.111.111.111:22020 192.168.1.1:25565 ← 120.120.120.120:35565 ↚ 222.222.222.222:x(x代表任意端口) 192.168.1.1:25565 ← 120.120.120.120:35565 ↚ 333.333.333.333:x(x代表任意端口)

IPv6 [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:35565 ← [240e::1]:11010 [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:35565 ↚ [240e::1]:22020 [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:35565 ↚ [240e::2]:x(x代表任意端口) [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:35565 ↚ [240e::3]:x(x代表任意端口)

该类型的策略是:我在内网中开放了25565这个端口,只有我指定的 IP 地址+端口号 才可以通过转换后的公网端口35565连接进来。 其中(111.111.111.111:11010和[240e::1]:11010)为我指定的 IP 地址+端口号。

Symmetric Easy Increase NAT(对称型递增 NAT/地址和端口相关映射+地址和端口有关过滤/NAT4E)

该类型在 Port Restricted Cone NAT 基础上限制了映射行为,但映射的端口是有规律的,例如: IPv4 192.168.1.1:25565 ← 120.120.120.120:35565 ← 111.111.111.111:11010 192.168.1.1:25565 ← 120.120.120.120:35566 ← 222.222.222.222:22020 192.168.1.1:25565 ← 120.120.120.120:35567 ↚ 111.111.111.111:33030 192.168.1.1:25565 ← 120.120.120.120:35568 ↚ 333.333.333.333:x(x代表任意端口)

IPv6 [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:35565 ← [240e::1]:11010 [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:35567 ← [240e::2]:22020 [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:35569 ↚ [240e::1]:33030 [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:35571 ↚ [240e::3]:x(x代表任意端口)

其中(111.111.111.111:11010、222.222.222.222:11010、[240e::1]:11010、[240e::2]:22020)为我指定的 IP 地址+端口号。

Symmetric NAT(对称型 NAT/地址和端口相关映射+地址和端口有关过滤/NAT4)

该类型在 Symmetric Easy Increase NAT 基础上限制了映射的端口,该端口随机,例如: IPv4 192.168.1.1:25565 ← 120.120.120.120:66534 ← 111.111.111.111:11010 192.168.1.1:25565 ← 120.120.120.120:32768 ← 222.222.222.222:22020 192.168.1.1:25565 ← 120.120.120.120:26984 ↚ 111.111.111.111:33030 192.168.1.1:25565 ← 120.120.120.120:16489 ↚ 333.333.333.333:x(x代表任意端口)

IPv6 [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:55645 ← [240e::1]:11010 [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:32478 ← [240e::2]:22020 [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:43269 ↚ [240e::1]:33030 [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:11443 ↚ [240e::3]:x(x代表任意端口)

其中(111.111.111.111:11010、222.222.222.222:11010、[240e::1]:11010、[240e::2]:22020)为我指定的 IP 地址+端口号。

Blocked(阻止型)

该类型的防火墙非常严格,任何用户都无法连接,例如: IPv4 192.168.1.1:25565 ← 120.120.120.120:66534 ↚ 任意 IP +任意端口

IPv6 [fd00::1]:25565 ← [240e:3fd8:256a:3367::1]:55645 ↚ 任意 IP +任意端口

什么是打洞?

首先我们要理解有状态防火墙:

我们都知道防火墙可以入站和出站,但连接和“方向”是协议设计者想象的产物。

在实际操作中,每个连接最终都是双向的;所有数据包都会来回传输。

那防火墙如何知道什么是入站,什么是出站呢?

这就是状态部分的作用,有状态防火墙的核心是维护一个“状态表”(State Table),记录所有经过的连接的状态信息。当数据包到达时,防火墙不仅检查数据包的头部信息(如源/目的IP、端口、协议),还会检查这个数据包是否属于一个已经建立的、受信任的连接。

绝大多数情况下,NAT 设备都会包含一个有状态防火墙,例如上面提到的对称型防火墙,对于绝大多数的防火墙的规则来说,当 A 向 B 的 IP+指定端口发送数据后,即使 B 的防火墙丢弃了该数据包,但只要 B 通过该 IP+端口发送数据回应 A 的请求,那么 B 的数据就可以通过 A 的防火墙,如下图所示:

A向B发送数据

B向A发送回应

通过防火墙后

我们可以看到 A 和 B 之间在防火墙之间建立了一个连接,而防火墙上面出现了一个“洞”,这就是打洞的由来。

为什么我无法建立 P2P 连接?

通过对 NAT 和打洞的了解,在仅有 NAT 的情况下,建立 P2P 的几率几乎为100%,但我们都知道几乎所有设备都有防火墙,只要运营商将其防火墙的规则设置严格一些,那我们就无法建立 P2P 连接。