IPv4/IPv6双协议栈实现方案解析
扫描二维码
随时随地手机看文章
1引言
随着嵌入式系统与网络的日益结合,在嵌入式系统中引入TCP/IP协议栈,以支持嵌入式设备接入网络,成为嵌入式领域重要的研究方向。并且随着 Internet技术的迅猛发展和规模的不断扩大,现行的Internet协议IPv4在地址空间、端到端的IP连接、服务质量和网络安全等方面暴露出了不足,极大地限制了IP网络的进一步发展。而IPv6所提供的巨大地址空间和网络安全等因素已经使其成为下一代因特网IP协议,为了能够支持IPv6的应用,并且考虑到从IPv4到IPv6仍然需要一个过渡期,本文实现了一种基于实时操作系统的IPv4/IPv6双协议栈结构。
2协议栈的设计要点
2.1平台无关性
本文所设计的TCP/IP双协议栈,要求不能局限于特定的硬件环境和软件系统。因此,本协议栈的实现采用将所有的TCP/IP协议都驻留在一个进程当中,协议栈模块与操作系统内核分开。通过定义一个操作系统模拟层实现平台无关性。操作系统模拟层屏蔽硬件上的差异和获取操作系统提供统一的接口,如时钟、过程同步以及信息传递机制等。对于特定的嵌入式操作系统,直接对操作系统模拟层相应部分进行修改,以符合具体的要求。操作系统模拟层主要包括下面两个部分:
⑴与处理器和编译器有关
对不同微处理器的BYTE_ORDER存储系统定义;对不同编译器的数据类型长度的定义;与CPU或编译器相关的内容的定义。
⑵与操作系统相关
协议栈进程与应用程序进程之间的同步与通讯,需要对信号量sys_sem_t、消息队列sys_mbox_t和时钟函数进行定义和操作。
2.2协议栈的裁减
标准的TCP/IP协议栈功能复杂,代码量大,且需大量的存储器资源。为了满足嵌入式应用,必须对RFC定义的协议栈进行裁减[1]。本协议栈的实现作了如下裁减:
⑴IP模块:不支持数据分片,不支持数据包转发,不支持IPv6移动功能,不支持部分IPv6的扩展报头。
⑵ICMPv6模块:支持信息报文中的请求和应答报文,支持错误报文中的目的不可达和超时报文。
⑶邻居发现模块:支持地址解析、重复性探测,省略了路由功能。
⑷TCP模块:支持多个连接,简化滑动窗口,实现快速重传、慢启动与拥塞避免算法的TCP可靠性机制;约减掉半关闭,紧急指针,大部分TCP选项等。
协议栈的层次结构如图1所示。采用独立于网络层的方式,IPv4协议和IPv6协议分开实现,条理清楚,易于裁减,同时不会增加太多代码空间。
上层应用(HTTP)
TCP
ICMPv4ICMPv6
ARPIPv4IPv6
网络驱动
3协议栈的实现
3.1内存管理
内存管理主要是针对协议栈内部缓冲区的管理。为了胜任任意大小报文的处理,并且能够达到比较高的处理效率,在这里定义了两种缓冲区实现机制:固定长度缓冲区(pbuf_pool)和变长度缓冲区(pbuf_ram)。pbuf_pool主要适合于网络设备驱动,存放从网卡接收的数据。 pbuf_ram根据数据的大小动态的分配缓冲区,如协议的报头空间。
在这里对存储空间的申请做了一定改进。由于发送数据时很难确定各层协议头部需要多大的内存空间,特别是IPv6报文可以包含若干个扩展头,所以只申请基本头部的内存空间,在使用中动态调整的可能性就会很大,使得系统的效率降低。在这里提出了一种优化方法,根据局部性原理,通常情况下一个连接在局部时间范围内需要网络层提供相同功能的概率非常大,所以在该连接的TCP_PCB控制块中增加一个变量num,用于记录上次通信时IPv6协议头所使用的字节数,并且此变量可以被网络层的函数进行修改。当传输层下次申请pbuf时,就参考这个值。如果所需的存储空间比此值大,就需重新申请能满足要求的存储空间,同时修改num的值,并作为下一次申请的参考。
3.2网络接口的实现
网络接口层在设计上主要考虑下面几个目标:⑴向协议层提供一个统一的网络通信接口,能够将上层协议模块与具体的网络接口硬件隔离开来,以利于向不同操作系统的移植;⑵支持一个网络接口配置多个IP地址的功能,因为IPv6一个接口的IP地址包括本地链路、本地站点和全局三类地址;⑶支持多播报文的收发,提供动态的多播IP与多播MAC地址的映射服务;⑷提供较好的通信性能等。
针对上述目标,设计了如下的网络接口控制结构:
struct netif {
struct netif *next; /*指向下一个netif结构的指针*/
netif_ipaddr *iplist; /*指向接口的ip地址链的首指针*/
char name[2]; /*接口名称*/
err_t (* input)(struct pbuf *p, struct netif *); /*接口输入函数指针*/
err_t (* output)(struct netif *, struct pbuf *p,netif_addr *); /*接口输出函数指针*/
err_t (* linkoutput)(struct netif *, struct pbuf *p); /*链路层输出函数指针*/
void *state; /*指向接口的状态信息*/
mac_addr netifmacaddr; /*接口的MAC地址*/
netif_multi *multilist; /*本接口的MAC多播地址链首指针*/
┊ /*省略了部分信息 */
};
网络接口层是协议栈与下层网络设备驱动程序之间的接口,同时支持IPv4报文和IPv6报文,通过判断帧的类型字段,把接收到的不同类型的报文交给不同的协议模块进行处理。
3.3 IPv6模块
IPv6[2]模块主要包括两部分的功能,一是负责从网络接口层接收IPv6数据包,对数据包进行一定的处理后发送给上层处理模块(TCP或ICMPv6)。二是从上层接收数据,进行报文的选路,封装IPv6报头后将数据报发送给网络接口层。
3.3.1 ICMPv6[3]的简化分析
⑴ICMPv6信息报文
嵌入式设备只需作为Ping的接收端,所以不需要发送回显请求报文和处理回显应答报文。为了让客户端可以测试网络状态以及测试使用,必须支持接收请求报文和发送相应的应答报文。
⑵ICMPv6错误报文
由于嵌入式设备不会作为路由转发设备,所以需要实现发送端口不可达报文,同时要支持超时报文通告对端超时错误。在BSD中,IP层没有发送参数问题报文, ICMPv6无需支持处理参数问题报文。
3.3.2邻居发现协议(NDP)的简化分析
NDP[4]是IPv6协议的一个基本组成部分,它用于地址解析、邻居发现以及路由器及网络参数发现。本协议栈不支持路由功能,所以无需实现发送路由器通告报文,但必须接受路由器通告报文,以完成路由发现功能。同时支持邻居通告和邻居请求报文的接收和发送,以实现地址解析和重复探测。
3.4 TCP模块
在TCP之上实现有限的WEB服务,可以对该协议的实现机制作相应的简化及优化。
3.4.1 TCP模块的扩展
TCP对IPv4和IPv6报文的处理过程没有任何的不同,但是由于IPv4和IPv6地址结构不同,需要对使用IP地址的部分进行扩展。
⑴数据结构扩展
PCB是用来记录每个TCP连接状态的,包括本地IP地址和远程IP地址,扩展时使用union结构添加IPv6地址,同时添加标识位区别连接。
⑵操作扩展
在TCP处理过程中包括输入时对IP地址和端口号的匹配,输出时校验和的计算和路由的查找。由于对IPv4和IPv6报文调用相同的处理函数,需要在实现时在这几个函数的处理过程中加入对相应PCB中标识位的判断。
3.4.2 简化TCP状态机
TCP的面向连接和可靠性传输等特性决定了每一个标准的TCP状态机庞大而且复杂,对于嵌入式应用,可以根据需要进行简化。
建立连接分为主动打开和被动打开,本协议栈设计作为监听状态的服务器端,仅实现被动打开。在设计中去掉了CLOSED状态,让它一开始就处于LISTEN状态,等待对方发起连接。
断开连接分为主动断开和被动断开,从安全性的角度考虑,本设计仅实现主动断开连接。当服务器发送完数据时,向客户机发送关闭连接请求。
通过以上分析,根据特定的应用不失一般性的裁减掉复杂和冗余的机制,除去标准状态机中的客户端部分,简化连接的建立和关闭过程,就得到如图2所示的简化的TCP状态机模型。
图2 简化TCP有限状态机
图3 滑动窗口示意图
3.4.3 简化的窗口机制
标准的TCP协议使用慢启动的滑动窗口机制[5],它允许发送方在等待一个确认之前发送多个窗口。其确认是一种批量的确认,处理器要对多个数据报连续传输进行维护和处理,困难较大。
而滑动窗口的一个极限情况,是只使用单个窗口,这就变成了一种简单确认的处理方法。只是对于单个数据报的发送和确认,虽然节约了系统的资源,也使维护更加方便,但是却降低了效率。
系统采用了一个折中的办法,适当调整窗口的大小,限制连续发送报文段的个数来实现了一个简化的窗口机制,如图3所示。在这里,设置窗口大小(snd_wnd)为4个最大报文段长度(MSS),可以适当提高数据传输效率。
4 协议栈的移植和测试
在完成双协议栈的设计调试后,将此协议栈移植到基于ARM7TDMI核的AT91M40800开发板上,使用其中内嵌的10Mbps以太网控制器 RTL8019AS作为网络接口。在该平台上实现了一个简单的Web Server。通过构建提供IPv4地址和IPv6地址访问的网络拓扑结构进行测试,该双协议栈运行稳定、正常。
同时,在相同环境下将此协议栈与开源的协议栈LwIP作了吞吐率性能方面的比较,如图4所示。可知,本协议栈有较好的吞吐率,在连接数达到3条以后,平均吞吐率达到了460kB/s。
图4 协议栈吞吐率比较
5 结语
本文主要介绍了一种嵌入式双协议栈的实现,实践证明它是一个符合TCP/IP协议规范的,高性能,低开销,可移植的IPv4/IPv6双协议栈。本协议栈仅实现了基本的IPv4和IPv6通信功能,还有需多需要改进和增强的地方,扩展IPv6的移动功能是此协议栈下一步的研究重点。
本文作者创新点:嵌入式双协议栈的实现独立于操作系统内核和硬件平台。设计了具有较高处理效率的缓冲区管理机制,对IPv6功能模块进行了裁减,对TCP模块中的运行状态机和滑动窗口机制进行了简化。