以太网ICMP测试实验

news2024/12/22 19:53:48

目录

一.概述

1.1IP协议

1.1.1IP协议简介

1.1.2IP协议首部报文格式

1.2ICMP协议

1.2.1ICMP协议简介

1.2.2ICMP报文格式

二.实验任务

三.模块设计

3.1总体模块设计

3.2ICMP模块设计

3.2.1icmp_rx 模块

3.2.2icmp_tx模块

四.modelsim仿真

4.1icmp_rx模块仿真

4.2icmp_tx模块仿真

五.板级验证


一.概述

1.1IP协议

1.1.1IP协议简介

     IP 协议是 TCP/IP 协议簇中的核心协议,也是 TCP/IP 协议的载体,IP 协议规定了数据传输时的基本单元和格式。如下图所示,之所以先介绍IP协议,因为IP协议中包含ICMP协议。即ICMP协议位于IP层的数据段。所有的 TCPUDP ICMP 数据都以 IP 数据报格式传输。

1.1.2IP协议首部报文格式

                  IP首部一共20Byte,1个Byte=8bit,故一行4Byte(32bit),共有5行。

        版本 4 IP 版本号( Version ),这个值设置为二进制的 0100 时表示 IPv4 ,设置为 0110 时表示 IPv6 , 目前使用比较多的 IP 协议版本号是 4
        首部长度 4 位首部长度( IHL Internet Header Length ),表示 IP 首部一共有多少个 32 位( 4 个字节)。 在没有可选字段时,IP 首部长度为 20 个字节,因此首部长度的值为 5
        服务类型 8 位服务类型( TOS Type of service ),该字段被划分成两个子字段: 3 位优先级字段(现在已经基本忽略掉了)和 4 TOS 字段,最后一位固定为 0 。服务类型为 0 时表示一般服务。
        总长度 16 IP 数据报总长度( Total Length ),包括 IP 首部和 IP 数据部分,以字节为单位。我们利用 IP 首部长度和 IP 数据报总长度,就可以知道 IP 数据报中数据内容的起始位置和长度。由于该字段长16bit,所以 IP 数据报最长可达 65535 字节。尽管理论上可以传输长达 65535 字节的 IP 数据报,但实际上还要考虑网络的最大承载能力等因素。
        标识字段 16 位标识( Identification )字段,用来标识主机发送的每一份数据报。通常每发送一份报文它的值就会加 1
        标志字段 3 位标志( Flags )字段,第 1 位为保留位;第 2 位表示禁止分片( 1 表示不分片 0 :允许分片);第 3 位标识更多分片(除了数据报的最后一个分片外,其它分片都为 1 )。
        片偏移 13 位片偏移( Fragment Offset ),在接收方进行数据报重组时用来标识分片的顺序。
        生存时间 8 位生存时间字段, TTL Time To Live )域防止丢失的数据包在无休止的传播,一般被设置为 64 或者 128
        协议 8 位协议( Protocol )类型,表示此数据报所携带上层数据使用的协议类型, ICMP 1 TCP 为6, UDP 17
        首部校验和 16 位首部校验和( Header Checksum ),该字段只校验数据报的首部,不包含数据部分;校验 IP 数据报头部是否被破坏、篡改和丢失等。
        IP 地址 32 位源 IP 地址( Source Address ),即发送端的 IP 地址,如 192.168.1.123
        目的 IP 地址 32 位目的 IP 地址( Destination Address ),即接收端的 IP 地址,如 192.168.1.102
        可选字段:是数据报中的一个可变长度的可选信息,选项字段以 32bit 为界,不足时插入值为 0 的填充字节,保证 IP 首部始终是 32bit 的整数倍。

1.2ICMP协议

1.2.1ICMP协议简介

         ICMP(Internet Control Message Protocol)Internet 控制报文协议。它是 TCP/IP 协议簇的一个子协议,用于在 IP 主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。 ICMP 报文包含在 IP 数据报中,属于 IP 的一个用户。

