ARP
a)源主机获取目的IP地址的方式
①在浏览器输入网址时,源主机会先进行DNS查询.DNS服务器会返回该域名对应的IP地址.②用户或管理员可以直接输入目标设备的IP地址(如ping 192.168.1.100命令).③某些协议(如DHCP、bonjour/mDNS)可以在本地网络中广播服务请求,并接收包含服务提供者IP地址的响应.④对于非本地网络的通信,源主机知道默认网关的IP地址(或通过路由表确定下一条路由器的IP地址).虽然这不是最终目的主机的IP,但对于源主机来说,这个网关IP就是数据包离开本地网络时需要发送到的目的IP.
→
应用程序工作在传输层以上,只需关心逻辑地址,而MAC地址是数据链路层的概念,对上层透明.
b)MAC地址作用
①层次运作→交换机是构建本地网络的核心设备,它工作在数据链路层,只看帧头中的源MAC地址和目标MAC地址,完全不关心IP包头内容.交换机通过学习源MAC地址和端口的映射关系来构建MAC地址表,并据此将帧仅转发到目标MAC地址所在的端口.
②高效本地通信→MAC地址和交换机的组合使得本地通信高效,无需上层协议(IP)或路由器介入.
c)
ARP(address resolution protocol),即地址解析协议,是根据IP地址(逻辑地址)获取MAC地址的一种TCP/IP协议.在以太网通信中,数据以"帧"的方式进行传输的,帧格式里面包含目的主机的MAC地址.源主机的应用程序知道目的主机的IP地址,却不知道目的主机的MAC地址.而目的主机的MAC地址直接被网卡接收和解析,当解析到目的MAC地址非本地MAC地址时,则直接丢弃该包数据,因此通信前需要先获得目的MAC地址,而ARP就是实现此功能.
→
MAC地址的作用域是本地网络(广播域),IP地址的作用域是逻辑网络.IP地址和MAC地址之间没有固定的预先存储的全局映射关系.
→ARP工作流程
①检查ARP缓存(一个存储最近查询过的IP-MAC映射的内存区域,看是否已有目标IP地址对应的MAC映射的内存区域,看是否已有目标IP地址对应的MAC地址);
②ARP广播→ARP请求包=发送方IP地址+发送方MAC地址+目标IP地址+目标MAC地址(设置为全F,表示这是一个广播包);
③广播发送→发送到整个本地网络;
④识别与响应→收到广播帧的设备会检查包中的目标IP地址.如果是自己的,设备准备ARP响应包=发送方IP地址+发送方MAC地址+目标IP地址+目标MAC地址;
⑤单播回复;
⑥缓存与通信.
⑦如果目的主机不在同一个局域网(需要经过路由器),此时源主机知道必须把数据包发送给它的默认网关(通常是是本地路由器),由路由器负责将数据包转发到外部网络.源主机知道默认网关的IP地址(在它的网络配置中指指定).
⑧ARP缓存是动态的,通常只有2-15分钟的有效期(取决于操作系统).当设备更换网卡、DHCP重新分配IP或虚拟机迁移时,IP-MAC映射会改变.旧的ARP条目过期前,查询会返回错误信息.
d)ARP映射是指将IP地址和MAC地址映射起来,分为静态映射和动态映射.静态映射指手动创建一张ARP表,把IP地址和MAC地址关联起来.动态映射指用协议来获取对应的物理地址.
e)以太网包格式(ARP数据位于以太网帧格式的数据段)
→以太网包的字段
①preamble→物理层使用7个字节的同步码(55-55-55-55-55-55-55),实现数据的同步;
②start frame delimiter→使用1个字节的SFD(d5)来表示一帧的开始,后面紧跟着就是以太网的帧头;
③目的MAC地址→MAC地址从应用上分为单播地址、组播地址、广播地址.单播地址用于标志唯一的设备,组播地址标志属于同一组的多个设备,广播地址标志用一网段中的所有设备;
④源MAC地址;
⑤长度/类型→当这两个字节的值小于1536(十六进制为0x0600)时,代表该以太网中数据段的长度;如果这两个字节的值大于1536,则表示该以太网中的数据属于哪个上层协议,例如0x0800代表IP协议(网际协议)、0x0806代表ARP协议(地址解析协议)等;
⑥数据→MTU(maximum transmission unit)=1500;
⑦FCS→CRC校验从以太网帧头开始即不包含前导码和帧起始界定符;
⑧IFG(interpacket gap)→帧间隙的时间就是网络设备和组件在接收一帧之后,需要短暂的时间来恢复并为接收下一帧做准备的时间,IFG的最小值是96bit time,即在媒介中发送96位原始数据所需要的时间.
→ARP包的字段
①以太网帧头部和ARP数据包内部地址的”重复”实际上体现了网络协议栈的分层设计思想.各层地址承担不同作用.(路由器会修改帧头目标MAC(替换为下一跳),但保持ARP包内容不变);
②硬件类型→硬件地址的类型,1表示以太网地址;
③协议类型→要映射的协议地址类型,ARP协议的上层协议为IP协议,因此该协议类型为IP协议,其值为0x0800;
④硬件地址长度→对于以太网上IP地址的ARP请求或应答来说,该值为6;
⑤协议地址长度→对于以太网上IP地址的ARP请求或应答来说,该值为4;
⑥OP→操作码,用于表示该数据包为ARP请求或ARP应答,1表示请求,2表示应答;
⑦源MAC地址+源IP地址
⑧目的MAC地址→在ARP请求时由于不知道接收端MAC地址,因此该字段为广播地址,即48’hff_ff_ff_ff_ff_ff.
RGMII
a)
①MII(medium independent interface)支持10/100Mbps操作,数据位宽4位,在100Mbps传输速率下,时钟频率25Mhz.→RMII是MII的简化版,数据位宽2位,在100Mbps传输速率下,时钟频率50Mhz.
②GMII(Gigabit MII)向下兼容MII接口,支持10/100/1000Mbps操作,数据位宽为8位,在100Mbps传输速率下,时钟频率125Mhz.→RGMII是GMII的简化版,数据位宽为4位,在100Mbps传输速率下,时钟频率125Mhz,因为在时钟的上下沿同时采样数据.在10/100Mbps通信速率下,为时钟单边沿采样.
③RGMII优势是占用的引脚较少,缺点是PCB布线时需要对时钟/控制/数据线进行等长处理,且时序约束较严格.
b)
①MDC→数据管理时钟②MDIO→数据输入/输出管理.(用于配置phy芯片内部寄存器);
②当RGMII工作在100Mbps时,ETH_TXC和ETH_RXC的时钟频率为25MHz,采用上升沿SDR的方式在一个周期内传输4位数据.不过此时ETH_TXCTL和ETH_RXCTL控制信号仍采用上下沿DDR的传输方式.→当工作在10Mbps时,ETH_TXCTL和ETH_RXCTL控制信号采用SDR传输方式;
③
phy层实时校验数据(如帧对齐/符号错误),通过rx_err即时标志错误,与数据流传输同步.
→
错误数据的低4位虽然被采样,但是高4位被即时阻断,MAC永远不会收到完整字节.即错误帧在硬件层被截断,软件无需处理垃圾数据.
④接收端口两种时序
RGMII接收端口的信号对齐模式由硬件上的特殊引脚外接上下拉电阻进行配置.(选择时钟相对于数据,是否增加延迟.)
⑤发送端口时序
Xilinx基础原语
a)
①BUFG全局缓冲原语,其输出到达FPGA内部的IOB/CLB/BRAM的时钟延迟和抖动最小;
②BUFR用于区域时钟网络,它的驱动范围只能局限在一个clock region的逻辑,BUFR相比BUFG,最大优势是偏斜和功耗较小;
③BUFIO是IO时钟网络,其独立于全局时钟资源,适合采集同步数据.它只能驱动IOB的逻辑,不能驱动CLB里的LUT/REG等逻辑.但BUFIO在采集源同步IO数据时,提供非常小的延时,因此非常适合采集比如RGMII接受侧的数据,但是由于其不能驱动FPGA内部逻辑,因此需要BUFIO和BUFG配合使用,以达到最佳性能.如ETH_RXC的时钟经过BUFIO,用来采集端口数据;ETH_RXC经过BUFG,用来作为除端口采集外的其他模块的操作时钟.
b)IDDRE1将输入的DDR信号,转换为两位的SDR信号.
opposite_edge模式下,时钟上升沿输出Q1,时钟下降沿输出Q2.
same_edge模式下,时钟上升沿输出Q1和Q2,但不在用一个时钟周期输出.
SAME_EDGE_PIPELINE模式下,在时钟的上升沿且同一时钟周期内输出Q1和Q2,但整体延时一个周期,一般使用这种模式.
c)配合使用的例子
// 全局时钟缓存
BUFG BUFG_inst(
.I ( rgmii_rxc ),
.o ( rgmii_rxc_bufg ),
);
// IO时钟缓存
BUFIO BUFIO_inst(
.I ( rgmii_rxc ),
.o ( rgmii_rxc_bufio ),
);
// 将输入的上下沿DDR信号,转换为两位单边沿SDR信号
IDDRE1 #(
.DDR_CLK_EDGE("SAME_EDGE_PIPELINE"),
.IS_CB_INVERTED(1'b0),
.IS_C_INVERTED(1'b1)
)IDDRE1_inst(
.Q1 ( rgmii_rxdv_t[0] ),
.Q2 ( rgmii_rxdv_t[1] ),
.C ( rgmii_rxc_bufio ),
.CB ( ~rgmii_rxc_bufio ),
.D ( rgmii_rx_ctrl ),
.R ( 1'b0 )
);
// 时钟专用引脚的rgmii_rxc时钟经过BUFG后,得到gmii_rx_clk,该时钟为全局缓冲时钟,其到达FPGA内部的IOB/CLB/块ram的时钟延迟和抖动都非常小,为其他模块提供操作时钟;另外rgmii_rxc时钟经过BUFIO,专用于采集IO端口的数据.
ARP FPGA实现(正点原子)
a)接收状态机
①中间状态解析错误时,单包数据的接收还未结束,此时应该跳到st_rx_end,而不是st_idle,防止再次把有效数据当作前导码来解析.
b)发送状态机
c)CRC校验模块
①模2运算的核心特点是忽略进位与借位,仅保留本位计算结果.这种特性使其完全与异或逻辑等价.由于模2运算等价于异或,CRC计算电路可直接用异或门构建,无需复杂的进位链,降低硬件开销.
②注意,接收端CRC校验错误,有可能是CRC校验码接收错误,也有可能是数据接收错误.
③计算步骤
步骤1_扩展数据:将原始数据末尾补r个0(r为生成多项式位数减1);
步骤2_按位除法:i)取被除数前r位与生成多项式高位对齐ii)若当前部分余数首位为1,则商为1,并用生成多项式与之异或iii)若首位为0,则商为0,并与全0序列异或(保留原值)
步骤3_更新余数:异或结果去掉首位,补入下一位数据,重复直至数据结束.
(每一步的减法实际是异或,不产生借位;商由余数的首位决定.主要涉及两大操作:模二减法/移位操作.)