首页 > 范文大全 > 正文

基于VxWorks的KAME协议栈Socket描述符的研究与扩展

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于VxWorks的KAME协议栈Socket描述符的研究与扩展范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要:通过对KAME协议栈的Socket机制进行研究,提出了一种扩展KAME协议栈的方法,修改了KAME协议栈中Socket描述符的实现机制。这种方法有效地按照要求扩充了IPv6 Socket的个数,在高性能的嵌入式系统上提高了IPv6的运行效率,在VxWorks操作系统上运行可靠,并可作为KAME协议栈的扩展应用于IPv6网络。

关键词:IPv6;KAME协议栈;Socket;VxWorks操作系统;嵌入式系统

中图分类号: TP316.2

文献标志码:A

Research and extension of Socket in KAME stack based on VxWorks

ZHANG Yan-yan1, RAN Xiang-jin2

(

1. Institute of Command Automation, PLA University of Science and Technology, Nanjing Jiangsu 210007 China;

2. Institute of Nanjing, Zhongxing Telecommunication Equipment, Nanjing Jiangsu 210012, China

)

Abstract:

This paper researches the socket mechanism of KAME protocol stack, and mentions an approach to extend the KAME stack, which modifies the mechanism of socket’s implement. It increases the number of IPv6 socket effectively, and improves the effective of IPv6 in high performance embedded system, and it is reliable to run in VxWorks operating system, and it can also be used in IPv6 network as extension of KAME stack.

This paper researched the Socket mechanism of KAME protocol stack, and proposed an approach to extend the KAME stack, which modified the implementation mechanism of Socket. It increases the number of IPv6 Socket effectively, and improves the efficiency of IPv6 in high performance embedded system, and it is reliable to run in VxWorks operating system, and it can also be used in IPv6 network as extension of KAME stack.

Key words:

Internet Protocol version 6 (IPv6); KAME protocol stack; Socket; VxWorks operating system; embedded system

0 引言

随着网络的飞速发展,目前的IPv4协议在许多方面已经显得不太适应,如IPv4地址严重不足,缺乏服务质量(QoS)控制,安全性差等。因此,为了满足人们对地址空间、性能以及安全性等方面的新需求,Internet工程任务工作小组(IETF)的IPng工作组确定了IPng的协议规范,并称之为“IPv6”[1]。IPv6是为适应未来对于网络基础设施的数量和质量的需求而设计的下一代互联网协议,解决了地址不足的问题,更好地实现了端到端的通信,能够更容易地实现QoS控制[2]和网络安全[3]。

KAME协议栈是日本一个因特网社团――WIDE项目组研究并实现的一个IPv6协议栈,它是一个开源的项目[4],最初实现在BSD系统上,目前已经在越来越多的系统上(包括各种BSD系统的变种:BSD/OS、FreeBSD、NetBSD和OpenBSD等以及VxWorks[5]等实时嵌入式操作系统)得到了应用。

与IPv4协议栈类似,KAME协议栈同样实现了Socket套接字,应用层通过Socket描述符来与协议栈进行交互[6-8]。在一些路由器或网关设备上,随着IPv6的应用越来越多,IPv6的Socket个数明显不足,因此研究一种新的IPv6 Socket实现方案,具有较高的实用价值。

1 KAME协议栈的Socket实现

1.1 实现原理

KAME协议栈以文件描述符的方式实现了Socket描述符。具体的实现原理如图1所示。从图1可以看出KAME协议栈与操作系统内核之间的紧密关系,其中虚线所表示的

是KAME协议栈与操作系统内核之间Socket描述符和Socket控制块的查找和保存操作。

图片

图1 KAME协议栈中的Socket实现

在图1中,KAME协议栈实现了如下的操作。

1)创建Socket描述符(Socket系统调用)。

从操作系统内核中获取一个Socket套接字,然后动态申请一个struct atd_socket结构体变量,用于保存与网络连接相关的成员。如果内存申请成功,就把变量指针保存在Socket套接字所指向的内核资源中。

2)关闭Socket描述符(close系统调用)。

将Socket描述符传入内核,由内核执行KAME协议栈的关闭函数――atd_soo_close函数,对Socket所指向的连接进行关闭操作,然后调用VxWorks中的文件描述符释放函数,释放该Socket描述符资源。

