在学习网络编程时,我们通常会关注内核网络协议栈的相关知识。然而,回到 OSI 七层模型的角度,数据链路层究竟是如何运作的呢?网线中的电信号是如何转化为网络数据帧和数据包的?本文将对此进行简要探讨。

电信号转变为帧的过程,是通过网络适配器(网卡)来完成的。网卡将物理层的比特流(0和1)按照协议要求,解析并组装成一个个帧。以下是详细解释和一个简单的例子:

比特流和帧的关系

比特流:电信号通过高低电压(或光纤的光开光关)形成一个连续的0和1。

  • 例如:1100110010101011。

帧:是数据链路层的传输单元,包含控制信息和实际数据的结构化包。

  • 帧的结构一般如下:
[帧头 | 数据载荷 | 帧尾]

电信号如何被解析

物理层的任务是接收比特流,将其同步并提供给数据链路层。以下步骤解释解析过程:

步骤1:比特流的物理传输,网卡从网线接收一段电信号,高电平表示1,低电平表示0。示例:1100110010101011。


步骤2:比特流同步,为了正确划分比特,网卡采用时钟信号来同步读取数据。每个比特会占用固定时间,比如1微秒,同步后的比特流:1100110010101011。


步骤3:比特流分组,根据协议定义,将比特流划分为帧。以太网帧的结构如下:

[前导码 | 帧头 | 数据 | 帧尾]
  • 前导码:用于同步通信,通常是7字节的10101010,紧接着是1字节的10101011。
  • 帧头(Header):包含目标MAC地址、源MAC地址和帧类型。
  • 数据(Payload):承载实际的数据(如IP包)。
  • 帧尾(FCS):帧校验序列,用于检测传输错误。

案例

具体组装帧的例子,假设我们发送一个简单的数据 Hello,帧的比特流可能是:

  1. 前导码:用于接收方的同步。
  • 比特流:10101010 10101010 10101010 10101010 10101010 10101010 10101010 10101011。
  1. 帧头:
  • 目标MAC地址:00-14-22-01-23-45(转成二进制:00000000 00010100 00100010 00000001 00100011 01000101)。
  • 源MAC地址:00-16-17-22-33-44(转成二进制:00000000 00010110 00010111 00100010 00110011 01000100)。
  • 帧类型:0800(IPv4,转成二进制:00001000 00000000)。
  1. 数据部分:发送的实际内容,比如Hello:
  • H = 01001000

  • e = 01100101

  • l = 01101100

  • l = 01101100

  • o = 01101111

  1. 帧尾:
  • 帧校验序列(FCS):一种基于CRC的校验码,例如:10101010 10100101。

完整帧:

[前导码] [目标MAC | 源MAC | 帧类型] [数据] [FCS]

对应比特流:

10101010 10101010 10101010 10101010 10101010 10101010 10101010 10101011 		# 前导码
00000000 00010100 00100010 00000001 00100011 01000101												# 帧头,目标MAC地址
00000000 00010110 00010111 00100010 00110011 01000100 											# 帧头,源MAC地址
00001000 00000000 																													# 帧类型
01001000 01100101 01101100 01101100 01101111 												        #数据部分
10101010 10100101 																								          # 帧校验序列(FCS)

接收端如何处理帧

  1. 解码电信号:将高低电平转换成比特流。
  2. 校验帧完整性:根据FCS检查数据是否有错误。
  3. 解析帧内容:从帧中提取目标MAC地址,如果匹配本设备,继续处理。提取数据部分,将其交给上层(如网络层)。