Fari

Nat

P2P原理

关键字

stun协议\P2P\UDP打洞\NAT

常用方法

中继

使用中继服务器连接两台内网设备,受限于中继节点性能。

逆向连接

当客户端A、B之一有公网地址时可以使用该方法。

UDP打洞

最常见的方法

利用锥形NAT(下文将介绍NAT分类)会将 内网ip+端口 绑定一个 外网ip+端口 的特性实现。理论上来说,利用该特性就可以实现任意主机间的通信,但往往NAT会做很多限制,导致这种直接通信无法完成。下面以限制最多的 Restricted-Port NAT 为例说明:

网络拓扑图

Client A和B仅具有内网地址,有Restricted-Port NAT功能的router A和B将他们的内网地址及端口和外网地址及端口进行绑定,Server S具有外网地址。

限制前提

Restricted-Port NAT 会直接丢弃其他主机 主动 发送过来的报文,只有它向另一台主机发送一个报文后,它才会接收该主机发送过来的一个报文。所以即使A和B映射了公网地址也不能直接通信。

打洞过程
  1. Client A和B分别向S发送一条报文,S会记录下A和B的出口地址及端口(即:1.1.1.1:7777和2.2.2.2:8888)
  2. S分别向A和B返回对方的出口地址及端口
  3. A和B分别向对方的出口地址发送一个报文,由于Restricted-Port NAT的限制,该报文均会被丢弃。但同时,由于都向对方发送了报文,后面就能接收对方发送的报文。此时A和B就可以P2P通信了

NAT分类

基础NAT

只有主机本身就具有公网IP的情况下才能使用,此时基础NAT中会记录一张内网ip和公网ip的映射表

内网地址 外网地址
192.168.1.111 1.1.1.1
192.168.1.222 2.2.2.2
192.168.1.333 3.3.3.3

NAPT

允许多个内网主机公用一个公网IP,通过端口区分,此时NAT中会记录如下映射(有时间限制,超时删除)

内网地址 外网地址
192.168.1.111:1111 1.1.1.1:1111
192.168.1.222:1111 1.1.1.1:2222
192.168.1.333:5555 1.1.1.1:3333
完全锥型

内网地址+端口 和 外网地址+端口 一一绑定,不因访问资源地址变化而变化

出口地址可自由接收 任意外部主机的任意端口 发送来的报文

受限锥型

内网地址+端口 和 外网地址+端口 一一绑定,不因访问资源地址变化而变化