3)使用Write操作通过Socket描述符发送数据(Write系统调用)。

将Socket描述符传入内核,由内核执行KAME协议栈的发送数据函数――atd_soo_write函数,进行数据的发送。

4)使用Read操作通过Socket描述符接收数据(Read系统调用)。

与Write操作相似,将Socket描述符传入内核,由内核执行KAME协议栈的接收函数atd_soo_read,接收数据。

在上面所描述的操作中,atd_soo_close、atd_soo_read、atd_soo_wirte等这些KAME协议栈提供的函数是在系统初始化时,通过调用iosDrvInstall函数注册在内核中的。

1.2 存在的缺陷

这种Socket的实现机制受文件描述符个数的限制,适用于Socket比较少的系统,不适用于需要较多连接、内存有限的(如嵌入式服务器)系统。

嵌入式系统所提供的文件描述符比较少(一般提供512

个左右),虽然可以通过修改配置文件来扩大描述符的个数,但是由于获取描述符是通过循环来查找空闲资源,其效率在资源数比较多时下降很快。另外,对于嵌入式系统来说,将文件描述符扩展为几万个,会给系统带来安全隐患。

┑4期 澎挽偷:基于vxworkskame协议栈socket描述符研究扩展

┆扑慊应用 ┑30卷

2 IPv6 Socket描述符的扩展

本方案摒弃了KAME协议栈的Socket实现机制,创建了新的IPv6 Socket资源池,并以链表的方式来管理资源:空闲链表和忙链表。具体的资源管理方式如图2所示。

图片

图2 扩展后的IPv6 Socket资源的管理方式

2.1 Socket描述符资源池的初始化

Socket描述符对于使用者来说是一个整型数字,但是对于协议栈来说,它是协议栈中资源的索引,协议栈通过这个描述符来找到相应的资源。为了使Socket套接字与struct atd_socket该结构体关联起来, Socket描述符资源定义如下:

程序前

typedef struct tagIPV6_SOCKET_FD

{

int so_fd;

struct atd_socket *ptso;

} IPV6_SOCKET_FD;

程序后

so_fd是一个Socket描述符,在申请一个套接字资源时,把该值返回给调用者。

Socket描述符资源池定义为:

程序前

IPV6_SOCKET_FD *g_ptFdPool;

程序后

g_ptFdPool作为IPV6_SOCKET_FD类型的全局变量指针,在系统初始化时申请指定容量的内存,形成一个套接字资源池,并且定义链表来管理Socket描述符的申请和释放。具体定义的链表结构体如下:

程序前

typedef struct tagLISTNODE

{

UINT32 dwPrev;

UINT32 dwNext;

} LISTNODE;

程序后

该链表定义为一个双向链表,在资源的申请和释放过程中,形成忙链表和闲链表,通过忙链表可以对当前Socket资源的使用情况进行查看。另外定义一个全局变量用于保存链表的头和尾,其结构如下:

程序前

typedef struct tagMNG

{

UINT32 dwFreeHead;

UINT32 dwFreeTail;

UINT32 dwBusyHead;

UINT32 dwBusyTail;

UINT32 dwBusyNum;

UINT32 dwFreeNum;

LISTNODE *ptSocketFdList;

} MNG;

程序后

使用该MNG结构体定义一个全局变量g_tIpv6ListMng,在系统初始化时,对该变量的成员进行初始化,并申请LISTNODE类型的内存,保存在ptSocketFdList成员中,然后将链表初始化形成一个空闲链表,如图2所示。

2.2 Socket描述符的申请

在申请Socket描述符时,通过MNG结构体中的dwFreeHead成员从ptSocketFdList链表池中得到一个空闲资源,将其从空闲链表中摘除,然后添加到忙链表中,并修改dwBusyTail的值。在申请到描述符并得到atd_socket结构变量后,把atd_socket变量保存在Socket描述符所对应的g_ptFdPool资源池中,以备后续操作使用。具体实现流程如图3所示。

图片

图3 申请Socket描述符流程 图4 关闭Socket流程

2.3 关闭Socket描述符

关闭操作把该描述符对应的连接关闭,并释放连接相关的信息资源。根据Socket描述符调用IPv6_Fd_GetSock函数