1.2.2ICMP报文格式

    由1.1.1中的图可知ICMP首部一共8Byte,一行4Byte,故一共两行。

         类型 (type) :占用了 8 bit 位,前面我们说,是 ICMP 报文类型,用于标识错误类型的差错报文或者查询类型的报告报文。常用类型有:类型 0,代码 0:表示回显应答(ping 应答),类型 8,代码 0:表示回显请求(ping 请求)。 类型 11,代码 0:超时;类型 3,代码 0:网络不可达;类型 3,代码 1:主机不可达;类型 5,代码 0:重定向。
         代码 (code) :占用了 8 bit 位,根据 ICMP 差错报文的类型,进一步分析错误的原因,代码值不同对应的错误也不同,例如:类型为 11 且代码为 0 ,表示数据传输过程中超时了,超时的具体原因是 TTL 值为 0 ,数据报被丢弃。
         校验和 (checksum) :占用了 16 bit 位,校验的方法同上述 IP 首部校验和的方法一致。数据发送到目的地后需要对 ICMP 数据报文做一个校验,用于检查数据报文是否有错误。
         标识符 (Identifier) :占用了 16 bit 位,对于每一个发送的数据报进行标识。
         序列号 (Sequence number) :占用了 16 bit 位,对于发送的每一个数据报文进行编号,比如:发送的第一个数据报序列号为 1 ,第二个序列号为 2
         数据 Data ):要发送的 ICMP 数据。

二.实验任务

          本节实验任务是电脑通过命令行窗口发送 ping 命令给 FPGA FPGA 通过以太网接口接收数据并将接收到的数据发送给电脑,完成以电脑 ping 开发板的实验测试。

三.模块设计

3.1总体模块设计

           PLL模块:因为gmii_to_rgmii模块中的输入延时控制IDELAYCTRL中需要用到PLL倍频输出的200MHZ时钟。 

           FIFO模块以太网单次会接收到大量数据,因此本次实验需要一个 FIFO 模块用来缓存数据,由于本次实验所使用的 GMII 接收时钟和 GMII 发送时钟实际上为同一个时钟,因此这里使用的是同步 FIFO

          arp模块:由于上位机应用程序只知道接收端的目的 IP 地址和端口号,却不知道接收端的 MAC 地址,因此这里需要通过 ARP 协议来获取接收端的 MAC 地址。

          icmp模块:发送和解析icmp协议包,和arp模块功能类似,只不过协议时序数据不一样而已。

3.2ICMP模块设计

           ICMP 接收模块按照 ICMP 的数据格式解析和发送数据。 

3.2.1icmp_rx 模块

3.2.1.1整体模块图

         clk:接收的icmp时钟信号

         rst n:复位信号,低电平有效

         gmii_rx_dv:GMII输入数据有效信号

         gmii_rxd:GMII输入数据

         icmp_id:ICMP标识符

         icmp_seq:ICMP序列号

         rec data:以太网接收的数据

         rec en:以太网接收的数据使能信号

         rec_pkt_done:以太网单包数据接收完成信号

         rec_byte_num:以太网接收的有效字数

         reply_checksum:接收数据校验

3.2.1.2波形图

        gmii_rx_dv:gmii_rx_dv GMII 输入数据有效信号,当 gmii_rx_dv 拉高则开始输入数据.

        gmii_rxd[7:0]:为 GMII 输入数据信号,当 gmii_rx_dv 信号拉高,开始 ICMP 接收模块输入 GMII 数据信号。这里中间数据段标gmii_rxd是因为不确定接收来的以太网帧数据里是arp协议还是icmp协议。

        icmp_id:当接收数据到gmii_rxd时,开始按照icmp协议逐步解析数据,icmp_id ICMP 的标识符,共占用了 16bit 位,对于每一个发送的数据报进行标识。上图中的黄色部分。

        icmp_seq:icmp_seq 信号(ICMP 序列号),同样占用了 16 bit 位,对于发送的每一个数据 报文进行编号。上图中的紫色部分

        rec_data:为以太网接收的数据.上图中的肤色部分。

        rec_pkt_done: 为以太网单包数据接收完成信号,当数据接收完成后 rec_pkt_done 信号拉高

        rec_en:为以太网接收的数据使能信号,将GMII接收数据传递到rec_data,当开始接收数据时,GMII 输入数据有效信号为高,rec_en 信号拉高。

       rec_byte_num 为以太网接收的有效字数,主要用于统计以太网接收的有效字数,在当数据接收完成后,将该信号的数据传递到发送模块。

       reply_checksum 为接收数据校验信号,单包数据接收完成后,将该信号的数据通过输出信号进行数据反馈。

3.2.1.3解析以太网数据状态转换图

       这与arp实验中的转换图意思大致一致,不解释。

