从子网掩码到操作系统:一次网络通信的闭环之旅
写在前面
网络通信是一个庞大的知识体系,协议众多、层次复杂。但如果你从“为什么需要子网掩码”这个问题出发,一路追问下去,会发现所有知识点都能串成一条逻辑闭环的链。这篇文章就是沿着这条链,从最基础的地址划分,到数据如何跨越网络,再到操作系统如何组织这一切,做一次完整的梳理。
读完你可能会发现:网络分层不是上下级的指挥关系,而是一套各司其职、相互约束、软硬协同的协作体系。
一、起点:子网掩码与地址的分工
IPv4 地址是 32 位,单看 192.168.1.10 无法知道前多少位是网络号、后多少位是主机号。早期用 A/B/C 类地址区分,太死板。子网掩码就是为了灵活划分网络号和主机号。
掩码左边全是连续的 1,右边全是 0。和 IP 做按位与,得到网络号。比如 255.255.255.0 和 192.168.1.10 运算后得到 192.168.1.0。
它的核心作用:
-
判断目标是否在同一局域网:同网段直接发,不同网段交给网关。
-
灵活划分子网:同一个大网络可以切成多个小网段。
-
减少广播域:广播包只在本子网内传播。
一句话:子网掩码让 IP 地址从“一个孤立的数字”变成了“网络号 + 主机号”的结构。
二、寻址与解析:IP、MAC 与 ARP
网络通信需要两种地址:
-
IP 地址:网络层用,负责端到端寻址,可以跨网络。
-
MAC 地址:数据链路层用,负责一跳内的寻址,烧录在网卡上,48 位,全球唯一(理论上)。
发以太网帧时必须填目的 MAC,但应用程序通常只知道对方 IP。ARP(地址解析协议) 就是用来解决“已知 IP 求 MAC”的。
ARP 工作流程:
-
先查本机 ARP 缓存,有就直接用。
-
没有就广播 ARP 请求:“谁是
192.168.1.20?” -
目标主机单播回复自己的 MAC。
-
请求方把映射写入 ARP 缓存。
ARP 缓存有老化时间,动态学习,也可以静态绑定。它没有认证机制,因此存在 ARP 欺骗风险。
跨网段时,ARP 解析的是网关的 MAC,不是最终目标的 MAC。
三、数据链路层:以太网与帧
真正在网线、光纤上跑的,是数据帧。IP 包、TCP 段都是逻辑概念,最终都要封装进帧。
以太网帧格式(Ethernet II):
| 字段 | 长度 | 作用 |
|---|---|---|
| 目的 MAC | 6 字节 | 接收方 |
| 源 MAC | 6 字节 | 发送方 |
| 类型/长度 | 2 字节 | 上层协议(如 0x0800 = IPv4) |
| 数据 | 46–1500 字节 | 载荷 |
| FCS | 4 字节 | 帧校验序列 |
接收方分离帧的过程:
-
检测前导码 + SFD,找到帧起始。
-
按固定 14 字节读帧头。
-
用类型/长度字段和上层协议头确定载荷长度。
-
用 FCS 做 CRC 校验,失败则丢弃。
-
按类型字段把载荷交给上层协议(分用)。
分用是逐层进行的:
-
链路层靠类型字段分给 IP/ARP。
-
网络层靠协议号分给 TCP/UDP/ICMP。
-
传输层靠端口号(及四元组)分给具体应用。
四、链路层的协调:碰撞域与交换机
碰撞域指同一时刻只能有一台主机成功发送的范围。早期用集线器连接的主机都在同一个碰撞域,靠 CSMA/CD 管理:
-
载波侦听:发之前先听,空闲才发。
-
碰撞检测:边发边听,发现冲突立即停止,发 Jam 信号。
-
二进制指数退避:碰撞后随机等待,碰撞次数越多等待范围越大。
-
最小帧长 64 字节:保证发送时间 ≥ 往返传播时间,碰撞一定能被检测到。
帧越长,占用介质时间越久,碰撞概率越高。但真正决定碰撞频率的是介质利用率。
以太网还利用帧间间隔(IFG,96 比特时间) 在帧与帧之间制造空闲窗口,主机在这个间隙里竞争发送。
交换机每个端口是一个独立的碰撞域,支持全双工,从根本上消除了碰撞。它工作在数据链路层,靠 MAC 地址表转发帧。
数据链路层的核心任务:成帧、寻址、差错检测、介质访问控制。它只管“这一跳”,不负责端到端和重传。
五、网络层与传输层:IP、TCP/UDP 与 MTU
MTU(最大传输单元) 是链路层一次能承载的最大上层数据量,以太网标准值是 1500 字节。
MTU 对上层的影响:
-
IPv4:允许路由器分片。分片字段包括标识、MF 标志、片偏移。
-
IPv6:路由器不分片,只有源主机能分,依赖路径 MTU 发现(PMTUD)。
-
TCP:通过 MSS 协商从源头避免分片。
MSS = MTU - IP 头 - TCP 头,以太网下通常 1460。 -
UDP:没有协商,大包直接交给 IP 分片,风险高。现代 UDP 应用倾向于自己控制包大小。
识别分片:
-
IPv4 看 MF 标志和片偏移:MF=1 或偏移>0 就是分片。
-
IPv6 看有没有 Fragment 扩展头。
分片重组:
-
接收方用 源 IP + 目的 IP + 协议号 + 标识 归组。
-
靠 片偏移 + MF 还原总长度,检查区间是否连续覆盖。
-
有超时定时器,收不全就丢弃。
-
重组在目的主机的 IP 层完成,中间路由器只分片不重组。
六、公网与私网:NAT 与地址转换
私有 IP(RFC 1918)只在本地唯一,公网 IP 全球唯一。私有 IP 出公网必须经过 NAT。
NAT 的核心是一张双向映射表,内网侧和外网侧互为键值:
| 内网侧 | 外网侧 |
|---|---|
| 192.168.1.10:5000 | 203.0.113.5:60000 |
出方向替换源 IP 和源端口,回方向替换目的 IP 和目的端口。原 IP 和原端口号都可被替换,替换后要重算校验和。
公网在以太网链路上同样需要 ARP,因为每一跳都要用 MAC 封帧。非以太网链路(PPP、MPLS、4G/5G)用各自机制代替。IPv6 公网用 NDP。
内网打洞:双方都在 NAT 后,通过信令服务器交换出口地址,然后同时向对方发包,触发 NAT 建立映射,实现直连。对称型 NAT 很难打洞,失败时用 TURN 中继。
内网穿透:让外部访问内网服务。有公网 IP 时用端口映射;没有时用反向隧道,内网主动连公网服务器,外部请求经服务器转发。
七、代理技术:正向代理与反向代理
正向代理站在客户端一侧,代表客户端去访问目标。客户端需要知道代理的存在。用途:隐藏客户端、突破限制、缓存、审计。
反向代理站在服务器一侧,代表服务器接收请求。客户端通常不知道有代理。用途:负载均衡、隐藏后端、SSL 卸载、缓存、安全防护。
正向代理与 NAT 的区别:
-
NAT 在网络层/传输层改包,客户端无感知。
-
正向代理在应用层重建连接,客户端需要配置。
-
NAT 是同一条连接改地址,正向代理是两条连接拼接。
透明代理是两者的交叉:部署上像 NAT 一样透明,处理上像正向代理一样能看内容。
八、分层的本质:各司其职,相互约束
网络分层不是上下级关系,而是各层各司其职、通过标准接口互相服务、互相约束的协作体系。
-
每层只解决自己那一层的问题,不越界。
-
上层只能用下层提供的标准接口,不能直接干预下层实现。
-
下层不保证上层成功,上层靠自己弥补下层的不足。
-
下层的限制向上传导,上层必须适配。
接收方向是层层往上传:物理层 → 链路层 → 网络层 → 传输层 → 应用层。每层拆掉自己的头,把载荷交给上一层。中间设备只处理到需要的层,只有目的主机才一路传到应用层。
九、为什么这么快:硬件与操作系统
分层看起来步骤多,但实际速度极快,因为大部分工作由硬件并行完成。
快路径 vs 慢路径:
-
快路径:规则明确、无状态、重复,交给网卡、交换芯片、转发芯片。
-
慢路径:需要决策、有状态、不规则,交给 CPU。
主力硬件:
-
网卡:成帧、FCS 校验、MAC 过滤、DMA、校验和卸载、TSO、RSS。
-
交换芯片:MAC 学习、查表转发、线速转发。
-
路由器转发芯片:路由查表、NAT、隧道封装。
CPU 的角色:控制平面(路由协议、ARP、DHCP)、TCP 状态管理、异常处理、应用层逻辑。它是指挥官,不是搬数据的苦力。
操作系统:通过 socket 提供抽象接口,在内核实现协议栈,管理内存和缓冲区,调度 CPU 和中断,隔离多应用资源,通过驱动和网卡对话。它是组织这一切的体系。
十、闭环总结
从子网掩码出发,我们走过了:
子网掩码 → 路由表 → 以太网 → MAC → MTU → 分片与重组 → 数据帧 → 分离与分用 → 碰撞域与 CSMA/CD → 交换机 → 数据链路层任务 → ARP → NAT → 打洞与穿透 → 正向代理 → 反向代理 → 分层本质 → 层层上传 → 硬件与操作系统
每一层都在为上层提供服务,同时受下层约束。硬件是执行者,CPU 是指挥官,操作系统是组织者。
核心思想:网络通信的可靠与高速,不是靠某一层的强大,而是靠分层协作、相互约束、软硬分工、快慢路径分离。每一层只做自己该做的事,通过标准接口交接,最终让复杂的全球互联网得以稳定运行。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)