来获取到atd_socket结构体,接着调用关闭连接函数atd_soo_close来释放那些与连接信息相关的资源,然后再将Socket描述符从忙链表中删除,添加到空闲链表中。具体实现流程如图4所示。

2.4 读取数据

在有数据到达时,IPv6协议栈已经成功地接收了数据,并保存在atd_socket结构体中。在上层应用调用IPv6_Read函数读取数据时,通过参数iFd给出了Socket描述符的值,找到协议栈中保存的与连接信息相关的资源,然后调用读取数据的函数atd_soo_read,把目的缓冲区指针和缓冲区长度作为入参传入,由KAME协议栈把数据内容取出,保存在缓冲区中。具体实现流程如图5所示。

图片

图5 读取数据流程

2.5 发送数据

发送数据时,把源缓冲区中的内容和长度作为入参传入,通过Socket描述符的值调用IPv6_Fd_GetSock函数得到atd_socket结构体,然后调用atd_soo_write函数将数据写入底层驱动,发送出去。具体实现流程与图5相似。

3 实验与结果分析

3.1 实验环境及方法

实验采用的配置为MIPS CPU 400@MHz,512@MB内存,VxWorks操作系统,采用C语言实现。为了测试当前支持的Socket个数,在系统中编写了一个测试函数,该函数通过循环来申请最大个数的Socket,直到申请不到为止。申请完成后,使用每个申请到的IPv6 Socket发送一个UDP报文给服务器端,服务器端在收到UDP报文后,回复一个响应;客户端收到响应后,认为该Socket有效,如果长时间收不到响应(此处设置为2@min),则认为该Socket无效,然后再测试下一个Socket,直到测试完所有的Socket。测试结束后,给出测试结果。在测试代码中,分别就申请Socket、关闭Socket、发送数据、接收数据的耗时进行了测量。

实验中服务器端采用Windows XP操作系统,安装IPv6协议栈后,使用VC 6.0编写一个UDP监听程序,在收到UDP报文后,给发送者回复一个响应。

3.2 实验结果

实验针对KAME协议栈原有的Socket个数及扩展后的Socket个数进行测试,给出两种方法在Socket个数、资源使用效率方面的实验结果。实验结果如图6、7所示。从图6、7可以看出,扩展后的Socket实现机制大大增加了IPv6 Socket的个数,并且在数据收发效率方面好于原有的Socket机制;原有的Socket机制随着Socket个数增加,对Socket进行操作的耗时也随之增加。但是修改后的Socket机制不仅扩大了Socket的个数,而且在进行Socket操作时,不受Socket个数的限制,耗时比较均匀,适合于嵌入式系统的应用。

图片

图6 KAME协议栈原有的Socket机制测试结果

图片

图7 扩展后的Socket机制测试结果

4 结语

改造后的IPv6 Socket描述符的实现可以按照所需要的容量进行配置,不再受文件描述符个数的限制,而且申请和释放Socket套接字时,避免了循环查找的操作,满足嵌入式系统高效率的要求,在宽带网关设备上运行稳定。

参考文献:

[1]张云勇,刘韵洁,张智江.基于IPv6的下一代互联网[M].北京:电子工业出版社,2004.

[2]张云勇,张智江,刘韵洁,等. IPv6业务技术研究[J].计算机科学,2005, 32(1):8-12.

[3]李信满,赵宏. IPv6的安全体系结构[J].中兴通讯技术,2002, 8(3):4-7.

[4]LI QING, JINMEI T, SHIMA K. IPv6 core protocols implementation[M]. San Fransisco:Morgan Kaufmann Publishers,2006:10-12.

[5]孔祥营,柏桂枝.嵌入式实时操作系统VxWorks及其开发环境Tornado[M].北京:中国电力出版社,2002.

[6]刘利强,吴永英,王勇智. IPv6下Socket网络编程的研究与实现[J]. 计算机技术与发展,2006, 16(6):201-203.

[7]夏涛,余胜生,周敬利,等.开发支持IPv6的应用程序[J]. 计算机工程, 2007,27(10): 51-53.

[8]袁德明.用IPv6编程接口实现有连接通信的方法[J].计算机时代,2007(9):23.