张 峰,李海兵,2,罗 骋,2,丁 昊,2,李海虎,刘静晓
(1.青岛海洋科学与技术试点国家实验室,山东青岛 266237;2.北京航天控制仪器研究所,北京 100039)
简单文本传输协议(trivial file transfer protocol,TFTP)是基于用户数据报协议(user datagram protocol,UDP)实现的以太网通信协议,用于客户端与服务器之间的文件传输,常用于传送长度固定且较小的数据文件,是一个非常易用、紧凑的协议,TFTP客户端能从服务器读、写文件或者将文件传送给服务器。传统的TFTP客户端设计常采用“微控制单元(microcontroller unit,MCU)+软件协议栈”设计方案,基于软件协议栈的以太网通信极大提高了软件编码的难度,同时也存在软件开发流程复杂和数据传输不稳定等问题[1]。
以太网芯片W5300集成了传输控制协议/网际协议(transmission control protocol/internet protocol,TCP/IP) 硬件协议栈,通过配置W5300内部寄存器就可以实现以太网数据传输,具有传输稳定、开发周期短等优势[2-3]。针对TFTP客户端文件传输至服务器的过程,本设计采用“FPGA(field programmable gate array)+W5300”模式,既保证了文件传输的稳定可靠,也显著降低了软件开发的周期和难度。
TFTP有3种传输模式:netASCII模式、octet模式和邮件模式。TFTP协议基于UDP协议实现,也继承了IP协议的数据包格式,完整的数据包可以划分为IP首部、UDP首部和TFTP数据报文,其中IP首部和UDP首部的内容遵循标准的TCP/IP协议规范。
TFTP数据报文的前2个字节为操作码,操作码取值范围为0x1~0x5;后面的字节,根据操作码的不同划分为5种类型,包括读请求报文RRQ、写请求报文WRQ、数据报文DATA、应答报文ACK和差错报文ERROR,如图1所示。
图1 TFTP报文
TFTP客户端文件传输至服务器的过程中需要用到以下3种报文[4]。
(1)写请求报文:当有新文件需要传输至服务器时,TFTP客户端需要向服务器的端口号69发送1条写请求报文。写请求报文中的“文件名”和“模式”字段固定设置为“para”和“octet”。服务器在正确接收到写请求报文后,会开启1个空闲端口号(例如55000),向客户端发送1条应答报文,表示连接已建立成功,客户端可以继续传输报文。
(2)数据报文:连接建立成功后,TFTP客户端可以将待发送的文件拆分后若干条数据报文,然后逐条进行传输。在服务器正确接收到1条数据报文后,向客户端发送1条应答报文,表示该条数据报文已接收完成,客户端可以继续传输下1条数据报文。客户端每成功发送1条数据报文,“块编号”值加1。每条数据报文中的“数据”字段最长由512个字节组成。当长度不足512时,表示该条数据报文为文件的最后1条数据报文。如果有新的文件等待传输,客户端需要重新发送一条写请求报文,重新与服务器建立连接。
(3)应答报文:在TFTP客户端传输文件至服务器的过程中,应答报文全部由服务器发送至客户端,表示客户端发送的报文已被服务器成功接收。针对写请求报文,服务器发送的应答报文的“块编号”固定为0;针对数据报文,服务器发送的应答报文的“块编号”与接收到的最新一条数据报文的“块编号”相同。
结合TFTP的报文类型,TFTP客户端文件发送至服务器的传输流程设计如图2所示。
图2 文件传输流程
传输流程的主要步骤如下:
(1)发送写请求报文至服务器,目标端口号69。
(2)等待服务器返回应答报文,如果超时未接收到正确的应答报文,延迟一段时间(例如2 s),跳转步骤(1);如果接收到正确的应答报文,记录服务器的发送端口号,跳转步骤(3)。
(3)从当前待传输的文件中,选取最新一组待传输的数据(不超过512字节),组成一条数据报文发送至服务器,目标端口号即为步骤(2)中记录的端口号。
(4)等待服务器返回应答报文,如果超时未接收到正确的应答报文,跳转步骤(5);如果接收到正确的应答报文,跳转步骤(6)。
(5)统计当前数据报文的累计重复发送次数,若未超过10次,重新发送当前数据报文至服务器,然后跳转步骤(4);若超过10次,延迟一段时间(例如2 s),跳转步骤(1)。
(6)判断当前待传输的文件是否已传输完成,若未完成,跳转步骤(3),继续传输文件的剩余数据。若已完成,查看是否存在新的文件需要传输,若存在,跳转步骤(1);若不存在,结束整个文件传输工作。
在TFTP客户端等待服务器返回应答报文的处理中,FPGA编码中引入了超时重传的处理机制,进一步提高了流程运行的稳定性。
W5300是一款集成了硬件TCP/IP协议的CMOS技术的单芯片[5],专用于互联网嵌入式应用,具有稳定、高性能等优势。同时支持8个独立的硬件SOCKET,每一个SOCKET有独立的接收/发送FIFO,用户通过端口控制和寄存器读写就可以实现以太网通信[6-7]。系统硬件组成如图3所示。
图3 系统硬件组成框图
系统采用外部PHY(physical,端口物理层)芯片替代W5300内置PHY,便于后期的网络接口扩展。W5300受控管脚及其对应的功能如表1所示。
表1 W5300受控管脚及功能说明
系统硬件组成的关键部分为FPGA和W5300,FPGA通过控制W5300管脚,实现对W5300的硬件复位、寄存器读写等操作,实现网络数据的收发通信[8-9]。
FPGA软件架构采用模块化的编码设计方法,如图4所示。首先,硬件复位模块完成对W5300的硬复位和端口配置;然后,通用寄存器配置模块和套接口寄存器配置模块分别完成对通用寄存器和套接口寄存器的初始化配置;最后,TFTP通信处理模块、TFTP数据发送模块和TFTP数据接收模块之间相互配合,实现文件传输至服务器的过程。
图4 FPGA软件编码架构
TFTP通信处理模块将待发送的文件拆分成数据报文,利用TFTP报文发送模块实现报文的依次发送。TFTP通信处理模块根据TFTP报文发送模块反馈的发送完成标识,判断报文是否发送成功;同时通过监测TFTP报文接收模块反馈的接收完成标识,判断是否接收到正确的应答报文。
基于层次化、模块化的编码设计理念,模块之间通过各自的输入输出信号进行信息传递,降低了编码的耦合度,提高了代码的可维护性。
首先,FPGA需要对中断寄存器IR、中断屏蔽寄存器IMR、本机硬件地址寄存器SHAR、网关IP地址寄存器GAR、子网掩码寄存器SUBR、本机IP地址寄存器SIPR、重传超时寄存器RTR和重传重新计数寄存器RCR依次进行初始化配置[10]。
然后,FPGA需要对SOCKET0套接口寄存器进行初始化配置,包括源端口寄存器S0_PORTR、模式寄存器S0_MR和通用寄存器S0_CR,使SOCKET0进入UDP模式。通过查询状态寄存器S0_SSR,可以判断UDP模式是否已配置成功。
当UDP模式配置成功后,就可以进行报文收发操作。报文发送过程中需要使用TX剩余空间寄存器S0_TX_FSR、目标IP地址寄存器S0_DIPR、目标端口寄存器S0_DPORTR、TX FIFO寄存器S0_TX_FIFOR、SOCKET通用寄存器S0_CR、TX写入大小寄存器S0_TX_WRSR和SOCKET中断寄存器S0_IR;报文接收过程中需要使用SOCKET通用寄存器S0_CR、RX FIFO寄存器S0_RX_FIFOR和RX接收大小寄存器S0_RX_RSR。
TFTP客户端发送写请求报文和数据报文的流程如图5所示。
图5 TFTP客户端报文发送流程
当有报文需要发送时,TFTP报文发送模块读取S0_TX_FSR寄存器获取发送缓冲区的剩余空间。当发送缓冲区剩余空间大于待发送的报文长度时,说明可以执行发送操作;否则TFTP报文发送模块需要重复读取S0_TX_FSR寄存器,直至剩余空间满足要求或者超时退出。
在执行发送操作时,TFTP报文发送模块需要先向S0_DIPR寄存器和S0_DPORTR寄存器写入目标服务器的IP地址和端口号;然后向S0_TX_FIFOR寄存器和S0_TX_WRSR寄存器写入待发送报文内容和字节数;最后向S0_CR寄存器写入SEND命令,启动报文发送。
TFTP报文发送模块查询S0_IR寄存器中的SENDOK标志位,当SENDOK标志位为1,表示发送已完成,TFTP报文发送模块生成报文发送完成标识;当SENDOK保持为0或者查询超时,表示发送未完成,TFTP报文发送模块生成数报文发送失败标识。TFTP通信处理模块通过报文发送标识的状态,判读报文是否发送成功。
在查询S0_TX_FSR和S0_IR寄存器时,TFTP报文发送模块引入查询超时处理机制,进一步提升了流程运行的稳定性和可靠性。
TFTP客户端接收应答报文的流程如图6所示。
图6 TFTP客户端应答报文接收流程
TFTP报文接收模块查询S0_RX_RSR寄存器获取接收缓冲区的字节数。当字节数大于0时,TFTP报文接收模块查询S0_RX_FIFIOR寄存器获取接收数据的长度和内容,并将数据内容存入FPGA的内部FIFO中。通过检索FIFO存放的数据,TFTP报文接收模块判断接收到的应答报文是否正确,判断依据是应答报文的“块编号”与最近一次发送的数据报文的“块编号”是否相同。若相同,则生成接收有效脉冲,若不相同,则不生成接收有效脉冲。
TFTP通信处理模块通过监测接收有效脉冲是否存在判断服务器返回的应答报文是否正确。最后,TFTP报文接收模块向S0_CR寄存器写入RECV命令,完成本次数据接收。
系统关键模块通过完成对W5300的寄存器配置,将以太网控制策略简化为报文接收与发送的寄存器读写操作,降低了软件设计的难度。
为测试本系统的实际工况,在计算机端搭建TFTP服务器模拟上位机软件。利用本系统将文件通过TFTP协议上传至传输至服务器。计算机通过上位机软件统计分析接收到的文件,如图7所示。同时使用Wireshark软件抓取分析网口的实时数据包,如图8所示。
图7 上位机软件
图8 Wireshark网络数据包
文件传输过程累计运行超过24 h,传输过程稳定,计算机端收到的文件大小和格式与实际相符,未出现数据丢失或乱码的现象。Wireshark软件抓取的网口实时数据包也显示TFTP通信过程持续稳定正常。
基于W5300的TFTP客户端文件传输系统,在硬件设计上加入外部PHY,增强了系统的扩展性。软件设计采用模块化方式,实现了“高内聚、低耦合”的FPGA编码。简化后的寄存器控制操作极大降低了以太网通信编码设计的难度。同时,通过引入多维的超时重传和超时处理等工作机制进一步优化了系统流程,实现了稳定性好、可靠性高的文件传输。目前,本文设计的TFTP客户端文件传输系统已在空间站的某型号航天技术试验项目中得到了实际应用,实现了持续稳定的文件传输。