万兆以太网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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/3039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ocr文字识别软件是干什么的?

OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;文字识别软件是一种能够将图像或者扫描的文档中的文字内容转换为可编辑的文本格式的软件。它的主要功能包括&#xff1a; 1. **文字提取&#xff1a;**识别图像中的文字并提取出来&#xff0…

MAVEN的安装与配置

MAVEN的安装与配置 1 简介 1.1 什么是MAVEN? Maven是一个项目构建及管理工具&#xff0c;开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置&#xff0c; Maven 使用了一个标准的目录结构在不同开发工具中也能实现项目结构的统一。Maven提供了清理&#xff0c;编…

Lambda表达式特点

Lambda 表达式是 Java 8 引入的一项重要特性&#xff0c;它们提供了一种更简洁的方式来表达匿名函数。Lambda 表达式允许你将一段代码传递给方法&#xff0c;而不是显式创建一个实现了接口的匿名内部类。Lambda 表达式通常用于实现单个抽象方法的接口&#xff08;即函数式接口&…

javaEE初阶——多线程(九)——JUC常见的类以及线程安全的集合类

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程专题的最后一篇文章:关于JUC常见的类以及线程安全的集合类 如果有不足的或者错误的请您指出! 目录 3.JUC(java.util.concurrent)常见的类3.1Callable接口3.2 RentrantLoc…

超级好看动态视频官网源码

源码介绍 超级好看动态视频引导页源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 超级好看动态…

Android IPC | Android多进程模式

前 言 关于Android的进程间通信&#xff08;即IPC&#xff09;有很多种方式&#xff0c;比如我们常用的AIDL、Socket等&#xff0c;而其中最重要而且最需要掌握的就是AIDL的使用和原理&#xff0c;简单来说它是通过Binder实现的。 关于Binder的知识点非常多&#xff0c;当我们…

三角函数与其他复杂函数在C语言中的实现:CORDIC算法、泰勒公式、查表法与math库详解

在C语言中实现三角函数&#xff0c;通常有四种主要方法&#xff1a;CORDIC算法、泰勒公式展开、查表法以及直接调用C语言的标准数学库。接下来我们将详细介绍这四种方法&#xff0c;并探讨其他可能的补充实现手段。 1. CORDIC算法 CORDIC&#xff08;Coordinate Rotation Dig…

MySQL数据库触发器

用途&#xff1a;订单表table01&#xff0c;运单表table02。 首先有订单表有记录/但是刚开始只有订单号/没有运单号&#xff1b; INSERT INTO testdb.table01 (id, orderid, transportid) VALUES(4, order04, ); 然后运单表有记录/记录有运单号。 INSERT INTO testdb.table…

你如何看待AIGC技术?

你如何看待AIGC技术&#xff1f; AIGC技术&#xff08;Artificial Intelligence Generated Content&#xff09;是指由人工智能生成的内容。它在许多领域都有应用&#xff0c;包括自然语言处理、图像生成、音频合成等。虽然这些技术可以提高效率和创造力&#xff0c;但也需要注…

用C#写一个读取pdf文档内容的库

安装这两个库&#xff0c;第二个库一定要安装否则有些pdf文件读取会出现异常 读取 using iText.Kernel.Pdf; using iText.Kernel.Pdf.Canvas.Parser; using iText.Kernel.Pdf.Canvas.Parser.Listener;namespace TestReadPdf {public static class PdfHelper{public static IE…

军工单位安全内网文件导出,怎样做到严密的安全管控?

军工单位是指承担国家下达的军事装备、产品研制、生产计划任务的企、事业单位&#xff0c;主要包括电子工业部、航空工业总公司、航天工业总公司、兵器工业总公司、核工业总公司、船舶工业总公司、中国工程物理研究院及各省国防工业办公室等。 军工单位的特点主要体现在以下几个…

Java的类是怎样在虚拟机中加载的?详细阐述JVM的加载、验证和解析过程

导航&#xff1a; 【Java笔记踩坑汇总】Java基础JavaWebSSMSpringBootSpringCloud瑞吉外卖/黑马旅游/谷粒商城/学成在线设计模式面试题汇总性能调优/架构设计源码 目录 一、类加载过程概述 二、加载 2.1 基础概念 2.1.1 类加载 2.1.2 类的Class对象 2.1.3 类加载子系统 …

解决 uniapp uni.getLocation 定位经纬度不准问题

【问题描述】 直接使用uni.getLocation获取经纬度不准确&#xff0c;有几百米的偏移。 【解决办法】 加偏移量 //加偏移 let x longitude let y latitude let x_pi (3.14159265358979324 * 3000.0) / 180.0 let z Math.sqrt(x * x y * y) 0.00002 * Math.sin(y * x_pi)…

信息系统项目管理师0067:数据建模(5信息系统工程—5.2数据工程—5.2.1数据建模)

点击查看专栏目录 文章目录 5.2数据工程5.2.1数据建模1.数据模型2.数据建模过程记忆要点总结5.2数据工程 数据工程是信息系统的基础工程。围绕数据的生命周期,规范数据从产生到应用的全过程,目标是为信息系统的运行提供可靠的数据保障和服务,为信息系统之间的数据共享提供安…

图像处理的基本操作

一、PyCharm中安装OpenCV模块 二、读取图像 1、基本语法 OpenCV提供了用于读取图像的imread()方法&#xff0c;其语法如下&#xff1a; image cv2.imread&#xff08;filename&#xff0c;flags&#xff09; &#xff08;1&#xff09;image&#xff1a;是imread方法的返回…

【服务器部署篇】Linux下Tomcat安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

【C++题解】1302. 是否适合晨练?

问题&#xff1a;1302. 是否适合晨练&#xff1f; 类型&#xff1a;分支 题目描述&#xff1a; 夏天到了&#xff0c;气温太高&#xff0c;小明的爷爷每天有晨练的习惯&#xff0c;但有时候温度不适合晨练&#xff1b;小明想编写一个程序&#xff0c;帮助爷爷判断温度是否适合…

MyBatis入门学习一(引入配置、体验CURD)

目录 1、MyBatis概述 1.1 MyBatis简介 1.2 MyBatis架构 1.3 MyBatis执行流程 1.4 与Hibernate的比较 2、MyBatis初体验 2.1 创建并配置项目 2.2 创建数据库表 2.3 引入MyBatis及其配置 2.3.1 MyBatis引入及配置 2.3.2 Log4j引入及配置 2.4 测试 2.4.1 编写测试类 …

C语言之回调函数+可变参数__VA_ARGS__:用法实例(四十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【linux】进程地址被占用

在强制关闭一个udp程序后&#xff0c;重启该程序报错&#xff1a; bind error: Address already in use 查找并关闭占用端口的进程&#xff1a; 首先&#xff0c;确定哪个进程占用了目标端口。在Linux系统中&#xff0c;可以使用以下命令&#xff1a; netstat -tulnp | grep …