智能网络磁盘通信协议研究与设
目前SCSI技术、光纤通道技术的引入为网络存储领域提供了更快的磁盘存取速度和更高效的传输速度,但其高昂的成本是中小企业所不能承担的;并且目前存储系统仍然作为服务器的附属设备,没有摆脱服务器/存储系统的模式,服务器单点失效及数据传输的瓶颈问题依然存在。智能网络磁盘不再依赖于计算机,而是通过网络接口直接连接在局域网上,用户可能通过文件属性来访问挂接在IND上的数据。IND的内核进行过特别的优化,非常适合于处理来自网络的I/O请求,不仅响应快,而且数据传输率高。其成本低、易于安装、易于管理和使用、可靠性高、具有良好的扩展性,为中小企业网络存储提供了一个新的解决方案。
1IND存储系统概述
IND以ARM S3C44B0X微处理器为核心,以RTL8019AS为以太网控制芯片,通过IDE接口直接连接40 pin硬盘。运行经过精简只保留网络功能和文件系统的uClinux,以尽可能地减轻操作系统的负担,使系统中的CPU、内存和I/O总线等系统资源能充分用于数据处理。除S3C44B0X本身具有的片上设备外,本文在片外增加了2 MB flash、8 MB SDRAM、一个IDE接口和一个RTL8019AS以太网控制芯片。其中,SDRAM安排于第六个或第七个bank,地址分别从0x0c000000或0x0c800000开始;ATA接口位于第二个bank内;以太网接口位于第一个bank内。S3C44B0X微处理器提供了26 bit的地址总线Addr0~Addr25, 16 bit的数据总路线data0~data15,因此其支持的最大存储体空间为32 MB。IND系统采用的是数据传输速率为133 Mbps的普通IDE硬盘作为终端存储设备,数据传输量大。IDE硬盘与内存之间采用DMA方式通过嵌入式系统完成数据的数据传送,而以太网卡与内存之间采用中断方式完成数据的接收与发送。单个IND功能原理如图1 所示。
IND存储器由多个IND组成,一个或多个IND可以同时连接在同一个局域网上供不同用户同时访问。其硬件连接如图2所示。
IND软件系统主要分为以下几个部分:ARM底层驱动、IDE接口驱动、RTL8019AS初始化、嵌入式uClinux操作系统优化、TCP/IP协议栈设计和上层应用程序等,以实现客户请求、任务调度、数据分布、数据定位和数据存储等功能。软件接口结构如图3所示。其中:IND文件系统包括逻辑文件系统ROMFS和Ext2、虚拟文件系统VFS;VFS为不同的逻辑文件系统提供统一的接口;块设备驱动程序为不同的块设备提供一个统一的接口,并负责块设备数据缓存功能;IDE接口驱动程序提供标准的ATA总线接口驱动程序;TCP/IP协议和802.3协议组成一个协议栈,将IND智能存储设备经过8019AS接入以太网,数据传输遵循TCP/IP协议。本文详细讨论了IND系统的网络接入模块设计与实现。
2IND网络通信协议设计
合适的网络通信协议是保证IND存储系统稳定运行与快速安全传输的前提,而精简与优化后的嵌入式TCP/IP协议才能在资源非常有限的存储平台上正常运行。IND是一个实时存储系统,提高系统的实时性以提高整个存储系统的存储效率。IND的通信系统大致分为系统软件构件和协议软件构件两类。其中系统软件主要包括一个精简的操作系统和硬件管理软件,而协议软件则主要实现协议规范。网络协议通常分不同层次进行开发,每一层负责不同的通信功能。TCP/IP协议通常被认为是一个四层协议系统,包括数据链路层、网络层、传输层和应用层。按照协议分层的设计思想,采用模块化设计的方法形成了一组从上到下单向依赖的一个协议栈,也称之为协议族。在IND中要实现运行在以太网上的TCP/IP协议栈,TCP栈在IP栈之上,而IP栈又在以太网驱动器之上。IND的TCP/IP协议栈总体设计如图4所示。
2.1数据链路层
数据链路层也就是网络接口层,通常包括操作系统中的设备驱动程序和网络接口卡。
以太网控制芯片RTL8019AS是性价比高且带即插即用功能的全双工以太网控制器,符合Ethernet II和ieEE 802.3标准。内置16 KB的SRAM,收发速度可同时达到10 Mbps。内部有两块RAM区。其中一块16 KB,地址为0x40000~0x7fff; 另一块为32 Byte,地址为0x0000~0x001f。RAM按页存储,每256 Byte为一页,共占用64页。在IND中发送缓冲区不要求太大,只要能存储一个最大的以太网包就够了;而接收缓冲区则要大些,以缓存随时接收到的数据包。将RTL8019AS的前6页(0x40000~0x45ff)作为发送缓冲区,后58页(0x4600~0x7ffff)作为接收缓冲区,而第0页的32 Byte用于存储以太网的物理地址。
RTL8019AS的初始化是指设置相关寄存器的工作模式、分配且初始化接收和发送缓冲区以及初始化网卡的接收地址等。它可以采用轮询的方式从硬件控制器接收帧数据,也可以根据硬件控制器在收到帧时所产生的中断来接收数据帧。在IND中能采用更为有效的中断方式。数据包发送是指在RAM内开辟两个以太网数据包的发送缓冲区,然后把数据写入该缓冲区,启动执行命令后由网络控制芯片RTL8019AS自行发送。数据包的发送校验、总线的碰撞检测与避免也由网控芯片自动完成。在这部分只需配置发送数据的物理层地址、源地址、目的地址、数据包类型及所发送的数据就可以了。数据包的接收是指RTL8019AS接收到来自以太网的数据包存入接收缓冲区并向S3C44B0X发出中断信号。S3C44B0X在中断程序中通过远程DMA方式把数据从RTL8019AS的RAM中取回,并重新设置相关寄存器。IND数据帧的发送/接收过程如图5所示。
2.2网络层
网络层主要处理分组在网络中的活动。在TCP/IP协议族中,网络层协议包括IP协议、ICMP以及IGMP;在IND中,网络层只实现优化的ARP、ICMP和IP协议,不处理除这三个协议外的任何协议。
1)ARP模块地址解析协议(ARP)完成用户IP地址到IND网络控制器MAC地址的映射。当IP数据包发往以太网时,首先在ARP的高速地址缓冲区中查询目的MAC地址。如果没有,再从类ARP表中查询该IP包的目的IP地址所对应的目的MAC地址。ARP缓存是IND系统维护的一个IP地址到相应以太网地址的映射表,将该路由表与文件分配表共同组成一张表,称之为IND类ARP表。当表中没有给定的IP地址,就发送一个ARP广播请求包,含有包中给定IP地址的主机会发送一个ARP应答;ARP接收到这个应答包后将IP数据包发送出去并立即更新这张表。 在实时性要求较高的IND系统中,在设计ARP高速缓存表时采用了线性数组的缓存结构,摈弃了传统计算机系统的双向数据链形式,极大地减轻了系统负担、缩短了查找时间,且把动态的缓冲设计成固定大小。ARP缓存表由生存状态、生存时间、IP地址和MAC地址四个字段组成。由于用于缓存的存储空间非常有限,缓存表的替换策略也是很重要的。首先查找生存状态字段,如果存在失效字段则将新的表项替换当前失效表项;如果表中存在有相同表项,则将其生存时间修改成最大;如果找不到失效的表项则将表中生存时间最小的表项供新表项替换。
2)ICMP模块主要用来实现IND的网络诊断功能。在这里只实现一种类型的ICMP消息,即ICMP回应消息。当收到一个ICMP消息后,ICMP协议立即调整ICMP校验和,把回应消息改为应答消息,并交换IP包的源、目的地址,再发送回源地址。
3)IP模块IP是TCP/IP协议族中最核心的协议。它提供的是不可靠的和无连接的数据包传送服务。在IND系统中不仅有多个客户端而且同时有多个IND设备连入。因此,IND系统必须具有路由功能,也必须缓存那些等待对目标地址解析的数据包,但同时也增加了系统的负担。IND系统主要针对的是企业用户,所传输数据的大小必然存在不确定性。链路层允许最大传输单元MTU是1500,它限制了数据帧的最大长度,因此对超过IND硬件系统所允许的最大值的数据包在传输时必须分段,在接收方再进行重组。这个分段再重组的过程不但消耗系统时间也需要大量的存储空间,因此是以牺牲系统性能为代价的。目前,很多嵌入式系统是不支持数据包的分段和重组的,考虑到系统的性能,将系统的发送缓冲区设计成最多支持两个分段,将任务封装在帧1和帧2中,并填写每个分段的以太网头和IP头,设置相应的标志字段。至于IP报文的重组必须有一个合理的算法,通过创建一个分段缓冲区来缓存等待重新组装的分片。分段重组函数检测缓冲区中匹配的项。如果有匹配则返回完整的数据包,根据包头中的protocol字段将完整的IP包传递到相应的ICMP或上层的UDP、TCP进行处理;否则把进入的IP分段加入分段缓冲区中等待匹配。本文暂时设置其不支持多IP地址,只支持32 bit地址的IPv4版本的IP数据包。
2.3传输层
传输层主要为客户机和IND 系统提供端到端的通信,为整个网络存储系统提供高可靠性的数据通信。其主要工作包括把客户端需要存储的数据交给网络层处理,确认接收到的分组与超时设置等。传输层包括TCP和UDP,用TCP传输数据流中的段,而用UDP传输数据包。
1)UDP模块UDP被认为是上层应用程序和IP间的接口,但它在传输过程中没有提供确认消息,也存在数据包顺序混乱或丢失的现象,因此它不提供可靠性保证,需要应用层来实现错误恢复和重传等。TCP传输的可靠性以其自身的复杂性为代价,笔者在设计IND的UDP时增加了简单的重试机制,以比TCP占用更少的系统资源增强UDP的可靠性,提高系统数据传输速率。
UDP数据包的发送是UDP模块把上层应用程序传来的数据包加上源端口和目的端口后计算校验和并填充字段,然后发给IP模块,通过IP模块发送出去;当UDP接收到IP模块送来的数据包进行检验无误后,根据接收到UDP数据包的目的端口号向上层传输即可。
2)TCP模块在IND系统中,TCP的实现是最复杂的。它提供了一种基于连接的、带确认的、可靠的数据流传输方式,增强了网络的服务质量,但对处理器的存储能力和运算能力要求较高。因此在IND中,笔者对TCP进行了全面优化和重设计:
a)建立连接机制。本系统是面向客户端数据存取的,因此将其主动连接部分裁掉,只保留被动连接部分。
b)断开连接机制。转换TCP/IP状态机的被动连接断开为主动断开,当IND系统向用户传送完所需数据后直接调用close_tcp()函数主动断开连接。这样大大节省了系统时钟,及时释放套接字,节约系统资源。
c)流量控制与拥塞控制机制。待发送TCP数据长度取决于发送方要发送数据的大小、发送窗口的大小和所允许发送数据的大小。在本系统中简化了拥塞窗口的计算