写在前面

网络通信是一个庞大的知识体系,协议众多、层次复杂。但如果你从“为什么需要子网掩码”这个问题出发,一路追问下去,会发现所有知识点都能串成一条逻辑闭环的链。这篇文章就是沿着这条链,从最基础的地址划分,到数据如何跨越网络,再到操作系统如何组织这一切,做一次完整的梳理。

读完你可能会发现:网络分层不是上下级的指挥关系,而是一套各司其职、相互约束、软硬协同的协作体系。


一、起点:子网掩码与地址的分工

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 工作流程:

  1. 先查本机 ARP 缓存,有就直接用。

  2. 没有就广播 ARP 请求:“谁是 192.168.1.20?”

  3. 目标主机单播回复自己的 MAC。

  4. 请求方把映射写入 ARP 缓存。

ARP 缓存有老化时间,动态学习,也可以静态绑定。它没有认证机制,因此存在 ARP 欺骗风险。

跨网段时,ARP 解析的是网关的 MAC,不是最终目标的 MAC。


三、数据链路层:以太网与帧

真正在网线、光纤上跑的,是数据帧。IP 包、TCP 段都是逻辑概念,最终都要封装进帧。

以太网帧格式(Ethernet II):

字段长度作用
目的 MAC6 字节接收方
源 MAC6 字节发送方
类型/长度2 字节上层协议(如 0x0800 = IPv4)
数据46–1500 字节载荷
FCS4 字节帧校验序列

接收方分离帧的过程:

  1. 检测前导码 + SFD,找到帧起始。

  2. 按固定 14 字节读帧头。

  3. 用类型/长度字段和上层协议头确定载荷长度。

  4. 用 FCS 做 CRC 校验,失败则丢弃。

  5. 按类型字段把载荷交给上层协议(分用)。

分用是逐层进行的:

  • 链路层靠类型字段分给 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:5000203.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 是指挥官,操作系统是组织者。

核心思想:网络通信的可靠与高速,不是靠某一层的强大,而是靠分层协作、相互约束、软硬分工、快慢路径分离。每一层只做自己该做的事,通过标准接口交接,最终让复杂的全球互联网得以稳定运行。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