当前位置:   article > 正文

kali ip查询_UDP/IP硬件协议栈设计(一):缘起

kali毕设

20fce740d507a161e1127bbbb4cf4ea8.png

算算也该准备毕业了,正好毕业设计中需要使用UDP进行PC与FPGA之间的通信,而直接实现UDP硬件协议栈想想也并不复杂,“兵马未动、粮草先行”,等完成UDP之后再开始毕设课题的研究。

目前设想的是:参考软件协议栈的设计,陆续把FPGA上实现的过程更新成一个系列的文章,最终完成的简易版的UDP/IP协议栈再进行开源,也但是顺带学习这几个协议。

当然先声明:只打算设计个“弟弟版”的协议栈(又不是不能用),以后有机会再完善。

353d759f2896bd1f83fae7896f330210.png
琦玉老师

该系列的开篇先确定设计目标以及搭建大体框架


UDP/IP协议栈

要实现UDP/IP协议栈,首先得了解该协议栈中会有哪些协议,下图即为TCP/IP协议族:

b5616cccf97e3ff190f50551e3225197.png
TCP/IP协议族中不同层次的协议

啥?TCP/IP?不是设计UDP吗?

当然不是实现硬件TCP协议栈,只是该图恰好包含本文要实现的UDP/IP中所包含的协议,故借此说明。

作为仅实现个弟弟协议栈来说,主要设想实现UDP的接收和发送,以及可以实现ARP协议使UDP通信双方可获取对端的MAC和IP地址映射关系,以及可以实现ICMP的回显请求(即ping操作),所以本文主要关注链路层的ARP、网络层的ICMP、传输层的UDP,对于协议族中的应用层协议等其他协议,本文暂不做说明。

  • ARP

ARP(Address Resolution Protocol,地址解析协议)。我们知道在以太网通信当中,一台设备与另一台设备之间的通信是通过48bit的MAC地址来确定接口的,但是对于上层协议来说,以IP协议为例,只知道对方主机的IP地址,其所对应的MAC地址并不知晓,那岂不是数据就不能直接发送到对方,这时就需要地址解析协议来获取对方的MAC地址。

也就是说:当我使用IP协议来发送数据时,我封装好了IP首部和IP数据,就告诉链路层“你给我去发送吧!”,链路层获取了目的IP地址后,便使用ARP协议向外广播“这个IP对应的MAC地址是啥?”,一会儿外面传来消息“我就是这个IP对应的MAC地址”,于是链路层将MAC首部和IP部分封装上就进行发送了。

  • ICMP

ICMP(Internet Control Message Protocol,Internet控制报文协议)。一般用于传递差错报文和一些需要注意的信息,其报文中的类型字段和代码字段来决定不同类型的报文,当然本文的弟弟协议栈只是用其回显请求和应答来实现PING功能,所以对于该协议的其他类型不予说明。

ICMP中的回显请求和应答简单来说就是为了测试本主机和另台主机之间是否可达,即本主机发送一条ICMP的回显请求“你听得到吗?”,不一会儿,另一台主机进行回显应答“我听得到!”。这样一来可以使用该协议进行网络诊断,而对本文的协议栈来说就可以简单的知道传输是否通畅了(当然不意味着PING通就一定可以传输数据)。

  • UDP

UDP(User Datagram Protocol,用户数据报协议)。顾名思义,该协议就是用户用来传输数据的协议。UDP是基于IP协议的面向数据报的传输协议,由于其传输过程不建立连接所以无法保证数据是否可以传到对方主机,具有不可靠性,此外UDP在其首部中有端口号(port)字段,对于上层的应用层使用来说可以通过不同的端口号来区分不同的应用。

设计目标

  • 使用场景

适用于PC与FPGA通信当中,例如可传输控制指令图像视频数据硬件加速前后的数据等。对于PC端,使用网络调试助手或直接采用socket,而对于FPGA内的用户侧,直接是四元组加UDP数据的形式,便于区分应用以方便使用。

  • 支持速率

1000 Mbps

  • IP协议支持

目前设想只支持ipv4(ipv6待定),暂不支持IP分片、option等。

  • 包含UDP/IP部分协议。

目前设想的是支持UDP、ICMP和ARP三个协议的部分功能。

  • 支持UDP的处理。

希望协议栈接收解析后的数据即是{源IP、源端口、目的端口、UDP数据长度、UDP数据},然后通过协议栈发送的数据是{目的IP、目的端口、源端口、UDP数据长度、UDP数据},使用户侧的使用体验与网络调试助手一致。

  • 支持ARP的处理。

只响应对本机IP地址和MAC地址映射关系的查询并保存源MAC和源IP的映射,以及上电后主动广播本机的IP地址和MAC地址的映射关系,对于其他不予回应进行舍弃操作。

  • 支持ARP表查询

对本机查询MAC的ARP帧,存下其sender_mac和sender_ip,供ICMP或者UDP传输时,查询MAC&IP映射关系使用。

  • 支持ICMP的处理。

只响应对本机的ping请求,目前只支持IPv4,对于其他不予回应并进行舍弃操作。

  • 不支持的协议

除以上的协议之外,其他所有协议不予支持,采取舍弃操作。

  • 支持校验

将支持checksum和FCS等校验,其中:对于接收的数据,若IP首部、UDP首部、ICMP首部的checksum以及以太网帧的FCS等校验错误采取舍弃操作;对于发送的数据,需保证以上校验正确。

  • 用户侧接口设计

采用AXI-Stream接口协议,对接收的UDP数据进行一定的缓存,若缓冲区存满丢弃整帧数据而保证不错一帧,UDP的缓冲区大小可参数化配置。

  • 可靠性

UDP本身作为无连接的传输协议,可靠性不高,可自行设计应用层协议以提高可靠性。

基本框架

根据以上设计目标,笔者用visio简单画了一个基本框架,如下图所示:

31b111e5628c8adde4cf7f55cfa6b1b6.png
UDP/IP协议栈基本框架

目前设想的大致流程如下:

  1. 对于分类,接收的帧直接进行协议的分类解析,同时进行相关校验的计算(checksum和FCS等),将ARP/ICMP/UDP协议分类出来,进入各自协议的处理模块,其他协议予以舍弃;
  2. 对于ARP帧,只响应本机IP的MAC地址请求,不回应其他,同时可向外广播请求其他IP地址所对应的MAC地址,此外将收到请求的以及收到回应的MAC&IP地址映射关系写入ARP表中,提供查询接口;
  3. 对于ICMP帧,只响应对本机IP的Echo,并进行回应,其他舍弃;
  4. 对于UDP帧,只响应对本机IP的数据,解析其源IP、源port和UDP纯数据帧长向后级传输;
  5. 对于封装,ICMP封装先从ARP表中获取MAC&IP映射,UDP封装若MAC&IP映射存在则封装发送,若不存在,则先发送ARP请求,得到回应后UDP帧再进行封装发送,若无回应则舍弃该帧;

后续计划

后续计划就是翻着《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硬件协议栈设计(十):测试

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/187156
推荐阅读
相关标签
  

闽ICP备14008679号