万兆以太网MAC设计(7)ARP协议报文格式详解以及ARP层模块设计

2024-04-25 09:28

本文主要是介绍万兆以太网MAC设计(7)ARP协议报文格式详解以及ARP层模块设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言:
    • 1、ARP协议详解
    • 2、ARP工作机制
  • 二、ARP_RX模块设计
  • 三、ARP_TX模块设计
  • 四、ARP_table模块
  • 5、仿真
    • 5.1、发送端
    • 5.2、接收端
    • 5.3、缓存表
  • 总结

前言:

1、ARP协议详解

在这里插入图片描述
ARP数据格式:
硬件类型:表示硬件地址的类型。它的值为1表示以太网地址
协议类型:表示要映射的协议地址类型。它的值为0x0800即表示IP地址
硬件地址长度和协议地址长度:分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上IP地址的ARP请求或应答来说,它们的分别为6和4:
操作类型(OP):1表示ARP请求,2表示ARP应答

2、ARP工作机制

从 ARP 协议的数据包结构来看, 它的硬件类型和协议类型是可配置的, 因此它可以支持多种上层网络协议与下层硬件协议的映射, 写成一般形式, ARP 协议便是要解决 < Protocol, Address > 到硬件地址地址的映射, 目前我们使用的绝大多数局域网都是通过 WIFI (IEEE 802.11, 使用 CSMA/CA 做介质访问控制) 或有线连接 (IEEE 802.3, 使用 CSMA/CD 做介质访问控制) 进行连接, 它们都使用 48 位的 MAC 地址来进行通信, 因此我们只讨论 IP 地址映射为 MAC 地址的情形

当局域网的一台主机需要和另一台主机进行通信时, 假定已知道对方的 IP 地址, 但它没有该 IP 地址对应的 MAC 地址, 此时它需要在该局域网内广播发送 ARP 请求包, ARP 请求包里携带发送者自身的 MAC 地址, 自身的 IP 地址, 希望请求的目标主机的 IP 地址, 目标主机的 MAC 地址字段置为 0, 当 ARP 请求包发出以后, 局域网内的所有主机都将收到这个 ARP 请求。

收到 ARP 数据包的主机执行如下的步骤:

  1. 检查自己的硬件地址类型与 ARP 数据包的硬件地址类型相同, 由于我们讨论的都是在普通的使用 MAC 地址的局域网下, 因此这项检查都是通过的, 当然主机也应 (SHOULD) 在检查硬件地址类型相同之后, 进一步检查硬件地址的长度是否与 ARP 数据包的硬件地址长度是相等的
  2. 主机设置一个布尔型的标志位 Merge_Flag, 其初始值为 false, 如果 ARP 数据包中的发送者主机 IP 和发送者硬件地址在自己的 ARP 映射表中, 则主机应更新本机的 ARP 映射表, 并将 Merge_Flag 设置为 true
  3. 接下来, 主机检查 ARP 数据包中的目标主机 IP 是否其自身, 如果是的话, 则该主机就是 ARP 请求的目标主机, 如果 Merge_Flag 为 false, 则主机应将发送者主机 IP, 发送者 MAC 地址写到自己的 ARP 映射表中, 然后检查 ARP 数据包的操作类型字段, 如果此次的 ARP 数据包是 ARPREQUEST, 此时主机应将发送者的 IP 与发送者的 MAC 地址写到 ARP 数据包的目标主机的 IP 字段和目标主机的硬件地址字段上, 而将自身的 IP 地址与自身的 MAC 地址写到发送者的 IP 字段与发送者的 MAC 地址字段, 并将操作类型字段改为 ARPREPLY, 并以单播的方式发给目标主机

上面的 ARP 处理环节有几点需要注意:

  • ARP 请求是广播发送, 但 ARP 应答是单播发送
  • 主机首先检查 ARP 数据包的发送者 IP 与发送者 MAC 地址是否在自己的 ARP 映射表中, 注意此时并没有预先去检查操作码字段, 换句话说, 无论该 ARP 数据包是 ARP 请求包还是 ARP 应答包, 主机都应首先将发送者主机 IP 与发送者 MAC 地址写到自己本机的 ARP 映射表中

二、ARP_RX模块设计

模块接口:

