在学习网络编程时,我们通常会关注内核网络协议栈的相关知识。然而,回到 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,帧的比特流可能是:
- 前导码:用于接收方的同步。
- 比特流:10101010 10101010 10101010 10101010 10101010 10101010 10101010 10101011。
- 帧头:
- 目标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)。
- 数据部分:发送的实际内容,比如Hello:
-
H = 01001000
-
e = 01100101
-
l = 01101100
-
l = 01101100
-
o = 01101111
- 帧尾:
- 帧校验序列(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)
接收端如何处理帧
- 解码电信号:将高低电平转换成比特流。
- 校验帧完整性:根据FCS检查数据是否有错误。
- 解析帧内容:从帧中提取目标MAC地址,如果匹配本设备,继续处理。提取数据部分,将其交给上层(如网络层)。