以太网ICMP测试实验

目录

一.概述

1.1IP协议

1.1.1IP协议简介

1.1.2IP协议首部报文格式

1.2ICMP协议

1.2.1ICMP协议简介

1.2.2ICMP报文格式

二.实验任务

三.模块设计

3.1总体模块设计

3.2ICMP模块设计

四.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的映射表,可以看出已经建立连接。

  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以太网的CSMA/CD协议是一种用来解决多个计算机在同一物理链路上竞争传输权利的协议。在这个协议中,每个计算机都可以在链路上传输数据。但是,如果多个计算机同时传输数据,就会造成冲突,导致数据的损坏。为了解决这个问题,以太网采用了CSMA/CD协议。 CSMA/CD协议的基本原理是:当一个计算机要传输数据时,它首先会监听链路,如果链路上没有其他计算机正在传输数据,那么这台计算机就可以开始传输数据。如果链路上有其他计算机正在传输数据,那么这台计算机就会等待一段随机的时间,然后再次监听链路。如果链路上仍然有其他计算机正在传输数据,那么这台计算机就会等待更长的时间,然后再次监听链路。如果链路上没有其他计算机正在传输数据,那么这台计算机就可以开始传输数据。 为了模拟CSMA/CD协议,在实验中我们可以使用两台计算机和一个交换机。首先,我们需要设置两台计算机的IP地址和子网掩码。假设计算机A的IP地址是192.168.1.1,子网掩码是255.255.255.0;计算机B的IP地址是192.168.1.2,子网掩码是255.255.255.0。 接下来,我们需要在交换机上设置VLAN,将两台计算机连接到同一个VLAN上。在交换机上打开命令行界面,输入以下命令: ``` configure terminal vlan 10 name test exit interface fastethernet 0/1 switchport mode access switchport access vlan 10 exit interface fastethernet 0/2 switchport mode access switchport access vlan 10 exit ``` 上述命令将创建一个名为“test”的VLAN,并将交换机的1号口和2号口连接到这个VLAN上。 然后,在计算机A和计算机B上分别打开命令行界面,输入以下命令: ``` ping 192.168.1.2 ``` 上述命令将向另一台计算机发送一个ICMP回应请求,以测试两台计算机之间的网络连接。 现在,我们可以模拟同时传输数据的情况,以测试CSMA/CD协议是否能够正常工作。在计算机A上打开一个命令行窗口,输入以下命令: ``` ping -t 192.168.1.2 ``` 上述命令将持续发送ICMP回应请求,直到手动停止或发生错误。在计算机B上也打开一个命令行窗口,输入以下命令: ``` ping -t 192.168.1.1 ``` 同样地,这个命令也将持续发送ICMP回应请求。现在,两台计算机都在同时传输数据,我们可以观察到CSMA/CD协议是如何工作的。 当两台计算机同时传输数据时,会发生冲突,导致数据的损坏。此时,CSMA/CD协议会让每台计算机停止传输数据,并等待一段随机的时间后再次尝试传输数据。在实验中,我们可以观察到命令行窗口中的响应时间会出现明显的波动,这是由于CSMA/CD协议的等待时间随机化导致的。 通过这个实验,我们可以更好地理解CSMA/CD协议的工作原理,以及如何在以太网中避免数据冲突和损坏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值