module ARP_RX#(parameter       P_SRC_IP_ADDR   = {8'd192,8'd168,8'd100,8'd99},parameter       P_SRC_MAC_ADDR  = 48'h01_02_03_04_05_06
)(input           i_clk               ,input           i_rst               ,output [47:0]   o_recv_target_mac   ,output [31:0]   o_recv_target_ip    ,output          o_recv_target_valid ,output          o_arp_reply         ,input  [31:0]   i_dymanic_src_ip    ,input           i_src_ip_valid      ,input  [63:0]   s_axis_mac_data     ,input  [79:0]   s_axis_mac_user     ,input  [7 :0]   s_axis_mac_keep     ,input           s_axis_mac_last     ,input           s_axis_mac_valid    
);
  1. 该模块用于接受ARP报文,不论接收到的ARP报文是请求(request)还是回复(reply)类型,都会记录当前ARP报文当中的源IP和源MAC(o_recv_target_valid),并且将其发送到ARP_table模块进行处理。
  2. 进一步检查ARP报文类型,如果是请求报文并且目的IP地址就是本机IP地址,那么就会产生一个reply触发信号(o_arp_reply),通知ARP_TX模块去产生一个reply回复ARP报文。

三、ARP_TX模块设计

模块接口:

module ARP_TX#(parameter       P_SRC_IP_ADDR   = {8'd192,8'd168,8'd100,8'd99},parameter       P_SRC_MAC_ADDR  = 48'h01_02_03_04_05_06
)(input           i_clk               ,input           i_rst               ,input  [31:0]   i_dymanic_src_ip    ,input           i_src_ip_valid      ,input  [47:0]   i_dymanic_src_mac   ,input           i_src_mac_valid     ,input  [47:0]   i_recv_target_mac   ,input  [31:0]   i_recv_target_ip    ,input           i_recv_target_valid ,input           i_arp_reply         ,input           i_arp_active        ,input  [31:0]   i_arp_active_dst_ip ,output [63:0]   m_axis_arp_data     ,output [79:0]   m_axis_arp_user     ,output [7 :0]   m_axis_arp_keep     ,output          m_axis_arp_last     ,output          m_axis_arp_valid    
);
  1. 该模块可以主动发送ARP请求报文,该过程通过i_arp_activei_arp_active_dst_ip 信号进行控制。
  2. 当接收到产生回复ARP信号i_arp_reply时,会产生一个reply的ARP报文,并且根据接收端发送的**i_recv_target_***信号进行填充回复ARP报文当中的目的IP和MAC字段。

四、ARP_table模块

模块接口:

module ARP_table(input           i_clk               ,input           i_rst               ,input  [47:0]   i_recv_target_mac   ,input  [31:0]   i_recv_target_ip    ,input           i_recv_target_valid ,input  [31:0]   i_seek_ip           ,input           i_seek_valid        ,output [47:0]   o_seek_mac          ,output          o_seek_mac_valid    
);
  1. 只要FPGA接收到任何ARP报文,就会记录ARP报文当中的源IP和MAC,并且交由ARP_table模块进行缓存。
  2. 判断当前需要存储的IP地址是否在当前缓存表当中,如果在,那么就在对应的地址当中重新写入这个IP对应的MAC地址,不管MAC是否相同。
  3. 如果当前缓存表当中没有要存储的IP地址,那么存储地址加1,将该IP地址以及其对应的MAC地址都写入新的地址当中。
  4. 该ARP_table当中最多存储8组IP和MAC地址,地址在0-7循环。

5、仿真

仿真设计:

  1. 产生一个主动ARP信号以及主动ARP请求的IP地址,然后ARP_TX会产生一个ARP request报文。
  2. 将发送端产生的请求ARP报文回环到ARP_RX模块,该模块会处理请求报文,然后产生一个回复ARP报文触发信号(因为接收到的是一个request ARP报文,并且目的IP就是本机),并且ARP_table会缓存信息

5.1、发送端

第一次发送的ARP报文是请求报文,由i_arp_activei_arp_active_dst_ip 触发,第二次发送的是ARP reply报文,由i_arp_reply触发
在这里插入图片描述

5.2、接收端

第一次接受的是arp request报文,并且判断目的IP就是本机,于是产生了一个o_arp_reply信号通知发送端发送arp reply报文。
第二次接收到的是arp reply报文。
在这里插入图片描述

5.3、缓存表

接收端接收到任何ARP报文都会产生对应的i_recv_target_ 信号通知ARP表进行缓存操作。
仿真当中一共收到俩此ARP报文,一次request一次reply,所以i_recv_target_valid拉高了俩次,但是arp表当中俩次操作后依旧只有一组IP和MAC地址,这是因为俩次arp报文当中对应的源IP地址都是一样的,所以只会更新重写,不会在新的地址当中写入。
在这里插入图片描述

总结

完成工程代码参考:https://github.com/shun6-6/Tri_Eth_UDP_pro_stack

这篇关于万兆以太网MAC设计(7)ARP协议报文格式详解以及ARP层模块设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/934291

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。