MAC层协议解读及发送代码实现

MAC协议解读

MAC层的功能包含以下几个方面

  1. 帧的封装与解封装
    在数据链路层,MAC层负责将网络层(如IP协议)传递的网络数据报(如IP数据包)封装成帧(Frame),并在接收端解封装成网络层数据报。
    帧通常由两部分组成:MAC头部(包括源MAC地址、目标MAC地址等信息)和数据部分(即从上层传递下来的数据)。
  2. MAC地址(物理地址)
    每个设备(如网络适配器)都有一个唯一的MAC地址。这是硬件厂商在制造时赋予设备的地址,通常是48位(6字节)的地址。MAC地址的作用是标识网络中设备的唯一性。
    MAC地址是不可更改的,与设备的物理硬件相关,通常用于局域网(LAN)中。
  3. 访问控制与碰撞避免
    在共享介质(如以太网)中,多个设备可能同时尝试访问同一通信媒介。MAC层负责协调这一过程,避免或减少通信冲突。
    常见的MAC层协议如CSMA/CD(Carrier Sense Multiple Access with Collision Detection)协议用于以太网中,用于监听媒介并确保数据在无冲突的情况下发送。
  4. 错误检测与校验
    MAC层还负责对传输的数据进行错误检测。以太网帧包含一个CRC校验字段,用于检测传输过程中是否出现错误。
  5. 流量控制
    在一些协议中,MAC层还需要支持流量控制机制,确保发送方不会发送超过接收方处理能力的数据量。

以太网MAC帧格式
以太网帧通常由以下几个部分组成:
目标MAC地址(6字节):
表示接收设备的MAC地址。它可以是单播、广播或多播地址。
源MAC地址(6字节):
表示发送设备的MAC地址。
类型/长度字段(2字节):
用于表示上层协议类型(如IPv4、IPv6、ARP等)或数据字段的长度。
数据字段(46~1500字节):
包含网络层数据,如IP数据包。以太网数据字段的最小长度是46字节,最大长度是1500字节。
帧校验序列(FCS)(4字节):
用于检测传输过程中可能发生的错误。它是通过CRC(循环冗余校验)算法计算出来的。
以太网帧结构如下所示
在这里插入图片描述
以太网中的MAC地址
单播地址:每个设备都有唯一的MAC地址,发送到一个特定设备。
广播地址:MAC地址为FF:FF:FF:FF:FF:FF,表示所有设备。
多播地址:用于发送数据给一组设备的地址。

FPGA实现MAC的功能介绍

在本节中,笔者就MAC发送层的帧封装,CRC校验,流量控制等功能进行实现,关于以太网CRC的计算,在下一章节中,做详细介绍,本章节中实现这三个功能,但不对CRC计算的代码实现进行讲解。
所谓流量控制,即保证传输的ready信号在合适时间内进行拉高以及拉低处理即可,本代码实现的流量控制较为简单,保证以太网传输的最小帧长即可
帧间隙(IFG):以太网相邻两帧时间间隔,为96bit time
如1000Mbit/s最小时间为96*1ns,即12个时钟周期。即在本帧MAC报文传输完毕后,12个周期后,再进行下一帧报文的传输。
MAC层在进发送数据时,还需要在帧头前,插入前导码和帧起始界定符,整体要实现的MAC层输出包结构如下图所示
在这里插入图片描述

MAC层发送代码编写与仿真测试

MAC层代码的发送逻辑与UDP层,IP层大致相似,只是要封装的帧头不同而已,其MAC层还要在数据尾部添加4Bytes的CRC校验结果。在添加帧头时,同样只需要对上层传输来的数据包做固定延迟即可,使用移位RAM实现。CRC计算的为MAC头部以及数据部分,不包含前导码以及帧起始界定符。
实现逻辑梳理

  • 检测到上层数据包传来,打拍处理,降低耦合,使能计数器,在对应计数器值的情况下,做帧头信息封装。
  • 在字节封装到MAC层包头即目的MAC时,同步启动CRC计算,注意MAC层的上层有ARP层和IP层,对于ARP层,如果是板卡的ARP请求报文,此时是不知道目的MAC的,所以选用广播方式,对于板卡的ARP应答报文,此时是知道目的MAC的,但要提取ARP的报文类型,又会增加端口和判断逻辑,所以为了简化处理,ARP报文统一用广播MAC,IP报文使用指定MAC地址,可从ARP表中获取IP对应的MAC地址。
  • 在帧头封装完毕后,后续连续输出上层传来的数据报文,因为要封装的帧头字节长度为22Bytes,所以对数据包要事先进行22个时钟周期的延迟
  • 在数据输出结尾,追加4Bytes的CRC计算结果,注意先传输低字节,具体原因在CRC计算章节进行详细介绍
  • 关于帧间隔计数器,需要经过严格计算,UDP,IP,MAC进行组包都需要两个时钟时钟周期延迟,共6个时钟周期,用户层接收ready信号做出反应,需要1个时钟周期,故与12个时钟周期相比,还相差5个时钟周期,故在本帧数据传输完成下降沿后,计数4个时钟周期后,再经过一个时钟周期延迟,即可保证最小12个帧周期的间隔。
    按照上面的逻辑顺序,进行封包即可,完成MAC层的发送代码逻辑实现
    仿真测试1:用户层在ready信号为高时,第一次传输80字节,第二次传输96字节,都为自增数,经过UDP层,IP层,MAC层,将封装好的报文输出,仿真测试,可以看出,每层封装正确,输出数据正确,且两帧间隔保证了最小12个时钟周期。
    UDP层组包
    在这里插入图片描述
    IP层组包
    在这里插入图片描述
    MAC层组包
    在这里插入图片描述

帧间隔处理
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值