赞
踩
算算也该准备毕业了,正好毕业设计中需要使用UDP进行PC与FPGA之间的通信,而直接实现UDP硬件协议栈想想也并不复杂,“兵马未动、粮草先行”,等完成UDP之后再开始毕设课题的研究。
目前设想的是:参考软件协议栈的设计,陆续把FPGA上实现的过程更新成一个系列的文章,最终完成的简易版的UDP/IP协议栈再进行开源,也但是顺带学习这几个协议。
当然先声明:只打算设计个“弟弟版”的协议栈(又不是不能用),以后有机会再完善。
该系列的开篇先确定设计目标以及搭建大体框架。
要实现UDP/IP协议栈,首先得了解该协议栈中会有哪些协议,下图即为TCP/IP协议族:
啥?TCP/IP?不是设计UDP吗?
当然不是实现硬件TCP协议栈,只是该图恰好包含本文要实现的UDP/IP中所包含的协议,故借此说明。
作为仅实现个弟弟协议栈来说,主要设想实现UDP的接收和发送,以及可以实现ARP协议使UDP通信双方可获取对端的MAC和IP地址映射关系,以及可以实现ICMP的回显请求(即ping操作),所以本文主要关注链路层的ARP、网络层的ICMP、传输层的UDP,对于协议族中的应用层协议等其他协议,本文暂不做说明。
ARP(Address Resolution Protocol,地址解析协议)。我们知道在以太网通信当中,一台设备与另一台设备之间的通信是通过48bit的MAC地址来确定接口的,但是对于上层协议来说,以IP协议为例,只知道对方主机的IP地址,其所对应的MAC地址并不知晓,那岂不是数据就不能直接发送到对方,这时就需要地址解析协议来获取对方的MAC地址。
也就是说:当我使用IP协议来发送数据时,我封装好了IP首部和IP数据,就告诉链路层“你给我去发送吧!”,链路层获取了目的IP地址后,便使用ARP协议向外广播“这个IP对应的MAC地址是啥?”,一会儿外面传来消息“我就是这个IP对应的MAC地址”,于是链路层将MAC首部和IP部分封装上就进行发送了。
ICMP(Internet Control Message Protocol,Internet控制报文协议)。一般用于传递差错报文和一些需要注意的信息,其报文中的类型字段和代码字段来决定不同类型的报文,当然本文的弟弟协议栈只是用其回显请求和应答来实现PING功能,所以对于该协议的其他类型不予说明。
ICMP中的回显请求和应答简单来说就是为了测试本主机和另台主机之间是否可达,即本主机发送一条ICMP的回显请求“你听得到吗?”,不一会儿,另一台主机进行回显应答“我听得到!”。这样一来可以使用该协议进行网络诊断,而对本文的协议栈来说就可以简单的知道传输是否通畅了(当然不意味着PING通就一定可以传输数据)。
UDP(User Datagram Protocol,用户数据报协议)。顾名思义,该协议就是用户用来传输数据的协议。UDP是基于IP协议的面向数据报的传输协议,由于其传输过程不建立连接所以无法保证数据是否可以传到对方主机,具有不可靠性,此外UDP在其首部中有端口号(port)字段,对于上层的应用层使用来说可以通过不同的端口号来区分不同的应用。
适用于PC与FPGA通信当中,例如可传输控制指令、图像视频数据、硬件加速前后的数据等。对于PC端,使用网络调试助手或直接采用socket,而对于FPGA内的用户侧,直接是四元组加UDP数据的形式,便于区分应用以方便使用。
1000 Mbps
目前设想只支持ipv4(ipv6待定),暂不支持IP分片、option等。
目前设想的是支持UDP、ICMP和ARP三个协议的部分功能。
希望协议栈接收解析后的数据即是{源IP、源端口、目的端口、UDP数据长度、UDP数据},然后通过协议栈发送的数据是{目的IP、目的端口、源端口、UDP数据长度、UDP数据},使用户侧的使用体验与网络调试助手一致。
只响应对本机IP地址和MAC地址映射关系的查询并保存源MAC和源IP的映射,以及上电后主动广播本机的IP地址和MAC地址的映射关系,对于其他不予回应进行舍弃操作。
对本机查询MAC的ARP帧,存下其sender_mac和sender_ip,供ICMP或者UDP传输时,查询MAC&IP映射关系使用。
只响应对本机的ping请求,目前只支持IPv4,对于其他不予回应并进行舍弃操作。
除以上的协议之外,其他所有协议不予支持,采取舍弃操作。
将支持checksum和FCS等校验,其中:对于接收的数据,若IP首部、UDP首部、ICMP首部的checksum以及以太网帧的FCS等校验错误采取舍弃操作;对于发送的数据,需保证以上校验正确。
采用AXI-Stream接口协议,对接收的UDP数据进行一定的缓存,若缓冲区存满丢弃整帧数据而保证不错一帧,UDP的缓冲区大小可参数化配置。
UDP本身作为无连接的传输协议,可靠性不高,可自行设计应用层协议以提高可靠性。
根据以上设计目标,笔者用visio简单画了一个基本框架,如下图所示:
目前设想的大致流程如下:
后续计划就是翻着《TCP/IP详解》撸代码了,大致将分为:协议解析分类、checksum计算、FCS计算、ARP处理、MAC&IP地址映射表、ICMP处理、UDP处理、封包发送处理、仿真测试和上板测试等部分,陆续将设计过程写成系列文章。
当然,以上只是初步计划,之后撸代码过程中再予以更改。
若有不足之处还望请批评指教~
十二点过九分:UDP/IP硬件协议栈设计(一):缘起
十二点过九分:UDP/IP硬件协议栈设计(二):分类
十二点过九分:UDP/IP硬件协议栈设计(三):校验
十二点过九分:UDP/IP硬件协议栈设计(四):ARP
十二点过九分:UDP/IP硬件协议栈设计(五):ARP表
十二点过九分:UDP/IP硬件协议栈设计(六):ICMP
十二点过九分:UDP/IP硬件协议栈设计(七):UDP
十二点过九分:UDP/IP硬件协议栈设计(八):封包
十二点过九分:UDP/IP硬件协议栈设计(九):仿真
十二点过九分:UDP/IP硬件协议栈设计(十):测试
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。