← 返回 计算机网络原理

计算机网络原理

第四章 补充理解

我打mc和泰拉之类的游戏会遇到联机的问题,我的理解是这样:

打游戏联机、挂 VPN、用 Sakura 内网穿透

本质上都是在解决一个问题:

两个设备怎么穿过 NAT、防火墙、运营商网络这些中间设备,建立通信。

一、先从家网络说起

家里电脑一般不是直接拿公网 IP。

比如电脑可能是:

192.168.1.23192.168.1.23

或者:

10.0.0.510.0.0.5

这些都是内网私有地址。

但是家里路由器对外可能只有一个公网 IP,比如:

113.120.x.x113.120.x.x

所以电脑访问外网时,路由器会做 NAT:

192.168.1.23:50000192.168.1.23:50000

转换成:

113.120.x.x:62001113.120.x.x:62001

然后外网服务器只看见:

113.120.x.x:62001113.120.x.x:62001

它不知道你内网真正是 192.168.1.23。

二、为什么访问别人服务器容易,别人访问自己难?

这就是 NAT 的核心影响。

我主动访问外网

比如我打开游戏、访问服务器:

我的电脑家庭路由器NAT游戏服务器\text{我}\text{的电脑}\to \text{家庭路由器}NAT\to \text{游戏服务器}

这个容易。

因为是先发出去,NAT 路由器会记一条表:

内网IP:端口公网IP:端口\text{内网}IP:\text{端口}\leftrightarrow \text{公网}IP:\text{端口}

服务器回包的时候,NAT 知道该转给你。

别人主动连接你

比如你在家里开一个 Minecraft 服务器、泰拉瑞亚服务器,别人想连你:

别人你的公网IP:端口\text{别人}\to \text{你的公网}IP:\text{端口}

问题来了:

NAT 路由器收到这个包后可能不知道:

这个包应该转给内网哪台设备?

因为内网可能有:

电脑 手机 平板 电视 NAS 游戏机

所以默认情况下,外部主动访问内网主机经常失败。

这就是为什么很多联机游戏会遇到:

NAT 类型严格

无法加入房间

无法作为主机

P2P 连接失败

需要端口映射

需要内网穿透

三、端口映射是什么?

端口映射就是我手动告诉路由器:

外面访问我公网 IP 的某个端口时,请转发给内网某台机器。

比如:

公网IP:25565192.168.1.23:25565\text{公网}IP:25565\to 192.168.1.23:25565

这样别人访问我的公网 IP 的 25565 端口,就会被转发到你电脑上的 Minecraft 服务器。

这本质就是我在 NAT 路由器上手动加了一条 NAT 转换规则。

对应 NAT 转换表。

四、那 Sakura 内网穿透是什么?

Sakura 内网穿透这类工具,本质上就是一种:

反向隧道 + 端口转发

它解决的是:

我没有公网 IP,或者我不能改路由器端口映射,但我还想让外部访问我内网里的服务。

1. 普通外部访问失败

我开了一个本地服务器:

你的电脑:25565\text{你的电脑}:25565

但我的电脑在 NAT 后面,别人不能直接访问:

192.168.1.23:25565192.168.1.23:25565

因为这个地址只在你家局域网内部有效。

2. Sakura/FRP 这种工具怎么做?

它会让你的电脑主动连接一个有公网 IP 的中转服务器。

比如 Sakura 服务器有公网地址:

sakura服务器IP:某端口sakura\text{服务器}IP:\text{某端口}

我的电脑主动连出去:

我的电脑Sakura服务器\text{我}\text{的电脑}\to Sakura\text{服务器}

这个连接能成功,因为它是我主动发起的,NAT 会放行。

然后外部玩家访问:

Sakura服务器IP:映射端口Sakura\text{服务器}IP:\text{映射端口}

Sakura 服务器再通过已经建立好的隧道,把数据转回我的电脑。

逻辑上变成:

别人Sakura公网服务器隧道我的内网电脑\text{别人}\to Sakura\text{公网服务器}\to \text{隧道}\to \text{我}\text{的内网电脑}

3. 对应网络层知识点

这个就对应 NAT

因为我家电脑在 NAT 后面,外部不能直接访问。

隧道

Sakura 会在你电脑和公网服务器之间建立一条“虚拟通道”。

中间盒

Sakura 服务器本质上充当了一个中间转发节点。

