zoukankan      html  css  js  c++  java
  • 015 FPGA千兆网ARP通信(一)

    一、ARP协议概述

    ARPAddress Resolution Protocol),即地址解析协议, 是根据 IP 地址(逻辑地址) 获取 MAC 地址的一种 TCP/IP 协议
    在以太网通信中,数据是以“帧”的格式进行传输的,帧格式里面包含目的主机的 MAC地址。
    源主机的应用程序知道目的主机的 IP 地址,却不知道目的主机的 MAC 地址。而目的主机的 MAC地址直接被网卡接收和解析,当解析到目的 MAC 地址非本地 MAC 地址时,则直接丢弃该包数据,因此在通信前需要先获得目的的 MAC 地址,而 ARP 协议正是实现了此功能。

    ARP 协议的基本功能是通过目的设备的 IP 地址,查询目的设备的 MAC 地址,以保证通信的顺利进行。
    MAC 地址在网络中表示网卡的 ID, 每个网卡都需要并有且仅有一个 MAC 地址。在获取到目的 MAC 地址之后,将目的 MAC 地址更新至 ARP 缓存表中,称为 ARP 映射,下次通信时,可以直接从 ARP 缓存表中获取,而不用重新通过 ARP 获取 MAC 地址。但一般 ARP 缓存表会有过期时间,过期后需要重新通过 ARP协议进行获取。


    ARP 映射是指将 IP 地址和 MAC 地址映射起来,分为静态映射和动态映射。
    静态映射指手动创建一张 ARP 表,把 IP 地址和 MAC 地址关联起来。手动绑定之后,源主机在通信之前,就可以直接从 ARP 表中直接找到 IP 地址对应的 MAC 地址,但这样做有一定的局限性,因为 MAC 地址可能会变化,比如:
    1) 机器可能更换 NIC(网络适配器),结果变成一个新的物理地址;
    2) 在某些局域网中, 每当计算机加电时,他的物理地址都要改变一次。
    3) 移动电脑可以从一个物理网络转移到另一个物理网络,这样会改变物理地址。
    要避免这些问题出现,必须定期维护更新 ARP 表,此类比较麻烦而且会影响网络性能。
    动态映射指使用协议来获取相对应的物理地址,之所以用动态这个词是因为这个过程是自动完成的,一般应用程序的用户或系统管理员不必关心。 已经设计出用于实现动态映射协议的有 ARP 和 RARP(逆地址解析协议) 两种,如下图所示。

     ARP IP 地址映射为物理地址, RARP 把物理地址映射为 IP 地址。 RRAP 是被那些没有磁盘驱动器的系统使用(一般是无盘工作站或 终端),此类应用较少,本文不做讨论。

    ARP 协议分为 ARP 请求和 ARP 应答,源主机发起查询目的 MAC 地址的报文称为 ARP 请求,目的主机响应源主机并发送包含本地 MAC 地址的报文称为 ARP 应答。
    当主机需要找出这个网络中的另一个主机的物理地址时,它就可以发送一个 ARP 请求报文,这个报文包含了发送方的 MAC 地址和 IP 地址以及接收方的 IP 地址。

    因为发送方不知道接收方的物理地址,所以这个查询分组会在网络层中进行广播,即 ARP 请求时发送的接收方物理地址为广播地址,用48’hff_ff_ff_ff_ff_ff 表示。 ARP 请求的示意图如下图所示: 

     上图中的主机 A 发起 ARP 请求,由于发送的目的 MAC 地址为广播地址,所以此时局域网中的所有主机都会进行接收并处理这个 ARP 请求报文, 然后进行验证,查看接收方的 IP 地址是不是自己的地址。是则返回 ARP 应答报文,不是则不响应。
    只有验证成功的主机才会返回一个 ARP 应答报文,这个应答报文包含接收方的 IP 地址和物理地址。
    ARP 应答的示意图如下图所示:

     主机 B 利用收到的 ARP 请求报文中的请求方物理地址, 以单播的方式直接发送给主机 A,主机 A 将收到的 ARP 应答报文中的目的 MAC 地址解析出来,将目的 MAC 地址和目的 IP 地址更新至 ARP 缓存表中。
    当再次和主机 A 通信时,可以直接从 ARP 缓存表中获取,而不用重新发起 ARP 请求报文。 需要说明的是,ARP 缓存表中的表项有过期时间(一般为 20 分钟),过期之后,需要重新发起 ARP 请求以获取目的 MAC地址。

    二、以太网MAC帧格式

    以太网 MAC 层帧格式如下图 所示。

    以太网传输数据时按照上面的顺序从头到尾依次被发送和接收,我们下面进一步解释各个区域。
    前导码(Preamble) : 为了实现底层数据的正确阐述,物理层使用 7 个字节同步码(0 1 交替(55-55-55-55-55-55-55))实现数据的同步。
    帧起始界定符(SFDStart Frame Delimiter):使用 1 个字节的 SFD(固定值为 0xd5)来表示一帧的开始,即后面紧跟着传输的就是以太网的帧头。
    目的 MAC 地址: 即接收端物理 MAC 地址,占用 6 个字节。 MAC 地址从应用上可分为单播地址、组播地址和广播地址。

                                 单播地址:第一个字节的最低位为 0,比如 00-00-00-11-11-11,一般用于标志唯一的设备;

                                 组播地址:第一个字节的最低位为 1,比如 01-00-00-11-11-11,一般用于标志同属一组的多个设备;

                                 广播地址:所有 48bit 全为 1,即 FF-FF-FF-FF-FF-FF,它用于标志同一网段中的所有设备。
    MAC 地址:即发送端物理 MAC 地址,占用 6 个字节。
    长度/类型: 上图中的长度/类型具有两个意义,当这两个字节的值小于 1536(十六进制为 0x0600)时,代表该以太网中数据段的长度;如果这两个字节的值大于 1536,则表示该以太网中的数据属于哪个上层协议,例如 0x0800 代表 IP 协议(网际协议) 、 0x0806 代表 ARP 协议(地址解析协议)等。
    数据:以太网中的数据段长度最小 46 个字节, 最大 1500 个字节。最大值 1500 称为以太网的最大传输单元(MTU, Maximum Transmission Unit),之所以限制最大传输单元是因为在多个计算机的数据帧排队等待传输时,如果某个数据帧太大的话,那么其它数据帧等待的时间就会加长,导致体验变差,这就像一个十字路口的红绿灯,你可以让绿灯持续亮一小时,但是等红灯的人一定不愿意的。另外还要考虑网络 I/O控制器缓存区资源以及网络最大的承载能力等因素, 因此最大传输单元是由各种综合因素决定的。为了避免增加额外的配置, 通常以太网的有效数据字段小于 1500 个字节。
    帧检验序列(FCSFrame Check Sequence) : 为了确保数据的正确传输, 在数据的尾部加入了 4 个字节的循环冗余校验码(CRC 校验) 来检测数据是否传输错误。 CRC 数据校验从以太网帧头开始即不包含前 导码和帧起始界定符。 通用的 CRC 标准有 CRC-8、 CRC-16、 CRC-32、 CRC-CCIT,其中在网络通信系统中应用最广泛的是 CRC-32 标准。 

    以太网相邻两帧之间的时间间隔, 即帧间隙IFGInterpacket Gap)。
    帧间隙的时间就是网络设备和组件在接收一帧之后,需要短暂的时间来恢复并为接收下一帧做准备的时间。
    IFG 的最小值是 96 bit time,即在媒介中发送 96 位原始数据所需要的时间,在不同媒介中 IFG 的最小值是不一样的。 不管 10M/100M/1000M 的以太网,两帧之间最少要有 96bit time, IFG 的最少间隔时间计算方法如下:
    10Mbit/s 最小时间为: 96*100ns = 9600ns
    100Mbit/s 最小时间为: 96*10ns = 960ns
    1000Mbit/s 最小时间为: 96*1ns = 96ns

    三、ARP协议

    ARP 协议属于 TCP/IP 协议簇的一种,ARP 协议位于以太网 MAC帧格式的数据段, ARP 数据包格式如下图所示。 

    硬件类型(Hardware type):硬件地址的类型, 1 表示以太网地址。
    协议类型(Protocol type):要映射的协议地址类型, ARP 协议的上层协议为 IP 协议,因此该协议类型为 IP 协议,其值为 0x0800
    硬件地址长度(Hardware size):硬件地址(MAC 地址)的长度,以字节为单位。对于以太网上 IP 地址的 ARP 请求或者应答来说,该值为 6
    协议地址长度(Protocol size): IP 地址的长度,以字节为单位。对于以太网上 IP 地址的 ARP 请求或者应答来说,该值为 4
    OPOpcode):操作码,用于表示该数据包为 ARP 请求或者 ARP 应答。 1 表示 ARP 请求, 2 表示 ARP应答。
    MAC 地址:发送端的硬件地址。
    IP 地址:发送端的协议(IP)地址,如 192.168.1.102
    目的 MAC 地址:接收端的硬件地址,在 ARP 请求时由于不知道接收端 MAC 地址,因此该字段为广播地址,用48’hff_ff_ff_ff_ff_ff 表示。

    目的 IP 地址:接收端的协议(IP)地址,如 192.168.1.10

    由上图可知, 28 字节的 ARP 数据位于以太网帧格式的数据段。由于以太网数据段最少为 46 个字节,而 ARP 数据包总长度为 28 个字节,因此在 ARP 数据段后面需要填充 18 个字节的数据,以满足以太网传输格式的要求。这个填充的过程称为 Padding(填充),填充的数据可以为任意值,但一般为 0。 

    四、RGMII接口

    1、RGMII接口介绍

    MIIMedium Independent Interface, 媒体独立接口): MII 支持 10Mbps 100Mbps 的操作,数据位宽为 位,在 100Mbps 传输速率下,时钟频率为 25Mhz
    RMIIReduced MII): RMII MII 的简化版, 数据位宽为 2 位,在 100Mbps 传输速率下,时钟频率为 50Mhz
    GMIIGigabit MII): GMII 接口向下兼容 MII 接口, 支持 10Mbps100Mbps 1000Mbps 的操作,数据位宽为 位,在 1000Mbps 传输速率下,时钟频率为 125Mhz
    RGMIIReduced GMII): RGMII GMII 的简化版,数据位宽为 4 位,在 1000Mbps 传输速率下,时钟频率为 125Mhz,在时钟的上下沿同时采样数据。 在 100Mbps 和 10Mbps 通信速率下,为单个时钟沿采样。 


    在千兆以太网中,常用的接口为 RGMII GMII 接口。 RGMII 接口的优势是同时适用于10M/100M/1000Mbps 通信速率,同时占用的引脚数较少。但 RGMII 接口也有其缺点,就是在 PCB 布线时需要尽可能对时钟、控制和数据线进行等长处理,且时序约束相对也更为严格。 

    ETH_RXC:接收数据参考时钟, 1000Mbps 速率下,时钟频率为 125MHz,时钟为上下沿同时采样;100Mbps 速率下,时钟频率为 25MHz; 10Mbps 速率下,时钟频率为 2.5MHz, ETH_RXC 由 PHY 侧提供。
    ETH_RXCTLETH_RX_DV):接收数据控制信号。
    ETH_RXD:四位并行的接收数据线。
    ETH_TXC:发送参考时钟, 1000Mbps 速率下,时钟频率为 125MHz,时钟为上下沿同时采样; 100Mbps速率下,时钟频率为 25MHz; 10Mbps 速率下,时钟频率为 2.5MHz, ETH_TXC 由 MAC 侧提供。
    ETH_TXCTLETH_TXEN):发送数据控制信号。
    ETH_TXD:四位并行的发送数据线。
    ETH_RESET_N:芯片复位信号,低电平有效。
    ETH_MDC:数据管理时钟(Management Data Clock),该引脚对 ETH_MDIO 信号提供了一个同步的时钟。
    ETH_MDIO:数据输入/输出管理(Management Data Input/Output),该引脚提供了一个双向信号用于传递管理信息。 RGMII 使用 4bit 数据接口,在 1000Mbps 通信速率下, ETH_TXC ETH_RXC 的时钟频率为 125Mhz,采用上下沿 DDRDouble Data Rate)的方式在一个时钟周期内传输 位数据信号,即上升沿发送/接收低 4位数据, 下降沿发送/接收高 位数据。 ETH_TXCTL 和 ETH_RXCTL 控制信号同样采用 DDR 的方式在一个时钟周期内传输两位控制信号,即上升沿发送/接收数据使能(TX_EN/RX_ DV)信号,下降沿发送/接收使能信号与错误信号的异或值(TX_ERR xor TX_EN、 RX_ERR xor RX_DV)。当 RX_DV 为高电平(表示数据有效), RX_ERR 为低电平(表示数据无错误),则异或的结果值为高电平,因此只有当 ETH_RXCTL和 ETH_TXCTL 信号的上下沿同时为高电平时,发送和接收的数据有效且正确。RGMII 工作在 100Mbps 时, ETH_TXC ETH_RXC 的时钟频率为 25Mhz,采用上升沿 SDR 的方式在一个周期内传输 位数据。不过此时 ETH_TXCTL 和 ETH_RXCTL 控制信号仍采用上下沿 DDR 的传输方式。RGMII 工作在 10Mbps 时, ETH_TXC ETH_RXC 的时钟频率为 2.5Mhz,采用上升沿 SDR 的方式在一个周期内传输 位数据。 ETH_TXCTL 和 ETH_RXCTL 控制信号也采用 SDR 的传输方式。

    2、RGMII接口时序

    PHY 芯片一般支持两种 RGMII 接口传输模式,正常模式和延时模式,两种模式的区别在于时钟、控制信号和数据对齐方式不同,其传输模式由 MDIO 接口或者硬件上的特殊引脚配置。 
    RGMII 发送端口正常模式时序图如下:

    由上图可知, RGMII 发送端口正常模式下,需要满足 TXC 的上下边沿与 TXD TX_CTL 信号的中间位置对齐, TXC 的时钟周期为 8ns,单个高电平或者低电平为 4ns, TXC 相对于 TXD 和 TX_CTL 延时约 2ns。 

    RGMII 发送端口延时模式时序图如下:

     

    由上图可知, RGMII 发送端口延时模式下,需要满足 TXC 的上下边沿与 TXD TX_CTL 信号对齐,相位相同。 B50610 RGMII 发送端口默认采用延时模式,其模式由 MDIO 接口进行配置,如下图 27.1.11 所示。其中寄存器地址 0x1C 的 Bit[9]用于配置发送端口的延时模式,默认配置为 1,即采用延时模式。 

     RGMII 接收端口正常模式时序图如下:

    RGMII 接收端口正常模式下, RXC 的上下边沿与 RXD RX_CTL 信号对齐,相位相同。
    RGMII 接收端口延时模式时序图如下:

    RGMII 接收端口延时模式下, RXC 的上下边沿与 RXD RX_CTL 信号的中间位置对齐, RXC 的时钟周期为 8ns,单个高电平或者低电平为 4ns, RXC 相对于 RXD 和 RX_CTL 延时约 2ns。 B50610 RGMII 接收端口默认采用延时模式,其模式由 MDIO 接口进行配置,如下图 27.1.14 所示。其中寄存器地址 0x18 的 Bit[8]用于配置发送端口的延时模式,默认配置为 1,即采用延时模式。

     图 27.1.14 RGMII 接收端口模式

    RGMII 的接口时序可知:

    RGMII 发送端口在 TXC 时钟的上升沿传输 TXD 的高 4 位和 TX_CTL 的使能信号;下降沿传输 TXD 的低 位和 TX_CTL 的错误信号(实际上是使能信号和错误信号的异或值);
    RGMII 接收端口在 RXC 时钟的上升沿传输 RXD 的高 4 位和 RX_CTL 的使能信号;下降沿传输 RXD 的低4 位和 RX_CTL 的错误信号(实际上是使能信号和错误信号的异或值)。
    因此为了便于正确接收数据以及解析数据,需要将这种双沿采集 位数据的端口转换成常规的单沿采集 位数据的端口,即 RGMII 接口到GMII 接口的转换。

    这个需要借助于 Xilinx 提供的原语进行转换,具体可查询Xilinx的原语。

    五、参考资料

    1、正点原子,领航者 ZYNQ 之 FPGA 开发指南

     


     

     

     



     

  • 相关阅读:
    git merge远程合并
    开发中必知必会的常用Linux命令
    mysql双机双向热备
    入门级实操教程!从概念到部署,全方位了解K8S Ingress!
    linux常用命令,你应该了解的Linux知识
    MFC的静态库.lib、动态库.dll(包含引入库.lib)以及Unicode库示例
    Java 表达式之谜:为什么 index 增加了两次?
    Vavr Option:Java Optional 的另一个选项
    一文详解 Java 的八大基本类型!
    如何找到真正的 public 方法
  • 原文地址:https://www.cnblogs.com/linford/p/15292356.html
Copyright © 2011-2022 走看看