网络数据包是如何在网线中传输的?

网络数据包是如何在网线中传输的?

在上一期内容中,我们探讨了网络数据包的创建过程:应用程序将数据交给操作系统,经过传输层添加端口信息、网络层添加 IP 地址、数据链路层添加 MAC 地址并形成以太网帧。

当数据封装成以太网帧后,它暂时还保存在电脑的内存中。接下来,操作系统需要通知网卡发送这批数据。那么,数据是如何从内存“搬”到网卡,并最终变成网线中传输的电信号的呢?

1. DMA:高效的数据搬运工

CPU 不会将数据一个字节一个字地搬到网卡里,因为这样会占用大量的计算时间。真正负责搬运数据的机制叫做 DMA(Direct Memory Access,直接内存访问)

网卡是一块能够主动访问系统内存的硬件设备。其工作流程如下:

  1. 准备描述符:网卡驱动会在内存中准备一个发送队列。队列里存放的不是完整数据,而是一组描述符(Descriptors)。描述符可以理解为一组数据清单,记录了需要发送的数据在内存中的地址、长度以及是否需要计算校验和等信息。
  2. 通知网卡:驱动写入网卡的寄存器,通知网卡发送队列中出现了新任务。
  3. DMA 传输:网卡收到通知后,通过 PCIe 总线直接读取描述符,并根据描述符中的内存地址,将真正的数据读取到网卡内部。

在这个过程中,CPU 只负责告诉网卡数据在哪里,网卡负责自己去取。CPU 无需全程参与数据搬运,可以继续运行应用程序或处理其他任务,从而大幅提升了系统效率。

DMA直接内存访问机制

2. MAC 层:数据链路层的组织者

数据进入网卡后,首先由 MAC 模块处理。这里的 MAC 并非指苹果电脑,而是 Media Access Control(介质访问控制) 的缩写。MAC 模块位于网卡的数据链路层,负责按照以太网规则组织和发送数据。

MAC 模块的主要工作包括:

  • 添加前导码和帧开始定界符
    • 前导码(Preamble):一段规律变化的比特序列,作用是让接收端同步时钟,提前准备接收数据。
    • 帧开始定界符(SFD):紧随前导码之后,告诉接收端同步部分结束,真正的以太网帧马上开始。
  • 帧组装与校验:按照以太网规范排列字段,补齐过短的数据,并计算 FCS(帧校验序列)
  • 输出比特流:将完整的比特流交给下一层的 PHY 模块。

MAC层帧组装与同步信号

3. PHY 层:数字信号到物理电信号的转换

PHY(Physical Layer Transceiver,物理层收发器) 负责在数字数据和物理信号之间进行转换。它一端连接网卡中的 MAC 模块,另一端连接网线。

需要明确的是,网线里传输的不是数字 0 和 1,而是不断变化的电信号。PHY 模块的处理流程如下:

3.1 编码与扰码

PHY 首先按照当前以太网标准对数据进行编码和扰码,将一组比特转换成一个可以在线缆上传输的符号。

3.2 差分信号传输

经过编码后,PHY 会把数字符号转换成差分电信号(Differential Signal)

  • 原理:在同一对线路上,传输方向相反的电压变化。接收端不判断某一根线的绝对电压高低,而是比较两根线之间的电压差
  • 抗干扰优势:假设外界电磁干扰同时影响了两根线,两根线的电压会一起变化,但它们之间的差值变化较小。这样就能抵消大部分共模干扰。
  • 双绞线设计:网线内部将几根铜线缠绕成双绞线,并不断改变几根线所处的位置,使得它们受到的外界干扰更加接近,从而进一步提高差分传输的抗干扰能力。

PHY层差分信号与抗干扰原理

3.3 信号发射

电信号通过网卡接口中的隔离变压器进入网线,再沿着铜线向另一端传播。传输的是连续变化的电磁信号,而非一颗颗独立的“0”和“1”。

4. 接收端:从电信号回到应用程序

当电信号到达接收端时,过程逆向进行:

  1. PHY 层处理:接收端的 PHY 检测到电压变化后,进行放大均衡、时钟恢复和信号判决,将收到的符号解码成比特流。
  2. MAC 层处理:接收端的 MAC 模块识别前导码和帧开始定界符,提取目标 MAC、源 MAC、类型、数据和 FCS,并检查 CRC 结果。
  3. 数据写入内存:如果帧没有损坏且目标 MAC 地址符合接收条件,网卡通过 DMA 将收到的数据写入系统内存,并通知 CPU 和操作系统。
  4. 逐层拆封
    • 数据链路层去掉以太网头部;
    • 网络层读取 IP 头部;
    • 传输层读取 TCP 或 UDP 头部;
    • 最后根据目标端口,将数据交给对应的应用程序。

接收端数据还原与逐层拆封

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