计算机网络原理
第四章 补充理解
我打mc和泰拉之类的游戏会遇到联机的问题,我的理解是这样:
打游戏联机、挂 VPN、用 Sakura 内网穿透
本质上都是在解决一个问题:
两个设备怎么穿过 NAT、防火墙、运营商网络这些中间设备,建立通信。
一、先从家网络说起
家里电脑一般不是直接拿公网 IP。
比如电脑可能是:
或者:
这些都是内网私有地址。
但是家里路由器对外可能只有一个公网 IP,比如:
所以电脑访问外网时,路由器会做 NAT:
转换成:
然后外网服务器只看见:
它不知道你内网真正是 192.168.1.23。
二、为什么访问别人服务器容易,别人访问自己难?
这就是 NAT 的核心影响。
我主动访问外网
比如我打开游戏、访问服务器:
这个容易。
因为是先发出去,NAT 路由器会记一条表:
服务器回包的时候,NAT 知道该转给你。
别人主动连接你
比如你在家里开一个 Minecraft 服务器、泰拉瑞亚服务器,别人想连你:
问题来了:
NAT 路由器收到这个包后可能不知道:
这个包应该转给内网哪台设备?
因为内网可能有:
电脑 手机 平板 电视 NAS 游戏机
所以默认情况下,外部主动访问内网主机经常失败。
这就是为什么很多联机游戏会遇到:
NAT 类型严格
无法加入房间
无法作为主机
P2P 连接失败
需要端口映射
需要内网穿透
三、端口映射是什么?
端口映射就是我手动告诉路由器:
外面访问我公网 IP 的某个端口时,请转发给内网某台机器。
比如:
这样别人访问我的公网 IP 的 25565 端口,就会被转发到你电脑上的 Minecraft 服务器。
这本质就是我在 NAT 路由器上手动加了一条 NAT 转换规则。
对应 NAT 转换表。
四、那 Sakura 内网穿透是什么?
Sakura 内网穿透这类工具,本质上就是一种:
反向隧道 + 端口转发
它解决的是:
我没有公网 IP,或者我不能改路由器端口映射,但我还想让外部访问我内网里的服务。
1. 普通外部访问失败
我开了一个本地服务器:
但我的电脑在 NAT 后面,别人不能直接访问:
因为这个地址只在你家局域网内部有效。
2. Sakura/FRP 这种工具怎么做?
它会让你的电脑主动连接一个有公网 IP 的中转服务器。
比如 Sakura 服务器有公网地址:
我的电脑主动连出去:
这个连接能成功,因为它是我主动发起的,NAT 会放行。
然后外部玩家访问:
Sakura 服务器再通过已经建立好的隧道,把数据转回我的电脑。
逻辑上变成:
3. 对应网络层知识点
这个就对应 NAT
因为我家电脑在 NAT 后面,外部不能直接访问。
隧道
Sakura 会在你电脑和公网服务器之间建立一条“虚拟通道”。
中间盒
Sakura 服务器本质上充当了一个中间转发节点。
端到端原则被破坏
本来理想互联网是:
但现在变成:
中间多了一个设备帮你转发。
五、VPN 和这个有什么关系?
VPN 也和 NAT、隧道强相关。
VPN 的核心是:
在已有网络上再建立一层虚拟网络。
比如你挂 VPN 后,你的电脑会多一个虚拟网卡。
原本你的数据是:
挂 VPN 后可能变成:
六、VPN 本质也是隧道
VPN 会把原来的数据包封装进另一个数据包里。
类似之前讲 IPv6 over IPv4:
VPN 也类似:
所以 VPN 对应:隧道和封装。
七、打游戏挂 VPN 为什么有时有用?
很多人打游戏挂 VPN,不一定是为了“加速物理速度”,而是为了改变路径。
比如你原来的路径是:
可能绕路、丢包、延迟高。
挂 VPN 后路径变成:
如果 VPN 节点到游戏服务器的路由更好,延迟可能降低。
但是也可能更慢,因为中间多经过一个 VPN 服务器。
所以 VPN 不是魔法加速,它做的是:
改变出口位置和网络路径。
八、游戏联机中的 NAT 类型
很多游戏会显示 NAT 类型,比如:
Open
Moderate
Strict
或者:
NAT1
NAT2
NAT3
意思大概是:你的设备能不能比较容易被别人连上。
NAT 开放
别人比较容易连你。
可能原因:
有公网 IP
做了端口映射
UPnP 自动开了端口
NAT 限制比较宽松
NAT 严格
别人很难主动连你。
可能原因:
多层 NAT
运营商 CGNAT
路由器防火墙限制
没有端口映射
UDP 打洞失败
九、什么是 CGNAT?
有时候你家路由器的“公网 IP”其实也不是公网 IP。
你的结构可能是:
运营商也给你套了一层 NAT,这叫:
CGNAT,运营商级 NAT。
这时候你就算在自己家路由器上做端口映射,也不一定有用。
因为外面还有运营商 NAT 挡着。
这就是为什么有些人说:
我明明设置了端口映射,别人还是连不上。
原因可能就是:
十、内网穿透为什么能绕过 CGNAT?
因为内网穿透不要求别人直接连你。
它让你主动连出去到公网服务器。
主动连出去通常是允许的。
所以结构变成:
这条连接是由你主动发起的,可以建立。
然后别人访问 Sakura 的公网端口,Sakura 再通过这条已经建立好的连接把数据转回来。
所以它不需要你拥有公网 IP。
十一、P2P 联机和 UDP 打洞
很多游戏不一定所有数据都经过官方服务器。
有些游戏使用 P2P:
但是 NAT 会阻碍 P2P。
于是有一种技术叫:
NAT traversal,NAT 穿越。
常见方式是:
UDP hole punching,UDP 打洞。
大概意思是:
玩家 A 和玩家 B 都先向一个公网协调服务器发包。
服务器知道两边的公网映射端口后,告诉双方:
你们互相往对方的公网 IP:端口发 UDP 包试试。
如果 NAT 比较宽松,双方就能打通。
如果 NAT 很严格,就失败,只能走中继服务器。
十二、为什么有些游戏联机需要中继服务器?
当 P2P 打洞失败时,只能变成:
这样一定更容易成功,但缺点是:
延迟可能更高
中继服务器压力大
带宽成本高
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,并且做了端口映射
我的电脑:
路由器公网:
端口映射:
朋友连接:
可以成功。
这是最直接的方式。
情况 2:我没有公网 IP,端口映射没用
我的网络可能是:
朋友无法直接连我。
这时候可以用内网穿透。
情况 3:使用 Sakura 内网穿透
我的电脑主动连 Sakura 服务器。
朋友连接:
Sakura 把数据转发给我电脑:
这样即使我没有公网 IP,也可以让别人访问你本地服务。
情况 4:使用 VPN 联机
如果你和朋友加入同一个虚拟局域网,可能会得到虚拟 IP:
这时候你们像在同一个局域网一样通信。
本质是:
十五、总结一下
1. NAT
解决:多个内网设备共享公网 IP。
副作用:外部主动连接内网变困难。
2. 端口映射 / 内网穿透
解决:
外部怎么访问 NAT 后面的内网服务。
端口映射要求你能控制路由器,而且最好有公网 IP。
内网穿透不要求你有公网 IP,因为它通过公网中转服务器。
3. VPN
解决:
让两个网络或主机通过隧道组成一个虚拟网络,或者改变你的网络出口路径。
它可以用于联机,也可以用于改变访问路径。
家庭网络里的设备一般只有私有 IP,靠 NAT 共享公网 IP。 NAT 让内网访问外网很容易,但让外网主动访问内网很困难。 端口映射是在 NAT 上手动开门。 内网穿透是让内网主机主动连公网服务器,再由公网服务器帮忙转发。 VPN 是在公网之上建立一条加密或封装的虚拟隧道,让你看起来像从另一个网络出口出去,或者像和别人处在同一个虚拟局域网。 游戏联机里的 NAT 类型、打洞、中继、加速器,本质都和 NAT、隧道、中间盒、端到端原则有关。
