基于SF0020芯片的嵌入式TCP/IP协议族设计与实现
扫描二维码
随时随地手机看文章
1、 引言
TCP/IP起源于60年代末美国政府资助的一个分组交换网络研究项目,到现今已发展成为计算机之间最常应用的组网形式。尽管标准的TCP/IP协议族在数据传输的可靠性与数据流量的控制上作的很好,但是8位微控制器性能的限制下,标准的TCP/IP协议族的实现占用大量系统资源是实际应用所不允许的。因此要在不改变TCP/IP协议族标准的前提下对其进行裁剪,使其实时性提高同时保证可靠性以满足嵌入式系统的要求。
SF0020是NEC公司推出的兼容80C51的8位微控制器芯片。根据系统在网络监控系统控制终端应用的需要,外部接25MHz晶体,内部倍频至50MHz。该芯片内嵌有10M/100Mbps的MAC模块并提供MII界面,可与外部的Ethernet PHY芯片方便连接。芯片有256字节内部数据存储器,外部可扩充至512K字节。具备的DMA通道实现了在RAM中和在MAC与RAM之间进行快速数据传输的功能;支持校验和模块,在实现TCP/IP时可以节省控制器运算开销。指令周期为4个时钟周期(标准80C51为12时钟周期/指令周期)。其性能满足实现嵌入式TCP/IP协议族的基本要求。
2、 协议族总体框架设计与裁剪策略
为了实现在局域网环境中作为客户端控制前端监控设备(硬盘录像机、编码器、解码、视频服务器等)的应用要求,必须在有限的硬件资源的条件下保证数据传输的可靠性和实时性。因此数据链路层采用目前应用最为广泛的以太网协议;上层利用TCP/IP的实现采用在运输层直接采用可靠的TCP协议,然后对其进行适当裁剪的方法。这是因为考虑到通用性、兼容性和通信的可靠程度,而没有使用在应用层加入控制策略运输层使用简单UDP协议的方案。本地数据的流动要实现向应用程序提供可靠的数据,与底层以太网驱动程序交互数据报功能。
协议族系统结构框架如下图1所示,其中虚线部分是本文所要完成的,包括socket子层、运输层的TCP协议、网络层的IP和ICMP协议、ARP协议和以太网子层。
500)this.style.width=500;" border="0" />
图1 协议族系统框架
2.1 接口子层实现
以太网子层提供了与以太网驱动程序的接口,其实现驱动程序存储空间和协议空间之间数据搬移的功能;以及数据报流入的分路和流出的封装处理。
Socket(插口)子层向上层提供了创建一个socket描述符,将本地的IP地址与端口号绑定到一个socket上,TCP连接的建立、断开,数据的接收与发送的功能。
2.2 网络层实现
网络层实现包括IP协议(Internet Protocol网际协议)和基于IP协议的ICMP协议(Internet Control Messages Protocol控制报文协议)。图1中该层下部的ARP(Address Resolution Protocol 地址解析协议)为IP提供动态地址解析服务。
IP是TCP/IP协议族中最为核心的协议。所有的网络层和运输层数据都以IP数据报格式传输。为了减小TCP/IP协议族的负担,接收时首先要检查数据报的正确性,其次还要过滤目的地址不是本机的报文;此外如果收到被IP分片的数据报立即丢弃。最后判断协议交给TCP或ICMP协议处理。因为禁止IP层分片可以提高通信的效率和可靠性,根据以太网最大传输单元(MTU)的限制,socket子层控制了用户每次传输分组的最大字节数。同样服务端也对IP分片加以限制使IP无需把有限的系统资源消耗在IP报文重装上,这正是丢弃被分片的IP数据报的原因。
ICMP提供主机或路由器报告差错或提供查询信息的服务。ICMP报文可以分成两类:差错和查询。查询报文是用一对请求和回答定义的。ICMP差错报文通常包含了引起错误的IP数据报的第一个分片的IP首部(和选项),加上该分片数据部分的前8个字节。由于运输层仅仅使用TCP协议,ICMP也进行了裁剪。协议支持ping命令请求回显应答,用于检查协议族的运行状况;差错控制全部交给运输层TCP协议处理。
ARP协议为IP地址和硬件地址之间提供映射。ARP报文分为请求和应答两种报文,通过这两种报文实现ARP缓存的更新。ARP高速缓存在它的运行过程中非常关键。由于微控制器硬件资源限制ARP高速缓存只定义了8组,因此查找采用线性搜索的方法对最终性能并没有影响。缓存只包含以下4项既可以实现ARP协议又可以节省硬件资源:IP地址、MAC地址、写入时间、标志位。
2.3 运输层实现
运输层仅仅实现了TCP(Transfer Control Protocol传输控制协议)。该协议提供了全双工高可靠性的通信,因此应用层和网络层可以忽略相关细节。TCP是TCP/IP体系中面向连接的运输层协议,它所做的工作包括把应用程序交给它的数据分组交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。
每当本地发出连接建立请求后,创建一个对应的传输控制模块TCB(Transmission Control Block).它存储了该连接中的重要信息。和ARP高速缓存一样其数据保存在片内数据存储区来提高协议的运行效率。本文中TCB的实现只包含以下内容:IP地址、双方端口号、双方序列号、对方应答序号、当前连接状态、定时器、指向下一个有效数据区的指针、窗口大小。此外通过对TCP首部的选项字段的配置,即保证在局域网内部传输时IP层传输时不会分片使MMS(Maximum Segment Size 最大报文段长度)尽可能大,可以提高TCP传输效率。 同时考虑到作为客户端应用,在不影响正常工作的前提下TCP有限状态机实现中去掉了服务端的两个状态LISTEN(监听)、SYN_RCVED(接收SYN状0态)如下图2所示。
500)this.style.width=500;" border="0" />
图2 TCP有限状态机
由于网络中数据传输必然会产生数据丢失,TCP错误重传和数据重组尤为重要。错误重传是在发送了需对端确认的报文段后设置重传定时器,如果在定时器时限内未收到ACK该报文段被重发。因此当数据发送之后要等到ACK确认报文才能丢弃。数据重组是基于面向字节的序列号,实现重复数据的丢弃、乱序报文的重组。
3、协议族实现关键技术
3.1 协议族定时器的实现
ARP实现需要两个定时器。重传需要一个定时器,如果ARP报文发送后1秒中内没有应答则再次发送,本文实现连续4次重传后ARP将放弃;ARP高速缓存数据存储时间需要一个定时器,缓存内容保存时间为20分钟,同时允许管理员创建永久节点作为代理节点。
TCP实现为当前连接建立了如下六个定时器:连接建立定时器,重传定时器,延迟ACK定时器,持续定时器, FIN_WAIT_2定时器,TIME_WAIT定时器;去掉了保活定时器,因为该定时器仅是TCP连接的可选配置,在监控中的需要有应用程序实现更加严格的连接保持定时。本文根据实际监控网络情况修改了标准协议族定义的超时时间,使实时性得以提高。
3.2 协议族的内存管理策略
传入的分组是保存在内存中并将其传递给适当的协议作进一步处理的。同时,应用程序产生的数据也必须以分组的形式存储在内存中,并最终将其交给网络硬件设备传送出去。因此协议的高效性取决于如何管理保存这些分组的存储空间。本文对内存管理用以下两种方法做到快速分配存储空间,并且避免分组在各层协议之间移动时的数据复制。
发送数据报时采用大缓冲区方案:即将缓冲区划分的足够大(1514字节),提前留出协议首部字节的大小,能够存储最长的分组。接收数据报时采用链表方案:为了避免内存碎片的产生该缓冲区采用固定大小。链表的特点是允许快速封装而无需数据的复制,也就是说当接收到递交上来的数据报后,就分配一个新缓冲区,填写其中的内容后将新缓冲区插入保存此信息的链接列表中,这样就可以很容易的在某个信息的前面插入附加字节,而无需移动已经存在的数据。采用此方法可以优化TCP数据报的重组。
采用以上两种方法可以最大限度实现TCP/IP协议族内数据公用,无需额外数据搬移。
3.3 协议族数据流程
如下图3所示,用户待发送的数据首先通过socket接口程序进入TCP/IP协议族,分别进行TCP与IP的数据封装后查询ARP高速缓存,如果存在当前目的IP与硬件地址的映射则填充以太网帧头部信息后拷贝至以太网驱动程序空间立即发送,否则发出ARP查询报文,将当前用户数据拷贝至发送等待缓冲,进入接收状态等待ARP查询报文的应答。
由于输入操作发生在中断期间,此时设备驱动程序是不能调用任何过程来处理分组,也就是说中断服务程序并不直接调用IP,而是使用了消息传递的方式。当一个IP分组到达之后用消息通知主循环,由主循环调用协议族进行数据处理。如下图4所示,首先通过以太网子层分路到达帧,如果是ARP报文则检查更新ARP缓冲,收到ARP请求立即应答,若是应答报文则检查本地发送等待队列如有数据立即发送;如果是IP报文首先判定其协议类型,ICMP报文中的ping命令请求回显则立即应答,源站抑制报文交给TCP处理;若是TCP协议进入有限状态机进行解析最后将有效数据通过socket接口递交上层。
500)this.style.width=500;" border="0" />
图3 协议族数据发送处理框图 图4 协议族数据接收处理框图
4、 结论
经过裁剪的嵌入式TCP/IP协议族,结构精简,实时性强,可以在SF0020芯片上稳定运行,基于该协议族的网络监控系统控制终端通过了专项测试达到期望的要求。