商艳娟, 徐卓汀, 王成群
(浙江理工大学信息学院, 杭州 310018)
网络通信技术的快速发展,为大量数据的传输提供了可能[1]。 总线按照传输数据的方式可以分为串行总线和并行总线。 并行总线控制复杂,传输距离有限,串行总线设计简单,但是传输速率低[2]。以太网技术的发展克服了总线传输的缺点,接口速度快,传输的距离远,在复杂的工业控制系统中受到广泛应用[3]。 传统的以太网在主控芯片内部编写以太网协议或者使用嵌入式处理器运行操作系统,在操作系统下完成协议的通信[4]。 使用主控芯片和嵌入式处理器来实现以太网通信协议无法保证较高的数据传输实时性和确定性。 使用现场可编程门阵列(FPGA,Field Programmable Gate Array)实现数据的通信,因为通过硬件固化协议的处理逻辑,可以有效地提高数据传输系统的性能,FPGA 芯片与物理层(PHY,Physical)芯片相连,连接结构简单,不需要外部设备驱动与大量的外围控制电路,可移植性强,系统集成度高[5]。 基于综上的一些研究,本文设计了一款UDP_IP 协议栈,将其移植到FPGA 芯片中,使用以太网线将包含FPGA 芯片和PHY 芯片的电路板与电脑相连,完成数据的传输。 本设计具有以下功能:
(1)实现ARP 请求和应答报文的发送,完成IP地址和MAC 地址的映射;
(2)支持ICMP 报文的ping 操作;
(3)实现UDP 回环通信。
UDP_IP 协议栈模型是将开放式系统互联通信参考模型(Open System Interconnection Reference Model, OSI)7 层结构简化成4 层,从上往下分别是应用层、传输层、网络层、网络接口层,如图1 所示。应用层支持SMTP、HTTP、TFTP 等协议传输[6];传输层包含TCP 协议和UDP 协议,TCP 协议是一种基于3 次握手机制的可靠传输协议,UDP 是一种不可靠的传输协议,该协议实现简单,适用于低时延、数据量大的快速传输场景;网络层可以实现IP 协议、ICMP 协议通信,IP 协议负责将数据报通过互联网发送出去,ICMP 协议主要是采用错误侦测和回馈机制,为通信环境提供可能发生的问题反馈信息;网络接口层支持ARP 协议传输,将已知的IP 地址解析成MAC 地址,使得交换机可以通过MAC 地址进行相应的通信。 本文设计的UDP_IP 协议栈可以实现ARP 请求、ARP 响应、ICMP 响应、UDP 回环多种协议传输。
图1 UDP_IP 协议栈参考模型Fig. 1 UDP_IP protocol stack model
本文采用模块化的思想设计UDP_IP 协议栈,整个UDP_IP 协议栈由6 个模块组成,分别是MAC数据解析模块、IP 数据解析模块、ARP 处理模块、ICMP 处理模块、UDP 处理模块、MAC 数据封装模块,UDP_IP 协议栈总体架构如图2 所示。
图2 UDP_IP 协议栈总体架构Fig. 2 Overall architecture of the UDP_IP protocol stack
MAC 数据解析模块的作用是分离出ARP 报文和IP 报文,在这个模块中使用异步先入先出队列(First Input First Output, FIFO)进行数据的跨时钟域处理,MAC 数据解析模块处理报文的流程图如图3 所示。 首先,调用异步FIFO 的IP 核,将接收的数据以及接收使能信号全部缓存进FIFO 中;根据FIFO 中存储数据的个数产生FIFO 读使能信号,将数据和接收使能信号读出;根据读出的使能信号驱动计数器计数,当计数到相应的值时,解析在该值处接收的数据,该数据即是以太网协议类型;判断协议的类型是否为IP 或ARP 协议类型,如果不是,直接丢弃该数据帧,如果类型值为0x0800,则判断该报文属于IP 报文,如果类型值为0x0806,则该报文属于ARP 报文,根据不同类型报文的判断结果,将数据送入不同的后级模块。
图3 MAC 数据解析模块流程图Fig. 3 Flow chart of the MAC data parsing module
ARP 处理模块的主要功能是对接收的ARP 报文进行分析,更新ARP 缓存表,具体实现过程如图4 所示。 当上级MAC 数据解析模块将ARP 报文发送到ARP 处理模块后,对ARP 接收报文进行解析,得到ARP 报文中的操作码、发送方IP 地址、发送方MAC 地址、接收方IP 地址。 当接收的操作码为1,同时报文中的目的IP 等于本地设置的IP,说明接收的是ARP 请求报文,将该报文中的发送方IP 地址和MAC 地址寄存,用作ARP 缓存列表的更新值,同时还用于发送ARP 应答报文中目的IP 地址和目的MAC 地址。 当接收的操作码为2,同时报文中的目的IP 等于本地设置的IP,判断接收的是ARP 应答报文,应答报文只需将报文中发送方IP 地址和MAC 地址寄存,用来ARP 缓存列表信息的更新。图4 虚线部分实现了ARP 列表的更新,本设计定义了一个数组存储ARP 信息,每当接收一个ARP 请求或者是ARP 应答报文时,定义的数组单元会更新IP 地址和MAC 地址,每8 条ARP 缓存满时,会自动覆盖之前的信息,进行下一轮的更新。 另外,本设计还自定义了一个固定的目的IP 地址,协议栈会自动地向这个自定义的目的IP 地址主机定时发送ARP请求报文。
图4 ARP 处理模块流程图Fig. 4 Flow chart of ARP processing module
IP 数据解析模块有两个作用:将UDP 报文和ICMP 报文分离;进行IP 层校验和计算,检测接收报文的IP 层是否正确,IP 数据解析模块流程图如图5所示。 由MAC 分离出的IP 报文被送入IP 数据解析模块,对IP 报文的头部进行解析,得到上层协议类型,目的IP 地址。 在报文解析的同时,对IP 的报头信息进行校验和计算,得到的正确值为16’hffff,如果校验和的计算不是该值,说明接收到的IP 报文是错误的,丢弃该报文。 根据报文解析的上层协议类型、目的IP 地址、IP 校验和来判断该报文是UDP报文还是ICMP 报文,将不同类型的报文数据使用存储器寄存,传输到接下来的ICMP 处理模块或者是UDP 处理模块。
图5 IP 数据解析模块流程图Fig. 5 Flow chart of IP data analysis module
ICMP 处理模块能够对ICMP 请求报文作出响应,同时将接收的ICMP 报文数据部分缓存,然后转发。 在该模块中整个报文的处理过程经历3 个不同的状态,如图6 所示。 当IP 数据解析模块没有发送任何数据给ICMP 处理模块时,该模块一直处于空闲状态,一旦接收到上级模块发送ICMP 报文,ICMP 报文接收开始使能信号跳变为高电平,状态跳转到接收状态;接收状态下,对接收的ICMP 报文进行解析,得到ICMP 报文的类型和代码值分别为0x08 和0x00,则接收的是ICMP 请求报文,直到ICMP 报文接收结束使能信号变为高电平时,状态跳转到发送状态,如果接收的是ICMP 应答报文时,状态一直保持接收状态;接收状态下,另一个操作是使用同步随机存取存储器(Random Access Memory,RAM)存储报文,等到发送状态下取出报文数据部分内容,发送回电脑。 等到发送的数据正好等于接收的数据长度时,ICMP 报文发送结束信号跳变为高电平,由发送状态跳转到空闲状态,等待IP 数据解析模块发送下一个ICMP 报文。
图6 ICMP 处理模块状态机图Fig. 6 State of ICMP processing module
UDP 处理模块完成UDP 报文的解析并且为发送UDP 回包封装UDP 首部信息,整个UDP 处理模块状态跳转如图7 所示。 首先,如果IP 数据解析模块没有发送任何UDP 报文,状态机一直会处于空闲状态,直到接收到有效的UDP 报文,UDP 报文接收开始使能信号跳为高电平,状态机随后跳转到接收状态;等到所有数据报文接收完成后,UDP 报文接收结束使能信号变为高电平,状态机跳转到计算UDP 校验和状态,等到校验和的计数器计数到9时,状态会跳转到发送状态;当发送的数据长度正好等于接收的数据长度时,UDP 报文发送结束使能信号变为高电平,表示发送完成,状态机跳转到空闲状态,等待IP 数据解析模块传输下一个UDP 报文数据。 在整个状态机跳转过程中,数据处于接收状态时,解析UDP 报文,得到目的端口号、源端口号、UDP 数据长度、发送方IP 地址,为UDP 回环的实现提供目的端口号和源端口号。 数据需要返回给发送端,必须将接收的UDP 数据缓存下来,调用一个同步RAM 的IP 核进行数据的缓存。 在UDP 报头校验和计算状态下,计算校验和为发送UDP 回包提供正确的UDP 校验和。
图7 UDP 处理模块状态机Fig. 7 State of UDP processing module
ARP 处理模块提取的目的IP 和目的MAC 地址,ICMP 处理模块重新打包的ICMP 应答报文以及UDP 处理模块重新封装的UDP 报文都传入MAC数据封装模块合流。 具体选择返回哪一种协议报文在MAC 数据封装模块需要进行仲裁,具体的MAC数据封装模块流程图如图8 所示。 首先,判断发送使能信号,如果是ARP 报文发送使能信号,还需要判断发送的是ARP 应答报文还是ARP 请求报文。如果ARP 应答报文发送使能信号为高电平,按照ARP 数据格式组帧整个ARP 报文内容;如果是ARP 请求发送使能信号为高电平,依照同样的组帧方式设置ARP 请求报文内容,传输到MAC 数据封装模块。 ARP 报文前面再封装以太网首部信息,最终发送给目标主机。 如果判断是IP 报文发送使能信号为高电平,根据发送的上层协议类型,得到发送的报文是ICMP 报文还是UDP 报文,如果协议类型是0x11,则表示发送UDP 报文,将UDP 处理模块传输过来的内容作为整个以太网帧的数据部分,如果协议类型是0x01,则表示发送ICMP 报文,将ICMP处理模块传输过来的内容作为整个以太网帧的数据部分。 以太网帧其他部分使用以太网首部以及IP首部信息填充。 数据按照标准以太网协议帧封装完成后,可以将这些数据直接传输给MAC 接口,MAC将这些数据传回给发送端。
图8 MAC 数据封装模块流程图Fig. 8 Flow chart of MAC data encapsulation module
本设计在Quartus II 13.0 软件中使用Verilog 语言编写整个UDP 协议栈代码,设计完成后使用modelsim 仿真软件对整个UDP_IP 协议栈进行功能验证。 ICMP 请求报文和应答报文的仿真时序图如图9 和图10 所示。 从图9 可以看到两个报文发送的以太网协议类型都是0x0800, ICMP 报文的首部符合协议数据的设定值,接收数据与发送数据是相同的,报文的结尾都是使用FCS 校验码封装,验证了本协议栈可以正确接收ICMP 请求报文和发送ICMP 应答报文;此外,关于ARP 协议和UDP 协议的接收和发送功能仿真验证也是正确的。
图9 ICMP 请求报文接收图Fig. 9 ICMP reception diagram
图10 ICMP 应答报文发送图Fig. 10 ICMP message sending diagram
仿真验证后进行板级验证,使用Cyclone IV 系列FPGA 芯片电路板。 通过电脑发送不同的协议报文,然后使用wireshark 软件抓取电脑发送的报文以及接收的报文,验证UDP_IP 协议栈设计的功能。当使用小兵以太网发送ARP 请求报文和ARP 应答报文时,ARP 报文测试结果如图11 所示。 电脑每发送一个ARP 广播报文,板子会返回一个ARP 应答报文给电脑。 当电脑发送ARP 应答报文给板子时,板子不会立即返回请求报文,但是本设计设置了一个电脑IP 地址存储在ARP 处理模块,会定时发送ARP 请求报文给电脑。 使用ping 命令后,ICMP报文测试结果图如图12 所示,可以看到当发送一个ICMP 请求报文,会传回一个ICMP 应答报文。 接收报文数据和发送报文数据内容完全相同,证明了接收的数据在协议栈中能够正确缓存并转发。
图11 ARP 报文测试结果图Fig. 11 ARP packet test result
图12 ICMP 报文测试结果图Fig. 12 ICMP packet test result diagram
为了评估本设计UDP_IP 协议栈发送UDP 回环报文的性能,使用网络调试助手每1 ms 发送一次UDP 报文,测试的结果如图13 所示。 发送UDP 报文次数达到10 万次,每一次的发送都能正确接收,说明本文设计的UDP_IP 协议栈具有可靠稳定的传输性能,传回电脑的数据与电脑发送出去的数据是完全一致的,验证了数据能够在该协议栈内完成正确的数据接收和发送。
图13 UDP 报文测试结果图Fig. 13 UDP packet test result diagram
本文设计了一种基于FPGA 的UDP_IP 协议栈,ICMP 报文和UDP 报文数据部分在该协议栈内完成了正确的缓存和转发,当发送ARP 报文时,在该协议栈内能够及时进行ARP 列表的更新。 本设计具有良好的稳定性和可靠性,为高速以太网通信提供了一个很好的解决方案,有着广泛的应用前景。