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

news2024/10/5 21:15:06

文章目录

  • 前言:
    • 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.coloradmin.cn/o/1621772.html

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

相关文章

微信小程序使用echarts组件实现饼状统计图功能

微信小程序使用echarts组件实现饼状统计图功能 使用echarts实现在微信小程序中统计图的功能&#xff0c;具体的实现步骤思路可进我主页查看我的另一篇博文https://blog.csdn.net/weixin_45465881/article/details/138171153进行查看&#xff0c;本篇文章主要使用echarts组件实…

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

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

Yolov5 v7.0目标检测——详细记录环境配置、自定义数据处理、模型训练与常用错误解决方法(数据集为河道漂浮物)

1. Yolov5 YOLOv5是是YOLO系列的一个延伸&#xff0c;其网络结构共分为&#xff1a;input、backbone、neck和head四个模块&#xff0c;yolov5对yolov4网络的四个部分都进行了修改&#xff0c;并取得了较大的提升&#xff0c;在input端使用了Mosaic数据增强、自适应锚框计算、自…

鸿蒙云函数调试坑点

如果你要本地调试请使用 const {payload, action} event.body/** 本地调试不需要序列化远程需要序列化 */ // const {payload, action} JSON.parse(event.body) const {payload, action} event.body 注意: 只要修改云函数&#xff0c;必须上传云函数 如果使用 const {pay…

牛客NC98 判断t1树中是否有与t2树完全相同的子树【simple 深度优先dfs C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/4eaccec5ee8f4fe8a4309463b807a542 思路 深度优先搜索暴力匹配 思路和算法这是一种最朴素的方法——深度优先搜索枚举 s 中的每一个节点&#xff0c;判断这个点的子树是否和 t 相等。如何判断一个节点的子树是否…

HTTP/1.1,HTTP/2.0和HTTP/3.0 各版本协议的详解(2024-04-24)

1、HTTP介绍 HTTP 协议有多个版本&#xff0c;目前广泛使用的是 HTTP/1.1 和 HTTP/2&#xff0c;以及正在逐步推广的 HTTP/3。 HTTP/1.1&#xff1a;支持持久连接&#xff0c;允许多个请求/响应通过同一个 TCP 连接传输&#xff0c;减少了建立和关闭连接的消耗。 HTTP/2&#…

基于STM32和阿里云的智能台灯(STM32+ESP8266+MQTT+阿里云+语音模块)

一、主要完成功能 1、冷光模式和暖光模式两种灯光 主要支持冷光和暖光模式两种&#xff0c;可以通过语音模块或手机app远程切换冷暖光 2、自动模式和手动模式 主要支持手动模式和自动两种模式&#xff08;app或语音助手切换&#xff09; (1)自动模式&#xff1a;根据环境光照…

vscode 使用文件模板功能来添加版权信息

vscode 新建文件的时候&#xff0c;自动填充作者及版权信息 无需使用插件&#xff0c;操作如下&#xff1a; 选择 “首选项(Preferences)”。在搜索框中输入 “file template” 或者 “文件模板”&#xff0c;然后选择相关的设置项。 {"C_Cpp.clang_format_fallbackSt…

[lesson58]类模板的概念和意义

类模板的概念和意义 类模板 一些类主要用于存储和组织数据元素 类中数据组织的方式和数据元素的具体类型无关 如&#xff1a;数组类、链表类、Stack类、Queue类等 C中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需要实现的功能。 C中的类模板…

Docker 开启远程安全访问

说明 如果你的服务器是公网IP&#xff0c;并且开放了docker的远程访问&#xff0c;如果没有进行保护是非常危险的&#xff0c;任何人都可以向你的docker中推送镜像、运行实例。我曾开放过阿里云服务器中docker的远程访问权限&#xff0c;在没有开启保护的状态下&#xff0c;几…

企业微信hook接口协议,根据手机号搜索联系人

根据手机号搜索联系人 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid":"3240fde0-45e2-48c0-90e8-cb098d0ebe43","phoneNumber":"1357xxxx" } 返回示例 {"data&q…

抖音 小程序 获取手机号 报错 getPhoneNumber:fail auth deny

这是因为 当前小程序没有获取 手机号的 权限 此能力仅支持小程序通过试运营期后可用&#xff0c;默认获取权限&#xff0c;无需申请&#xff1b; https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/guide/open-capabilities/acquire-phone-number-acqu…

用斐波那契数列感受算法的神奇(21亿耗时0.2毫秒)

目录 一、回顾斐波那契数列 二、简单递归方法 &#xff08;一&#xff09;解决思路 &#xff08;二&#xff09;代码展示 &#xff08;三&#xff09;性能分析 三、采用递归HashMap缓存 &#xff08;一&#xff09;解决思路 &#xff08;二&#xff09;代码展示 &…

深度学习系列65:数字人openHeygen详解

1. 主流程分析 从inference.py函数进入&#xff0c;主要流程包括&#xff1a; 1&#xff09; 使用cv2获取视频中所有帧的列表&#xff0c;如下&#xff1a; 2&#xff09;定义Croper。核心代码为69行&#xff1a;full_frames_RGB, crop, quad croper.crop(full_frames_RGB)。…

公开课学习——基于索引B+树精准建立高性能索引

文章目录 遇到慢查询怎么办&#xff1f;—— 创建索引联合索引的底层的数据存储结构长什么样&#xff1f; mysql脑图 阿里开发手册 遇到慢查询怎么办&#xff1f;—— 创建索引 不用索引的话一个一个找太慢了&#xff0c;用索引就快的多。 假如使用树这样的结构建立索引&#x…

Spring - 3 ( 12000 字 Spring 入门级教程 )

一&#xff1a;Spring Web MVC入门 1.1 响应 在我们前⾯的代码例子中&#xff0c;都已经设置了响应数据, Http 响应结果可以是数据, 也可以是静态页面&#xff0c;也可以针对响应设置状态码, Header 信息等. 1.2 返回静态页面 创建前端页面 index.html(注意路径) html代码 …

frp 实现 http / tcp 内网穿透(穿透 wordpress )

frp 实现 http / tcp 内网穿透&#xff08;穿透 wordpress &#xff09; 1. 背景简介与软件安装2. 服务端配置2.1 配置文件2.2 wordpress 配置文件2.3 frps 自启动 3.客户端配置3.1 配置文件3.2 frpc 自启动 同步发布在个人笔记frp 实现 http / tcp 内网穿透&#xff08;穿透 w…

HZNUCTF -- web

HZNUCTF第五届校赛实践赛初赛 Web方向 WriteUp-CSDN博客 ezssti 下载文件 访问 /login 可由源代码中看到 Eval 函数 &#xff0c;可以任意命令执行 按照格式&#xff0c;可执行命令 POST &#xff1a;name{{.Eval "env"}} 可以得到flag &#xff08;尝试ls 只能列出…

就业班 第三阶段(负载均衡) 2401--4.19 day3

二、企业 keepalived 高可用项目实战 1、Keepalived VRRP 介绍 keepalived是什么keepalived是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单点故障。 ​ keepalived工作原理keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundan…

微软发布Phi-3 Mini,性能媲美GPT-3.5、Llama-3,可在手机端运行

前言 微软发布了最新版的Phi系列小型语言模型(SLM) - Phi-3。这个系列包括3个不同参数规模的版本&#xff1a;Phi-3 Mini (38亿参数)、Phi-3 Small (70亿参数)和Phi-3 Medium (140亿参数)。 Phi系列模型是微软研究团队开发的小规模参数语言模型。从第一代Phi-1到第二代Phi-2&…