
◆ 博主名称: 小此方-CSDN博客 大家好,欢迎来到小此方的博客。
⭐️网络系列个人专栏: 【主题曲】计算机网络
⭐️此方的GitHub: github_此方
⭐️ 我们思考 (Rethink) · 我们重建 (Rebuild) · 我们记录 (Record)
文章目录
- 概要&序論
- 一、内网穿透技术:打破公网与内网的边界
-
- [1.1 核心背景:NAT带来的访问阻碍](#1.1 核心背景:NAT带来的访问阻碍)
- [1.2 第一步:公司电脑主动找云服务器,建立第一层 NAT 通道](#1.2 第一步:公司电脑主动找云服务器,建立第一层 NAT 通道)
- [1.3 第二步:在家发起请求,建立第二层 NAT 通道](#1.3 第二步:在家发起请求,建立第二层 NAT 通道)
- [1.4 第三步:云服务器做"接力",拼接两条 NAT 通道](#1.4 第三步:云服务器做“接力”,拼接两条 NAT 通道)
- [1.5 总结:什么是内网穿透?](#1.5 总结:什么是内网穿透?)
- 二、内网打洞技术:P2P直连的底层逻辑
-
- [2.1 角色定位与初始状态](#2.1 角色定位与初始状态)
- [2.2 打洞全过程揭秘](#2.2 打洞全过程揭秘)
-
- [2.2.1 步骤1:各自向服务器"报到",建立各自的NAT映射](#2.2.1 步骤1:各自向服务器“报到”,建立各自的NAT映射)
- [2.2.2 步骤2:交换公网IP和端口("牵线")](#2.2.2 步骤2:交换公网IP和端口(“牵线”))
- [2.2.3 步骤3:核心步骤------双向"打洞"](#2.2.3 步骤3:核心步骤——双向“打洞”)
- [2.2.4 步骤4:通道打通,开始P2P直连传输](#2.2.4 步骤4:通道打通,开始P2P直连传输)
- [2.3 经典案例:快播(Qvod)与P2P模式](#2.3 经典案例:快播(Qvod)与P2P模式)
- [2.4 基于内网穿透的直播方案架构](#2.4 基于内网穿透的直播方案架构)
- [2.5 为什么运营商要封禁常见端口?](#2.5 为什么运营商要封禁常见端口?)
-
- [2.5.1 商业利益与业务隔离(最核心原因)](#2.5.1 商业利益与业务隔离(最核心原因))
- [2.5.2 防止"私设服务器"](#2.5.2 防止“私设服务器”)
- 三、局域网通信核心:交换机如何划分碰撞域
-
- [3.1 交换机的地址学习与转发机制](#3.1 交换机的地址学习与转发机制)
- [3.2 系统性串联所有知识](#3.2 系统性串联所有知识)
概要&序論
Hello大家好,我是此方。本文讲解内网穿透,内网打洞,和交换机。
一、内网穿透技术:打破公网与内网的边界
引入一个非常现实的问题:我回家了,我不能访问我公司的内网,那么公司出问题了,我应该如何解决呢?
这就引出了我们要讲的第一个硬核技术------内网穿透。
1.1 核心背景:NAT带来的访问阻碍
假设我们在家里,想访问公司电脑的 22 端口(SSH 远程桌面/终端服务)。
此时的困境在于:
- 公司电脑藏在公司内网路由器后面,外界无法直接打通进去。
- 我们自己的家用电脑同样处于家庭内网中,没有公网 IP。
但是,我们拥有一台云服务器。它拥有公网 IP,任何人都能在公网上直接找到它。
为了打破这个僵局,我们需要借助一款内网穿透工具(比如 frp,分为服务端 frps 和客户端 frpc) 。整体架构部署如下:云服务器上运行 frps,公司电脑和家里的电脑上都部署配置 frpc。
1.2 第一步:公司电脑主动找云服务器,建立第一层 NAT 通道

既然外网进不去内网,公司电脑就主动从内网往外打通。我们将公司机器上运行的 frpc 配置好,把本地的 22 端口映射到云服务器的 8888 端口,这也就是将内网服务暴露在公网上的配置。
公司电脑主动向云服务器发起 TCP 连接。公司路由器在自己的 NAT 表里记下一笔:内网公司电脑:端口 <----> 路由器公网IP:临时端口。
这意味着:从内网往外打通的这条通道(通道 B)已经建立,后续云服务器顺着这条通道发回的数据,公司 NAT 路由器都会放行并交给公司电脑。而且,只要双方保持通信,这个 NAT 映射就不会断掉,公司电脑和云服务器一直保持这条通道畅通,云服务器也就随时能找到公司电脑了。
1.3 第二步:在家发起请求,建立第二层 NAT 通道
现在,你在家里的电脑上打开 SSH 软件,输入:访问 云服务器IP 的 8888 端口。
家里电脑主动向云服务器的 8888 端口发送请求。你家里的路由器同样在自己的 NAT 表里记下一笔:内网你的电脑:端口 <----> 家里路由器公网IP:临时端口。
云服务器收到你的请求后,通过你家路由器的 NAT 表就能把响应送回你家电脑(通道 A 建立)。
1.4 第三步:云服务器做"接力",拼接两条 NAT 通道
现在,云服务器手里抓着两条打通的通道:
- 通道 A:连着你在家里的电脑(通过你家路由器的 NAT)。
- 通道 B:连着公司的电脑(通过公司路由器的 NAT)。
云服务器按照之前配置好的规则(8888 端口对应 22 端口),开始做数据接力。
对于去程数据包:你在家发往 云服务器:8888 的数据包,到达云服务器后,云服务器直接把它顺着通道 B 推进去。公司路由器看到这是之前打通的回程流量,顺理成章地放行,数据包准确送达公司电脑的 22 端口。
对于回程数据包:公司电脑 22 端口吐出响应数据,顺着通道 B 传给云服务器。云服务器收到后,再顺着通道 A 传回给你家电脑。你家路由器根据 NAT 映射,把数据还原交给你。
1.5 总结:什么是内网穿透?
所谓"把内网 22 端口映射到公网 8888 端口",本质就是:
公司电脑从内向外打通一个 NAT 通道到云服务器;你从家打通另一个 NAT 通道到云服务器。云服务器在中间把 8888 端口收到的流量,塞进发往内网 22 端口的 NAT 通道里。 这样,我们就成功实现了直接访问云服务器 8888 端口,等同于直接访问家里或公司的 Linux 机器 22 端口。
二、内网打洞技术:P2P直连的底层逻辑
内网打洞和内网穿透基本上原理是一回事,都是为了让处于不同内网(NAT之后)的设备能够互相通信。但内网穿透依赖云服务器做中转,而内网打洞的终极目标是:绕过云服务器,实现两台机器的P2P(点对点)直连。

图中展现了一个典型的场景:左边是公司或学校的网络,右边是家里的网络。两边都有出入口路由器,各自拥有WAN口IP(如1.2.3.4和4.3.2.1)。中间的云服务器作为中间人,而底层的P2P箭头则代表最终建立的直连通道。这种向外暴露一个公网IP的技术就叫做内网打洞。
2.1 角色定位与初始状态
为了弄懂打洞,我们先明确三个角色的位置:
- 客户端 A(公司机器):位于公司 NAT 路由器后。
- 客户端 B(家里机器):位于家里 NAT 路由器后。
- 中转服务器(STUN/信令服务器):位于公网,两边都能访问到它。
2.2 打洞全过程揭秘
内网打洞的完整过程分为四个核心步骤:
2.2.1 步骤1:各自向服务器"报到",建立各自的NAT映射
A和B都主动给公网服务器发送一个数据包(报到)。为什么要主动?因为路由器的安全机制默认是不允许外部主动访问内网的,必须由内网先发出去,路由器才会记录。
A发包给服务器:公司路由器在NAT表里生成记录,建立内网A到公网 IP_A:端口_A 的映射。服务器收包后得知:A在公网上的"门牌号"是 IP_A:端口_A。
B发包给服务器:家里路由器同样在NAT表里生成记录,建立内网B到公网 IP_B:端口_B 的映射。服务器收包后得知:B在公网上的"门牌号"是 IP_B:端口_B。
2.2.2 步骤2:交换公网IP和端口("牵线")
公网服务器充当"媒人",把收集到的对方公网门牌号互相交换:服务器把 IP_B:端口_B 发送给A;同时,服务器把 IP_A:端口_A 发送给B。至此,A和B都知道了对方的公网门牌号。
2.2.3 步骤3:核心步骤------双向"打洞"
由于路由器的安全机制(未打通前,陌生公网IP发来的数据包会被丢弃),A和B必须同时向对方的公网门牌号发起试探性发包:
A尝试给B发包(目标:IP_B:端口_B):A的路由器会在NAT表里记下:"A正在尝试访问 IP_B:端口_B"。此时A的路由器已经开了一条缝(打好了一半洞)。这个包到达B的路由器时,因为B的路由器之前没记录过A,这个包会被B的路由器拦截丢弃。
B几乎同时尝试给A发包(目标:IP_A:端口_A):B的路由器也在NAT表里记下:"B正在尝试访问 IP_A:端口_A"。此时B的路由器也开了一条缝(打好了另一半洞)。当这个包到达A的路由器时,A的路由器查NAT表:"咦,A刚才确实尝试访问过这个 IP_B:端口_B!"A的路由器判定这是合法回程流量,直接放行!数据包成功送达A!
2.2.4 步骤4:通道打通,开始P2P直连传输
A收到B发来的包后,立刻进行回应。此时B的路由器也因为此前做过试探记录,顺利放行A的回应包。打洞成功!双向的NAT路由器都记录了对方的合法访问权限。接下来,A和B就可以绕过云服务器,直接通过双方路由器的公网端口进行高效的P2P直连数据传输。
2.3 经典案例:快播(Qvod)与P2P模式
"快播"(Qvod)当年风靡一时的底层技术,正是极其经典的 P2P(点对点)+ NAT 打洞应用。
我们可以用快播看视频的场景,把上面讲的打洞过程还原出来:
- 传统模式 vs 快播 P2P 模式:传统视频网站(如早期的优酷),如果你想看电影,必须从优酷的中央服务器下载。看的人越多,服务器带宽压力越大,容易卡顿。
- 快播 P2P 模式:快播的中央服务器只负责帮你"找人(打洞)"。一旦打通,视频文件全靠你和其他正在看这部电影的普通用户之间互相传,完全不占用快播官方服务器的流量。
这就是内网打洞技术的魅力所在:用极小的中心化服务器成本,撬动了庞大的去中心化P2P网络。
2.4 基于内网穿透的直播方案架构

内网穿透和打洞技术,不仅能让个人远程办公,在大型商业场景中也大有可为。比如基于内网穿透的直播方案。
如果我的所有直播的信息全部由直播服务平台的服务器转发,那么服务器的压力就太大了。于是,直播平台就把看直播的一群人和发直播的人多对一的,把各自的IP发送给对方,这样发直播的人就直接把直播发送给看直播的人了(这就用到了P2P打洞技术)。
同时,直播平台为了更好的形成录播,于是直播平台就可以把自己也当作一个观众,接收直播人的直播,然后保存起来。
2.5 为什么运营商要封禁常见端口?
虽然技术上行得通,但在现实中,运营商往往会封锁 80、443、22、8080 等常见服务端口,这背后的核心原因有两个。
2.5.1 商业利益与业务隔离(最核心原因)
家宽与商宽的价差:家用宽带(家宽)价格便宜且通常只有动态 IP(甚至 NAT 后面的内网 IP);企业专线(商宽)价格昂贵,但提供固定的公网 IP 和无限制的上行流量。
2.5.2 防止"私设服务器"
如果你通过内网穿透/打洞把家里的电脑改造成网站服务器、文件下载站或商业 API,本质上就是用廉价的家宽去抢商业专线的生意。运营商为了维护商业模式,会严格限制家宽用户对外提供服务(特别是封锁 80、443、22、8080 等常见服务端口)。这就是为什么我们做内网穿透时,往往需要用云服务器的高位端口进行转发的原因。
三、局域网通信核心:交换机如何划分碰撞域
讲完了宏观的穿透与打洞,我们回到局域网的最底层。在之前的数据链路层中,我们提到了以太网是一个共享的碰撞域。那么,交换机是如何解决这个问题的?
局域网中主机越多越好,还是越少越好?越少越好。 交换机作为工作在数据链路层的设备,其核心作用就是划分碰撞域。
3.1 交换机的地址学习与转发机制
如图中所示,交换机连接了主机A、B、C、D、E。

- 首次各主机通信,交换机收到信息后标记一个收到一个标记一个,知道了在交换机左侧碰撞域中有哪几个主机右侧有哪几个主机(构建MAC地址表)。
- 然后发送报文的时候,如果A发送给D,交换机就不做转发给另一边,减小了一侧碰撞的概率。
- 当一侧发生碰撞的时候,报文不发送给另一侧,于是减小了报文的碰撞影响范围。
3.2 系统性串联所有知识
到这里,我们从物理层、数据链路层的交换机、网络层的路由与IP分片、传输层的TCP/UDP,一路讲到了应用层的代理与穿透。
去应对面试时,如果面试官问:"浏览器发起http,到得到网页的整个过程,帮我描述一下,越详细越好!" 你现在已经拥有了系统性的把所有知识串联起来的能力,这是一道极好的综合性面试题。

至此,整个网络通信原理与内网穿透专题,圆满结束!
剩余最后知识点:多路转接。
好的本期内容就到这里,如果对你有帮助,还不要忘记点赞三联支持。我是此方,我们下期再见。bye!