端到端原则被破坏

本来理想互联网是:

主机A主机B\text{主机}A\leftrightarrow \text{主机}B

但现在变成:

主机A中转服务器主机B\text{主机}A\leftrightarrow \text{中转服务器}\leftrightarrow \text{主机}B

中间多了一个设备帮你转发。

五、VPN 和这个有什么关系?

VPN 也和 NAT、隧道强相关。

VPN 的核心是:

在已有网络上再建立一层虚拟网络。

比如你挂 VPN 后,你的电脑会多一个虚拟网卡。

原本你的数据是:

你的电脑路由器目标服务器\text{你的电脑}\to \text{路由器}\to \text{目标服务器}

挂 VPN 后可能变成:

你的电脑VPN隧道VPN服务器目标服务器\text{你的电脑}\to VPN\text{隧道}\to VPN\text{服务器}\to \text{目标服务器}

六、VPN 本质也是隧道

VPN 会把原来的数据包封装进另一个数据包里。

类似之前讲 IPv6 over IPv4:

IPv6数据报封装进IPv4数据报IPv6\text{数据报}\to \text{封装进}IPv4\text{数据报}

VPN 也类似:

原始数据VPN封装通过公网传输VPN服务器解封装\text{原始数据}\to VPN\text{封装}\to \text{通过公网传输}\to VPN\text{服务器解封装}

所以 VPN 对应:隧道和封装。

七、打游戏挂 VPN 为什么有时有用?

很多人打游戏挂 VPN,不一定是为了“加速物理速度”,而是为了改变路径。

比如你原来的路径是:

本地运营商跨网节点游戏服务器\text{你}\to \text{本地运营商}\to \text{跨网节点}\to \text{游戏服务器}

可能绕路、丢包、延迟高。

挂 VPN 后路径变成:

VPN节点游戏服务器\text{你}\to VPN\text{节点}\to \text{游戏服务器}

如果 VPN 节点到游戏服务器的路由更好,延迟可能降低。

但是也可能更慢,因为中间多经过一个 VPN 服务器。

所以 VPN 不是魔法加速,它做的是:

改变出口位置和网络路径。

八、游戏联机中的 NAT 类型

很多游戏会显示 NAT 类型,比如:

Open

Moderate

Strict

或者:

NAT1

NAT2

NAT3

意思大概是:你的设备能不能比较容易被别人连上。

NAT 开放

别人比较容易连你。

可能原因:

有公网 IP

做了端口映射

UPnP 自动开了端口

NAT 限制比较宽松

NAT 严格

别人很难主动连你。

可能原因:

多层 NAT

运营商 CGNAT

路由器防火墙限制

没有端口映射

UDP 打洞失败

九、什么是 CGNAT?

有时候你家路由器的“公网 IP”其实也不是公网 IP。

你的结构可能是:

你的电脑家庭路由器NAT运营商NAT公网\text{你的电脑}\to \text{家庭路由器}NAT\to \text{运营商}NAT\to \text{公网}

运营商也给你套了一层 NAT,这叫:

CGNAT,运营商级 NAT。

这时候你就算在自己家路由器上做端口映射,也不一定有用。

因为外面还有运营商 NAT 挡着。

这就是为什么有些人说:

我明明设置了端口映射,别人还是连不上。

原因可能就是:

你没有真正的公网IP\text{你没有真正的公网}IP

十、内网穿透为什么能绕过 CGNAT?

因为内网穿透不要求别人直接连你。

它让你主动连出去到公网服务器。

主动连出去通常是允许的。

所以结构变成:

你的电脑运营商NATSakura服务器\text{你的电脑}\to \text{运营商}NAT\to Sakura\text{服务器}

这条连接是由你主动发起的,可以建立。

然后别人访问 Sakura 的公网端口,Sakura 再通过这条已经建立好的连接把数据转回来。

所以它不需要你拥有公网 IP。

十一、P2P 联机和 UDP 打洞

很多游戏不一定所有数据都经过官方服务器。

有些游戏使用 P2P:

玩家A玩家B\text{玩家}A\leftrightarrow \text{玩家}B

但是 NAT 会阻碍 P2P。

于是有一种技术叫:

NAT traversal,NAT 穿越。

常见方式是:

UDP hole punching,UDP 打洞。

大概意思是:

玩家 A 和玩家 B 都先向一个公网协调服务器发包。

