3. 以太网基础:OSI七层模型与TCP/IP四层模型、MAC地址与IP地址、以太网帧结构

做串口转以太网模块,你得先搞懂以太网到底在玩什么。说白了,以太网就是一套规则,让不同设备能互相说话。我刚开始接触这个领域时,也对着各种协议栈发懵。后来发现,只要抓住几个核心概念,整个框架就清晰了。

3.1 OSI七层模型:理想化的通信蓝图

OSI模型是国际标准化组织(ISO)搞出来的。它把网络通信分成了七层。每一层只管自己的事,层与层之间通过接口通信。这种分层思想,在嵌入式系统里太常见了——你想想看,我们做驱动开发不也经常分层吗?

这七层从下到上分别是:

  • 物理层:管的是比特流。网线、RJ45接口、电平信号,都在这一层。我在项目中遇到过,有些便宜的网口变压器,信号质量差,导致丢包率飙升。嗯,这里要注意,物理层的硬件选型不能省。
  • 数据链路层:把比特流组装成帧。MAC地址就在这一层。它负责在同一个局域网内传输数据。
  • 网络层:负责路由和寻址。IP地址就在这一层。它解决的是“数据怎么从A网络到B网络”的问题。
  • 传输层:提供端到端的可靠传输。TCP和UDP都在这一层。我个人习惯把这一层理解为“快递员”,保证包裹完整送到。
  • 会话层:管理会话,建立和断开连接。
  • 表示层:处理数据格式,比如加密、压缩。
  • 应用层:直接面向用户。HTTP、FTP、MQTT都在这里。

重要提示:在嵌入式开发中,我们通常只关心下面四层。上面三层很多时候由协议栈或操作系统帮你搞定了。你写代码时,主要跟数据链路层、网络层、传输层打交道。

3.2 TCP/IP四层模型:实际工程中的标准

OSI模型太理想化了。实际工程中,大家都用TCP/IP四层模型。它把OSI的上三层合并成了应用层,把物理层和数据链路层合并成了网络接口层。

四层模型长这样:

TCP/IP模型 对应OSI层 常见协议/硬件
应用层 5-7层 HTTP、MQTT、CoAP
传输层 第4层 TCP、UDP
网络层 第3层 IP、ICMP
网络接口层 1-2层 以太网、Wi-Fi

为什么实际都用TCP/IP?因为简单、高效。OSI七层模型更像教科书,而TCP/IP是实战派。我做串口转以太网模块时,用的就是TCP/IP模型。你只需要实现网络接口层到传输层的功能,应用层交给用户去定义。

个人经验:我建议初学者先别纠结OSI的会话层和表示层。你先把TCP/IP的四层搞明白,能调通一个ping包,就算入门了。我曾经带过一个新人,花了两周研究OSI的表示层,结果连网线都没插对。

3.3 MAC地址与IP地址:两个世界的身份标识

这两个地址,是网络通信的基石。很多人搞混它们,其实很简单。

MAC地址:也叫物理地址。它烧录在网卡里,全球唯一。长度48位,通常写成6组十六进制数,比如 00:1A:2B:3C:4D:5E。MAC地址工作在数据链路层,负责在同一个局域网内找到设备。

IP地址:逻辑地址。它由网络管理员分配,或者通过DHCP自动获取。IPv4地址是32位,写成4组十进制数,比如 192.168.1.100。IP地址工作在网络层,负责跨网络寻址。

你想想看,MAC地址就像你的身份证号,一辈子不变。IP地址就像你的家庭住址,搬家了就变了。数据在局域网内传输,靠MAC地址。跨网络传输,靠IP地址。

避坑指南:我曾经在调试一个串口转以太网模块时,发现设备能ping通,但就是连不上服务器。查了半天,原来是MAC地址冲突了。两个设备用了相同的MAC地址,交换机直接懵了。所以,量产时一定要确保每个模块的MAC地址唯一。你可以从芯片厂商买一段MAC地址池,或者用设备序列号生成。

3.4 以太网帧结构:数据在线上怎么跑

数据在以太网上传输,不是裸奔的。它被包装成一个帧。帧结构是固定的,你写驱动时得按这个格式来解析和组装。

标准的以太网帧长这样:

| 前导码 (7字节) | 帧起始定界符 (1字节) | 目标MAC (6字节) | 源MAC (6字节) | 类型/长度 (2字节) | 数据 (46-1500字节) | FCS (4字节) |

我来拆解一下:

  • 前导码:7个字节的10101010...,用来同步时钟。接收端靠它锁定比特流。
  • 帧起始定界符:1个字节的10101011,表示帧正式开始。
  • 目标MAC:6字节,你要发给谁。
  • 源MAC:6字节,你是谁。
  • 类型/长度:2字节。如果值大于1536,表示上层协议类型(比如0x0800是IP,0x0806是ARP)。如果值小于等于1500,表示数据长度。
  • 数据:46到1500字节。不够46字节时,要填充到46字节。最大1500字节,这就是MTU(最大传输单元)。
  • FCS:4字节的CRC校验。接收端用这个检查帧有没有损坏。

注意:在嵌入式开发中,前导码和帧起始定界符通常由MAC硬件自动处理。你写软件时,只需要关心目标MAC、源MAC、类型/长度、数据这四个字段。FCS也是硬件自动计算的。但如果你用FPGA或者纯软件协议栈,就得自己处理所有字段了。

举个例子。假设你要发送一个IP数据包。以太网帧的组装过程是这样的:

  1. 把IP数据包放到数据字段里。
  2. 类型字段填0x0800,表示上层是IP协议。
  3. 源MAC填你自己的MAC地址。
  4. 目标MAC填下一跳设备的MAC地址(通过ARP协议获取)。
  5. 计算FCS,附加到帧尾。
  6. 交给物理层发送。

接收端反过来操作。先检查FCS,没问题就剥掉帧头,把数据交给上层协议处理。

我的习惯:调试以太网驱动时,我会先用逻辑分析仪抓一个完整的帧,对照帧结构逐字节检查。这样能快速定位问题。比如有一次,我发现发送的帧总是少4个字节,查了半天,原来是FCS字段没算对。嗯,这种低级错误,犯过一次就不会再犯了。

好了,以太网基础就讲到这里。下一章我们开始动手,看看怎么用MCU的MAC外设和PHY芯片,真正跑起来一个以太网接口。