3.12.1.4代码解析

       状态机空闲时,GMII输入数据有效信号gmii_rx_dv为1时,并且第一个前导码来临。代表以太网帧数据来临,可以解析数据了 ,故skip_en=1,跳转至解析前导码+SFD状态。

       前导码是7个8'h55+1个8'h05.因为空闲状态时已经解析出一个 8'h55,因此这里只用检测6个 8'h55。若两项均正确,则跳转至接收以太网帧头(目的MAC地址+源MAC地址+长度/类型)。只要其中一个接收有误则结束接收。

         因为目的MAC地址6Byte(cnt=0~5),源MAC地址6Byte(cnt=6~11),长度/类型2Byte(cnt=12~13)。这里只用检查目的MAC是开发板MAC还是广播MAC,类型是否为IP协议,是则继续接收,否则立即终止接收。 0x0800 代表 IP 协议(网际协议)、0x0806 代表 ARP 协议(地址解析协议)。

            由上图可以看出IP首部总共20Byte,因此cnt计数范围是(0~19),gmii_data在时序下按照以上表格顺序(首部长度—版本—服务类型—总长度—标识—。。)传递数据,整体的代码就是按照此顺序借助cnt索引依次解析。

        注意,cnt=5时,ip_head_byte_num <= {gmii_rxd[3:0],2'd0}=5x4=20。因为将0101左移两位相当于010100=20,故左移两位相当于x4。

           由上图可以看出ICMP首部总共8Byte,因此cnt计数范围是(0~7),gmii_data在时序下按照以上表格顺序(类型—代码—校验和—标识符—序列号)传递数据,整体的代码就是按照此顺序借助cnt索引依次解析。

            将上图中的ICMP数据(上图肤色部分)进行16位拼接,累加。

             1:当数据段没有接收完时,首先对接收的8位数据gmii_rxd进行打拍得到icmp_rx_data_d0,然后将上一时钟的8位gmii_rxd(icmp_rx_data_d0)与本时钟下的8位gmii_rxd进行拼接,拼接为16位数据,然后进行累加。如下图所示。

         2:当数据接收到最后一个时,首先判断数据长度是不是奇数,如果是奇数,则最后一个8位数据落单,高八位需要拼接8个0.若长度是偶数,则两两8位数据拼接,不需要进行额外操作。

3.2.2icmp_tx模块

3.2.2.1整体模块图 

         clk:rxc时钟信号

         rst n:复位信号,低电平有效

         tx_start_en:以太网开始发送信号

         icmp_id:ICMP标识符

         icmp_seq:ICMP序列号

         reply_checksum:ICMP数据部分校验和

         des mac:发送的目标MAC地址

         des_ip:发送的目标IP地址

         tx data:以太网待发送数据

         tx_byte_num:以太网发送的有效字节数

         crc data:CRC校验数据

         crc next:CRC下次校验完成数据

         tx done:以太网发送完成信号

         tx_req:读数据请求信号

         gmii_tx en:GMII输出数据有效信号

         gmii_txd:GMII输出数据

         crc_en:CRC开始校验使能

         crc_clr:CRC数据复位信号

3.2.2.2波形图

          reply_checksum:由icmp_rx模块传来的ICMP数据部分校验和。

          icmp_id:ICMP标识符

          icmp_seq:ICMP序列号

          tx_start_en:为以太网开始发送信号,当 tx_start_en 信号拉高之后,开始发送以太网数据。

          tx_data:tx_data 为以太网待发送数据.

          tx_byte_num:tx_byte_num为以太网发送的有效字节数.

          crc_en:当发送数据段位于MAC帧头+IP首部+ICMP首部+ICMP数据段(填充数据除外)此时crc_en拉高,对数据进行校验。

          gmii_tx_en:为 GMII 输出数据有效信号,gmii_txd GMII 输出数据,当 gmii_tx_en 信号拉高,GMII 开始发送数据,当 gmii_tx_en 信号拉低表示数据发送完成.

3.2.2.3发送以太网数据状态转换图

3.2.2.4代码解析

 

          tx_start_en为异步信号,捕捉上升沿因此这里打三拍处理。 得到发送使能信号pos_start_en信号,并将该信号暂存起来trig_tx_en。

 

             tx_byte_num是以太网发送的有效字节数 ,相当于上图中的紫色部分。

             由上图可知:total_num=28+8+(18~1472Byte)

           该段代码是将紫色部分长度(以字节为单位)和绿色部分长度暂存起来。

 

              空闲状态:当发送使能来临时, 按照上面表格,依次将每行数据赋值给ip_head。注意,ip_head是二维数据,位宽是32[0:31]因为一个ip_head代表上面表格的一行,数据深度是7[0:6],因为5行ip首部+2行icmp首部=7行数据。

             赋值目的IP时注意,当目的ip更新时,ip_head[4]就赋值为刚更新的值,若没更新,则使用默认值。

            同理,当目的MAC值更新时,则赋值更新值,若没更新则使用默认值。

              该段作用是对IP首部的值进行校验。

             该段作用是对icmp首部+数据段进行校验。

          当前面校验无误时,开始发送以太网数据,同arp实验类似,先发送前导码+SFD,再发送MAC帧首部。

 

              该段作用是发送IP首部还有ICMP首部,一共7行数据,但是一行数据32Bit,一个时钟周期只能发送8bit,因此一行数据要四个时钟周期才能发完。这里7行数据用cnt计数,四个时钟周期用tx_bit_sel计数。

              注意,这里tx_req提前两个周期拉高,因为读FIFO里数据有两个clk延迟,故这里提前拉高。

   

                  data_cnt:发送数据个数计数器,技术范围(0~ 发送的有效数据字节总数-1)。

                  以上代码就是算出以太网数据实际多发的字节数,例如发送的有效数据字节总数是26,而以太网数据中的数据段最小18个字节,26-18=8,8就是以太网数据实际多发的字节数。

四.modelsim仿真

4.1icmp_rx模块仿真

4.1.1接收前导码

 4.1.2接收以太网帧头

      包含目的MAC、源MAC、长度/类型

4.1.3接收 IP首部

4.1.4接收ICMP首部

 

4.1.5接收数据段

 

4.2icmp_tx模块仿真

4.2.1校验IP首部

       因为这里有进位,因此0002+889f=000088a1。后面没有进位,因此不用再累加。直接按位取反即可。

 

4.2.2校验icmp首部+数据

 

4.2.3发送数据段

五.板级验证

     首先设置PC端的IP,如下所示。

      然后以管理员身份打开命令符窗口,以arp-a命令查看MAC与IP映射表。

       使用PING命令,PC端向开发板发送请求包。可以看出开发板很快回复报文。

 

再次使用arp -a命令查看MAC与IP的映射表,可以看出已经建立连接。

 

 

 

 

 

 

 

 

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

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

相关文章

完美平替navicat的数据库软件DBeaver,免费开源,功能强大,使用简单

DBeaver Community 是一个免费的跨平台数据库工具&#xff0c;适用于开发人员、数据库管理员、分析师和所有与数据打交道的人。它支持所有流行的 SQL 数据库&#xff0c;如 MySQL、MariaDB、PostgreSQL、SQLite、Apache Family 等 1.到官网下载win版本直接安装 https://dbeav…

从一到无穷大 #32 TimeCloth,云上的快速 Point-in-Time Recovery

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言解决方案FAST FINE-GRAINED PITRLog FilterInter-Record Dependency ResolutionL…

全球氢燃料电池汽车市场规划预测:未来六年CAGR为44.4%

一、引言 随着全球能源转型和环保意识的提升&#xff0c;氢燃料电池汽车作为清洁能源汽车的重要组成部分&#xff0c;其市场潜力日益凸显。本文旨在探索氢燃料电池汽车行业的发展趋势、潜在商机及其未来展望。 二、市场趋势 全球氢燃料电池汽车市场的增长主要受全球环保政策推…

springboot辽B代驾管理系统论文源码调试讲解

2 相关技术 2.1 MySQL数据库 本研究与开发的应用程序在数据操作中难以预料&#xff0c;有时候甚至产生变化。没有办法直接在Word中写数据信息&#xff0c;这不但不安全&#xff0c;并且难以达到应用程序的功能。想要实现所需要的文档存储功能&#xff0c;务必选择专业数据库存…

奥运会Ⅲ--AI风险矩阵

问满屋子的人工智能专家&#xff1a;“我们如何知道我们的人工智能是否安全可靠&#xff1f;”你可能会得到十几个不同的答案&#xff0c;每个答案都比上一个更复杂。似乎不知何故&#xff0c;在 OpenAI 成为地球上增长最快的公司一年零几个月后&#xff0c;每个人都是 LLM&…

CANOpen EMCY紧急报文介绍

什么是CANOpen紧急报文 CANOpen中的Emcy紧急报文用于当设备出现故障或警告时&#xff0c;向其它节点报告故障或警告使用的。如设备某个设备出现过压或过流时&#xff0c;就可以发送紧急报文。 紧急报文的格式 错误代码&#xff1a;是0x1003索引预定义错误字段的内容&#xff…

修改VSCode插件默认安装路径

文章目录 前言VSCode插件默认安装路径添加环境变量先修改路径注意事项 前言 今天发现C盘快满了&#xff0c;只能清理点东西&#xff0c;给C盘腾出的空间出来&#xff0c;结果一看&#xff0c;VSCode的插件目录就占了不少呢。 VSCode插件默认安装路径 C:\Users\{个人用户名}\.…

比较支持向量机、AdaBoost、逻辑斯谛回归模型的学习策略与算法

(1)支持向量机&#xff1a;SVM 是一种监督学习算法&#xff0c;用于分类和回归任务。 学习策略&#xff1a;间隔最大化 算法&#xff1a;最大间隔法、软间隔算法。 参数学习&#xff1a;参数学习过程是要最小化目标函数&#xff0c;通常通过优化算法&#xff08;如SMO&#x…

为什么选择 Baklib 而不是 Salesforce 进行知识库管理

对于希望管理其产品和服务的在线文档或知识库以支持其客户和员工的组织来说&#xff0c;市场上有太多的平台和工具。知识库通过向客户和员工提供重要信息来帮助组织提高生产力。这大致分为客户关系管理或客户服务。 很少有平台能够为销售、客户服务等提供一套服务。Salesforce…

Adobe ColdFusion反序列化漏洞(cve-2017-3066)

目录 概述复现过程修复建议 概述 Adobe ColdFusion&#xff08;直译&#xff1a;冷聚变&#xff09;&#xff0c;是一个动态Web服务器&#xff0c;其CFML&#xff08;ColdFusion Markup Language&#xff09;是一种程序设计语言&#xff0c;类似JSP里的JSTL&#xff08;JSP St…

High Speed Serdes学习笔记

1 并行数据总线&#xff08;Parallel Data Bus&#xff09; 并行数据总线为传统的数据传输方式&#xff0c;存在两个问题&#xff1b; 1>需要大量的I/O引脚 2>必须满足严格的时序要求以保证数据正确传输。 图&#xff1a;两个设备之间的并行数据 2 数据串行化 减少并行…

【学习笔记】Day 2

一、进度概述 1、inversionnet_train_light 试运行——未成功 2、DL-FWI基础入门培训-1,2&#xff0c;以及作业1的完成 二、详情 1、inversionnet_train_light 试运行 在补充完相关依赖后&#xff0c;运行仍有报错 产生原因&#xff1a;这个代码在当时师兄的库中存在…

架构设计前期应该怎么做?

利益干系人分析 利益干系人分析框架 利益干系人 - 投资者 利益干系人 - 监管者 利益干系人 - 构建者&#xff0c;维护者 利益干系人 - 使用者&#xff0c;评估者 利益干系人 - 钱包案例 评估者&#xff1a;用户可以评估好不好用 利益干系人 - 外包系统案例 诉求优先级排序 …

【LeetCode每日一题】盛最多水的容器

思路 标签:双指针&#xff0c;贪心 分析&#xff1a; 首先选两条线为容器的两端&#xff0c;盛水的高度取决于高度小的那条线&#xff0c;此时在两条线中间选一条线&#xff0c;有两种情况&#xff0c;如果区间内某条线比两端高度小的那条线还要小&#xff0c;此时宽度和高度…

UE4-常用快捷键汇总

一.虚幻引擎编辑器快捷键 二.蓝图编辑器快捷键

JAVA项目

目录 一、前言 二、技术介绍 三、项目实现流程 四、论文流程参考 五、核心代码截图 专注于大学生实战开发、讲解和毕业答疑等辅导&#xff0c;获取源码后台 一、前言 在数字化音乐时代&#xff0c;个性化推荐已成为提升用户体验、促进音乐消费的重要手段。为此&#xff0…

mybatis-plus selectPage获取到数据但是total为0

查数据库返回数据&#xff0c;但是total显示为0 这里需要设置分页拦截器 config目录下新建mybatisConfig.java import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.spri…

Airtest精讲Template配置参数

Airtest精讲Template配置参数 今天我们讲一下airtest图像识别中的一个最基本、最常用的一个类Template 一、环境背景 首先我们先看一个非常简单的脚本示例&#xff0c;在AirtestIDE中&#xff0c;显示如图&#xff1a; 在编辑器中点击鼠标右键菜单的‘图片/代码模式切换’&am…

美股:AMD展现乐观前景,挑战AI加速器市场霸主

在科技行业的激烈竞争中&#xff0c;AMD公司近期发布了对当前季度收入的乐观预测&#xff0c;显示出其新推出 一、AMD第三季度营收预期超越分析师平均预期 AMD在周二的声明中预计&#xff0c;第三季度营收将达到约67亿美元&#xff0c;这一数字超出了分析师此前平均预期的66.…

mybatis-plus雪花算法

苞米豆mybatis-plus已实现雪花算法&#xff0c;若项目中使用雪花算法生成自增主键&#xff0c;可直接引用相关jar实现其工具类&#xff0c;若不想再单独引用jar也可将其Sequence类直接复制到自己项目中定义为工具类使用 官方文档&#xff1a;https://baomidou.com/ Git地址&am…