网络数据包是如何在网线中传输的?
在上一期内容中,我们探讨了网络数据包的创建过程:应用程序将数据交给操作系统,经过传输层添加端口信息、网络层添加 IP 地址、数据链路层添加 MAC 地址并形成以太网帧。
当数据封装成以太网帧后,它暂时还保存在电脑的内存中。接下来,操作系统需要通知网卡发送这批数据。那么,数据是如何从内存“搬”到网卡,并最终变成网线中传输的电信号的呢?
1. DMA:高效的数据搬运工
CPU 不会将数据一个字节一个字地搬到网卡里,因为这样会占用大量的计算时间。真正负责搬运数据的机制叫做 DMA(Direct Memory Access,直接内存访问)。
网卡是一块能够主动访问系统内存的硬件设备。其工作流程如下:
- 准备描述符:网卡驱动会在内存中准备一个发送队列。队列里存放的不是完整数据,而是一组描述符(Descriptors)。描述符可以理解为一组数据清单,记录了需要发送的数据在内存中的地址、长度以及是否需要计算校验和等信息。
- 通知网卡:驱动写入网卡的寄存器,通知网卡发送队列中出现了新任务。
- DMA 传输:网卡收到通知后,通过 PCIe 总线直接读取描述符,并根据描述符中的内存地址,将真正的数据读取到网卡内部。
在这个过程中,CPU 只负责告诉网卡数据在哪里,网卡负责自己去取。CPU 无需全程参与数据搬运,可以继续运行应用程序或处理其他任务,从而大幅提升了系统效率。

2. MAC 层:数据链路层的组织者
数据进入网卡后,首先由 MAC 模块处理。这里的 MAC 并非指苹果电脑,而是 Media Access Control(介质访问控制) 的缩写。MAC 模块位于网卡的数据链路层,负责按照以太网规则组织和发送数据。
MAC 模块的主要工作包括:
- 添加前导码和帧开始定界符:
- 前导码(Preamble):一段规律变化的比特序列,作用是让接收端同步时钟,提前准备接收数据。
- 帧开始定界符(SFD):紧随前导码之后,告诉接收端同步部分结束,真正的以太网帧马上开始。
- 帧组装与校验:按照以太网规范排列字段,补齐过短的数据,并计算 FCS(帧校验序列)。
- 输出比特流:将完整的比特流交给下一层的 PHY 模块。

3. PHY 层:数字信号到物理电信号的转换
PHY(Physical Layer Transceiver,物理层收发器) 负责在数字数据和物理信号之间进行转换。它一端连接网卡中的 MAC 模块,另一端连接网线。
需要明确的是,网线里传输的不是数字 0 和 1,而是不断变化的电信号。PHY 模块的处理流程如下:
3.1 编码与扰码
PHY 首先按照当前以太网标准对数据进行编码和扰码,将一组比特转换成一个可以在线缆上传输的符号。
3.2 差分信号传输
经过编码后,PHY 会把数字符号转换成差分电信号(Differential Signal)。
- 原理:在同一对线路上,传输方向相反的电压变化。接收端不判断某一根线的绝对电压高低,而是比较两根线之间的电压差。
- 抗干扰优势:假设外界电磁干扰同时影响了两根线,两根线的电压会一起变化,但它们之间的差值变化较小。这样就能抵消大部分共模干扰。
- 双绞线设计:网线内部将几根铜线缠绕成双绞线,并不断改变几根线所处的位置,使得它们受到的外界干扰更加接近,从而进一步提高差分传输的抗干扰能力。

3.3 信号发射
电信号通过网卡接口中的隔离变压器进入网线,再沿着铜线向另一端传播。传输的是连续变化的电磁信号,而非一颗颗独立的“0”和“1”。
4. 接收端:从电信号回到应用程序
当电信号到达接收端时,过程逆向进行:
- PHY 层处理:接收端的 PHY 检测到电压变化后,进行放大均衡、时钟恢复和信号判决,将收到的符号解码成比特流。
- MAC 层处理:接收端的 MAC 模块识别前导码和帧开始定界符,提取目标 MAC、源 MAC、类型、数据和 FCS,并检查 CRC 结果。
- 数据写入内存:如果帧没有损坏且目标 MAC 地址符合接收条件,网卡通过 DMA 将收到的数据写入系统内存,并通知 CPU 和操作系统。
- 逐层拆封:
- 数据链路层去掉以太网头部;
- 网络层读取 IP 头部;
- 传输层读取 TCP 或 UDP 头部;
- 最后根据目标端口,将数据交给对应的应用程序。

至此,一个网络数据包完成了从发送端内存到接收端应用程序的完整旅程。