服务器知道两边的公网映射端口后,告诉双方:

你们互相往对方的公网 IP:端口发 UDP 包试试。

如果 NAT 比较宽松,双方就能打通。

如果 NAT 很严格,就失败,只能走中继服务器。

十二、为什么有些游戏联机需要中继服务器?

当 P2P 打洞失败时,只能变成:

玩家A中继服务器玩家B\text{玩家}A\to \text{中继服务器}\to \text{玩家}B

这样一定更容易成功,但缺点是:

延迟可能更高

中继服务器压力大

带宽成本高

Sakura 内网穿透、某些 VPN 联机、游戏官方中继服务器,本质上都可能在做类似的事情:

中间找一台公网服务器帮两边转发。

十三、把这些工具和计网知识点对应起来

实际工具/现象 | | | | | | | | 对应计网知识 家庭路由器共享上网 | | | | | | | | NAT 192.168.x.x / 10.x.x.x | | | | | | | | 私有地址 开服务器别人连不上 | | | | | | | | NAT 阻止外部主动连接 路由器端口映射 | | | | | | | | 手动配置 NAT 转发表 运营商大内网 | | | | | | | | CGNAT,多层 NAT Sakura 内网穿透 | | | | | | | | 反向隧道 + 端口转发 VPN | | | | | | | | 隧道 + 封装 + 改变出口路由 游戏 P2P 联机 | | | | | | | | NAT 穿越 UDP 打洞 | | | | | | | | NAT traversal 官方中继服务器 | | | | | | | | 中间盒 / relay 防火墙拦端口 | | | | | | | | match + action:匹配端口然后 drop 游戏加速器 | | | | | | | | 通常是改变路由路径或中继转发

十四、用一个游戏例子串起来

假设我想和朋友联机 Minecraft。

情况 1:我有公网 IP,并且做了端口映射

我的电脑:

192.168.1.23:25565192.168.1.23:25565

路由器公网:

113.120.1.2113.120.1.2

端口映射:

113.120.1.2:25565192.168.1.23:25565113.120.1.2:25565\to 192.168.1.23:25565

朋友连接:

113.120.1.2:25565113.120.1.2:25565

可以成功。

这是最直接的方式。

情况 2:我没有公网 IP,端口映射没用

我的网络可能是:

你的电脑家庭NAT运营商NAT公网\text{你的电脑}\to \text{家庭}NAT\to \text{运营商}NAT\to \text{公网}

朋友无法直接连我。

这时候可以用内网穿透。

情况 3:使用 Sakura 内网穿透

我的电脑主动连 Sakura 服务器。

朋友连接:

Sakura服务器IP:某端口Sakura\text{服务器}IP:\text{某端口}

Sakura 把数据转发给我电脑:

朋友Sakura我的电脑\text{朋友}\to Sakura\to \text{我}\text{的电脑}

这样即使我没有公网 IP,也可以让别人访问你本地服务。

情况 4:使用 VPN 联机

如果你和朋友加入同一个虚拟局域网,可能会得到虚拟 IP:

这时候你们像在同一个局域网一样通信。

本质是:

虚拟局域网数据VPN隧道公网传输\text{虚拟局域网数据}\to VPN\text{隧道}\to \text{公网传输}

十五、总结一下

1. NAT

解决:多个内网设备共享公网 IP。

副作用:外部主动连接内网变困难。

2. 端口映射 / 内网穿透

解决:

外部怎么访问 NAT 后面的内网服务。

端口映射要求你能控制路由器,而且最好有公网 IP。

内网穿透不要求你有公网 IP,因为它通过公网中转服务器。

3. VPN

解决:

让两个网络或主机通过隧道组成一个虚拟网络,或者改变你的网络出口路径。

它可以用于联机,也可以用于改变访问路径。

家庭网络里的设备一般只有私有 IP,靠 NAT 共享公网 IP。 NAT 让内网访问外网很容易,但让外网主动访问内网很困难。 端口映射是在 NAT 上手动开门。 内网穿透是让内网主机主动连公网服务器,再由公网服务器帮忙转发。 VPN 是在公网之上建立一条加密或封装的虚拟隧道,让你看起来像从另一个网络出口出去,或者像和别人处在同一个虚拟局域网。 游戏联机里的 NAT 类型、打洞、中继、加速器,本质都和 NAT、隧道、中间盒、端到端原则有关。