崔元成
研究了一种应用于无线自组网的网络层交换软件,通过系统模型的抽象和建立,将网络层需要实现的功能独立出来,进而制定了本地及全局路由的建立与维护、网络层数据交换等关键策略,综合运用了多线程设计、网络编程、驱动设计等多种编程技术,在高速ARM平台上,基于嵌入式Linux操作系统实现了网络层交换系统软件,使标准网络设备无需任何改变即可接入自组网节点设备,并能够通过无线自组网进行通信,解决了接入设备的数据寻路与数据交换问题。
In this paper, a switching software on network layer is studied for the wireless ad-hoc network. Through the abstract and establishment of the system model, the function of the network layer is separated out. The key strategies are established for the establishment and maintenance of local and global routing and data exchange on network layer. By using a variety of programming technologies such as the multithread design, network programming and driver design, the switching software on network layer is achieved based on embedded Linux operating system on the high-speed ARM platform. Therefore the network equipment can access to the node equipment in ad-hoc network without any changes and communicate with each other by wireless ad-hoc network. This research also solves the data routing and data exchange of access equipment.
ad-hoc network the network layer switching software data routing data exchange
1 引言
无线自组网系统是由一组移动节点组成的多跳临时性自治系统,可以随时随地快速构建移动通信网络,工作过程中网络各个终端节点设备可以自由移动、地位相同,因此在现场使用中可以不依赖基础设施,快速、灵活地建立无中心分布式通信网络。该系统分为物理层、MAC层和网络层3个主要部分。其中,物理层实现底层无线通信功能;MAC层实现接入、退出管理以及资源调配和链路维护功能;网络层实现通用IP网络设备(如计算机、智能手机等)的接入、网络路由管理、IP层数据透明转发功能。
本文基于无线自组网系统,在已有MAC层、物理层的研究基础上,通过对网络层交换关键技术进行研究,设计实现网络层系统软件,使接入自组网系统的各种标准网络设备进行基于IP的网络层数据交换,实现如图1所示的应用方式,各种无线终端、有线终端等设备通过Wi-Fi或以太网等标准网络接口接入自组网节点设备即可互相通信,解决自组网接入设备的数据路由交换问题。
2 网络层系统模型
如图2所示,网络层位于通用网络接口和MAC层之间,可以把通用接入接口抽象为接入网络,将MAC层及以下抽象为自组网络,网络层交换软件即可抽象为虚拟网关模型,其核心功能完全由软件虚拟实现,除了具备一般网关的通用网络底层数据捕获和转发功能之外,还具有针对自组网络设计的专用路由功能。
根据系统模型,网络层交换软件在接入端应能捕获全部局域网IP层网络数据(不仅仅是应用层数据),进行IP层数据发送,在自组网络端能够使用自组网协议栈,将得到的IP数据进行封装后完成无线数据收发,实现网络层数据的透明传输;同时,动态实时维护本地路由和全局路由,设计适合自组网节点拓扑频繁变化的情况,保证数据的正确寻路[1]。
3 关键方法的设计
3.1 本地路由发现
由于无线自组网传输的带宽等资源受限,因此必须动态了解每个自组网节点设备下挂载网络设备的组成,一旦有设备退出,就把发送到该设备的链路回收,以减少系统开销;当有新的设备接入后,又需要实时更新路由信息,增加链路以保证实时通信,使用本地局域网路由发现方法,确定每个节点下网络设备的组成,如图3所示。
采取ARP(Address Resolution Protocol,地址解析协议)技术实现本地局域网终端,可以发现该协议为标准网络协议,不需要接入设备做任何应用程序设计和修改。向接入设备发送自封装的ARP request包,接入的节点收到后反馈回复ARP answer,设置ARP最优的发送间隔、超时限制以及发送侦测包实体个数和响应判断时间,通过节点的响应状况得到本地局域网拓扑状况[2]。
3.2 全局路由建立
每个自组网节点接收的数据必须要转发到挂载着目的IP终端设备的另一个信道节点,这就要求每个自组网节点都要清楚自己和其它节点接入的终端设备情况,即全局路由。
如图4所示,在得到本地网络拓扑情况后,每个自组网节点先生成1份本地路由表,在网络建立时向建网节点发送,建网节点汇总后形成全局路由表,再向网内所有节点广播,同步全局路由信息;同时,每个节点实时监测本地局域网拓扑信息,在节点挂载的终端拓扑结构发生变化时,节点先更新本地路由表,然后通过专用信令向建网节点发送,建网节点更新全局路由表后再向全网广播进行全局路由信息同步,这样就使每个信道节点都能动态了解全局的路由信息,实现正确的路由转发功能。endprint
3.3 IP数据透明交换
将自组网节点设计为1个二级网络设备,第一级为用户网络,第二级为自组网网络。用户网络对应接入端,是用户可见的网络接口,支持完整的标准网络协议,设备与用户的数据交互在IP层及以下进行,使IP层及以上各层的数据净荷不会受到任何改变,保证了应用无关性;无线自组网络对应传输端,为用户不可见网络接口,只支持传输必须的网络协议层(如网络层、MAC层和物理层),用户的网络层数据作为净荷直接桥接到自组网网络层,通过自主设计的自组网网络协议栈进行重封装,并根据路由信息进行自组网传输,实现应用无关的IP数据透明交换设计[3]。如图5所示。
4 系统软件实现方法
系统软件设计基于嵌入式Linux操作系统,以三星公司高性能ARM11处理器S3C6410为硬件平台。
4.1 软件架构
系统软件由Linux内核模块和多线程应用程序构成,每个模块和线程实体由多个子模块组成,用户空间程序和内核空间程序协同工作,实现了整个系统网络层交换软件功能。
如图6所示,内核空间模块主要由驱动程序组成,实现底层硬件资源的调用和接口通信功能;用户空间主要由协议栈、数据结构和多线程组成,通过对应用的详细分析,按照整个软件功能可以把系统任务划分为多个子任务,这些子任务以线程的方式工作,实现整个系统的功能。
4.2 多线程编程设计
应用层运行着多个并行工作的线程,协议栈进行数据的封装和解析,上层和底层数据区分类型后放入指定的fifo中,上层的各处理线程只与各个fifo组进行数据交互,保证了应用的高适配性。其中,自组网侦测线程实现全网路由信息的接收、发送和处理;局域网侦测线程实现本节点路由信息的接收、发送和处理;路由维护线程动态维护路由表;自组网数据收发线程和局域网数据收发线程实现对应网络数据的收发;数据交换线程根据路由信息实时进行两级网络之间的数据交互。
为了协调线程的行为,实现临界区的保护等功能,必须采取一定的策略进行线程调度,通过线程间通信机制,达到线程的同步或者互斥,使线程的行为在一定的约束下按照人们的构想发生。通过信号量等多种Linux下的同步互斥方法,实现了多个线程之间的复杂调度与管理[4]。
4.3 网络编程设计
系统软件除了使用常规的应用层TCP、UDP网络编程方法之外,还使用了多种特殊的网络编程方法实现底层网络数据截取、IP伪装、ARP报文通信等多种功能。原始套接字(SOCK_RAW)是对原始网络报文进行处理的套接字,其可以绕过网络协议栈将数据直接发送到网络核心,直接通过链路层发送,或者从网络核心直接接收没有经过TCP/IP协议解析的原始数据包[5]。
将通用网卡设置为混杂模式,这样使用特殊套接字编程时就可以获得接入网络端的全部活动数据[6]。在实现底层网络数据截取过程中,直接得到含有IP头的网络层数据,完整地保留了目的地址、源地址、端口号等原始信息,保证透明传输功能的实现;在设计IP伪装功能时,将已经按照协议封装好源IP的数据包直接调用原始套接字发送,这样协议栈就不会将本机IP封装到数据流中,导致系统通信混乱;在ARP报文通信过程中,自主封装报文信息,通过原始套接字直接发送出去,实现了局域网络拓扑的发现功能,并且由于程序可以完全控制报文流量等参数,有效地降低了系统开销。
4.4 驱动程序设计
在编程过程中严格依照Linux驱动框架设计了HPI字符型驱动程序,其调用接口标准通用,本驱动程序实现系统操作接口open、close、write、read以及ioctl,open和close实现接口的打开和关闭以及资源的申请和释放,为了保证应用层的效率,write和read采用阻塞的读写方式,通过wait_queue机制,使应用程序在无法得到驱动资源的情况下进入休眠状态,提高了系统整体运行效率。
通过软件架构可以清晰地看到,除了HPI驱动程序以外,软件模块完全独立于硬件结构,即在其它类似的专网信道设备中,只要使用其它驱动程序替代HPI驱动程序就能完成大部分的软件移植工作,可以较好地适配到多种硬件平台[7]。
5 测试结果
基于自组网平台对本文设计的网络层交换系统软件进行测试,多个标准网络通信终端通过Wi-Fi或者以太网接入多个自组网节点,通信终端可通过自组网信道进行TCP、UDP等传输层及以上协议通信,软件运行稳定,交换速率可达到自组网无线传输极限速率,功能满足设计要求,交换性能也达到底层传输速率要求。
6 结语
本文针对自组网系统中数据路由交换的需求,阐述了网络层交换软件的设计与实现,综合运用多种编程技术,实现了复杂的系统模型功能要求,通过多种关键解决方法的设计,解决了数据路由、转发、IP层数据透明交换等技术难题,并基于自组网平台对其进行了验证,结果表明该软件能够很好地支持标准网络设备通过自组网系统进行高效的数据交换,解决了自组网系统中接入设备的数据寻路与数据交换问题。
参考文献:
[1] 吴功宜,董大凡. 计算机网络高级软件编程技术[M]. 北京: 清华大学出版社, 2008.
[2] Doyle J, Carroll J D. TCP/IP路由技术[M]. 夏俊杰,译. 北京: 人民邮电出版社, 2009.
[3] 甘刚. Linux/UNIX网络编程[M]. 北京: 中国水利水电出版社, 2008.
[4] W Richard Stevens, Stephen A Rago. UNIX环境高级编程[M]. 尤晋元,等译. 北京: 机械工业出版社, 2006.
[5] Peterson L L, Davie B S. 计算机网络系统方法[M]. 薛静锋,等译. 北京: 机械工业出版社, 2009.
[6] 宋敬彬,孙海滨. Linux网络编程[M]. 北京: 清华大学出版社, 2010.
[7] Alessandro Rubini, Jonathan Corbet, Greg Kroah-Hartman. Linux Device Drivers[M]. USA: O'Reilly Media, Inc, 2005.endprint
3.3 IP数据透明交换
将自组网节点设计为1个二级网络设备,第一级为用户网络,第二级为自组网网络。用户网络对应接入端,是用户可见的网络接口,支持完整的标准网络协议,设备与用户的数据交互在IP层及以下进行,使IP层及以上各层的数据净荷不会受到任何改变,保证了应用无关性;无线自组网络对应传输端,为用户不可见网络接口,只支持传输必须的网络协议层(如网络层、MAC层和物理层),用户的网络层数据作为净荷直接桥接到自组网网络层,通过自主设计的自组网网络协议栈进行重封装,并根据路由信息进行自组网传输,实现应用无关的IP数据透明交换设计[3]。如图5所示。
4 系统软件实现方法
系统软件设计基于嵌入式Linux操作系统,以三星公司高性能ARM11处理器S3C6410为硬件平台。
4.1 软件架构
系统软件由Linux内核模块和多线程应用程序构成,每个模块和线程实体由多个子模块组成,用户空间程序和内核空间程序协同工作,实现了整个系统网络层交换软件功能。
如图6所示,内核空间模块主要由驱动程序组成,实现底层硬件资源的调用和接口通信功能;用户空间主要由协议栈、数据结构和多线程组成,通过对应用的详细分析,按照整个软件功能可以把系统任务划分为多个子任务,这些子任务以线程的方式工作,实现整个系统的功能。
4.2 多线程编程设计
应用层运行着多个并行工作的线程,协议栈进行数据的封装和解析,上层和底层数据区分类型后放入指定的fifo中,上层的各处理线程只与各个fifo组进行数据交互,保证了应用的高适配性。其中,自组网侦测线程实现全网路由信息的接收、发送和处理;局域网侦测线程实现本节点路由信息的接收、发送和处理;路由维护线程动态维护路由表;自组网数据收发线程和局域网数据收发线程实现对应网络数据的收发;数据交换线程根据路由信息实时进行两级网络之间的数据交互。
为了协调线程的行为,实现临界区的保护等功能,必须采取一定的策略进行线程调度,通过线程间通信机制,达到线程的同步或者互斥,使线程的行为在一定的约束下按照人们的构想发生。通过信号量等多种Linux下的同步互斥方法,实现了多个线程之间的复杂调度与管理[4]。
4.3 网络编程设计
系统软件除了使用常规的应用层TCP、UDP网络编程方法之外,还使用了多种特殊的网络编程方法实现底层网络数据截取、IP伪装、ARP报文通信等多种功能。原始套接字(SOCK_RAW)是对原始网络报文进行处理的套接字,其可以绕过网络协议栈将数据直接发送到网络核心,直接通过链路层发送,或者从网络核心直接接收没有经过TCP/IP协议解析的原始数据包[5]。
将通用网卡设置为混杂模式,这样使用特殊套接字编程时就可以获得接入网络端的全部活动数据[6]。在实现底层网络数据截取过程中,直接得到含有IP头的网络层数据,完整地保留了目的地址、源地址、端口号等原始信息,保证透明传输功能的实现;在设计IP伪装功能时,将已经按照协议封装好源IP的数据包直接调用原始套接字发送,这样协议栈就不会将本机IP封装到数据流中,导致系统通信混乱;在ARP报文通信过程中,自主封装报文信息,通过原始套接字直接发送出去,实现了局域网络拓扑的发现功能,并且由于程序可以完全控制报文流量等参数,有效地降低了系统开销。
4.4 驱动程序设计
在编程过程中严格依照Linux驱动框架设计了HPI字符型驱动程序,其调用接口标准通用,本驱动程序实现系统操作接口open、close、write、read以及ioctl,open和close实现接口的打开和关闭以及资源的申请和释放,为了保证应用层的效率,write和read采用阻塞的读写方式,通过wait_queue机制,使应用程序在无法得到驱动资源的情况下进入休眠状态,提高了系统整体运行效率。
通过软件架构可以清晰地看到,除了HPI驱动程序以外,软件模块完全独立于硬件结构,即在其它类似的专网信道设备中,只要使用其它驱动程序替代HPI驱动程序就能完成大部分的软件移植工作,可以较好地适配到多种硬件平台[7]。
5 测试结果
基于自组网平台对本文设计的网络层交换系统软件进行测试,多个标准网络通信终端通过Wi-Fi或者以太网接入多个自组网节点,通信终端可通过自组网信道进行TCP、UDP等传输层及以上协议通信,软件运行稳定,交换速率可达到自组网无线传输极限速率,功能满足设计要求,交换性能也达到底层传输速率要求。
6 结语
本文针对自组网系统中数据路由交换的需求,阐述了网络层交换软件的设计与实现,综合运用多种编程技术,实现了复杂的系统模型功能要求,通过多种关键解决方法的设计,解决了数据路由、转发、IP层数据透明交换等技术难题,并基于自组网平台对其进行了验证,结果表明该软件能够很好地支持标准网络设备通过自组网系统进行高效的数据交换,解决了自组网系统中接入设备的数据寻路与数据交换问题。
参考文献:
[1] 吴功宜,董大凡. 计算机网络高级软件编程技术[M]. 北京: 清华大学出版社, 2008.
[2] Doyle J, Carroll J D. TCP/IP路由技术[M]. 夏俊杰,译. 北京: 人民邮电出版社, 2009.
[3] 甘刚. Linux/UNIX网络编程[M]. 北京: 中国水利水电出版社, 2008.
[4] W Richard Stevens, Stephen A Rago. UNIX环境高级编程[M]. 尤晋元,等译. 北京: 机械工业出版社, 2006.
[5] Peterson L L, Davie B S. 计算机网络系统方法[M]. 薛静锋,等译. 北京: 机械工业出版社, 2009.
[6] 宋敬彬,孙海滨. Linux网络编程[M]. 北京: 清华大学出版社, 2010.
[7] Alessandro Rubini, Jonathan Corbet, Greg Kroah-Hartman. Linux Device Drivers[M]. USA: O'Reilly Media, Inc, 2005.endprint
3.3 IP数据透明交换
将自组网节点设计为1个二级网络设备,第一级为用户网络,第二级为自组网网络。用户网络对应接入端,是用户可见的网络接口,支持完整的标准网络协议,设备与用户的数据交互在IP层及以下进行,使IP层及以上各层的数据净荷不会受到任何改变,保证了应用无关性;无线自组网络对应传输端,为用户不可见网络接口,只支持传输必须的网络协议层(如网络层、MAC层和物理层),用户的网络层数据作为净荷直接桥接到自组网网络层,通过自主设计的自组网网络协议栈进行重封装,并根据路由信息进行自组网传输,实现应用无关的IP数据透明交换设计[3]。如图5所示。
4 系统软件实现方法
系统软件设计基于嵌入式Linux操作系统,以三星公司高性能ARM11处理器S3C6410为硬件平台。
4.1 软件架构
系统软件由Linux内核模块和多线程应用程序构成,每个模块和线程实体由多个子模块组成,用户空间程序和内核空间程序协同工作,实现了整个系统网络层交换软件功能。
如图6所示,内核空间模块主要由驱动程序组成,实现底层硬件资源的调用和接口通信功能;用户空间主要由协议栈、数据结构和多线程组成,通过对应用的详细分析,按照整个软件功能可以把系统任务划分为多个子任务,这些子任务以线程的方式工作,实现整个系统的功能。
4.2 多线程编程设计
应用层运行着多个并行工作的线程,协议栈进行数据的封装和解析,上层和底层数据区分类型后放入指定的fifo中,上层的各处理线程只与各个fifo组进行数据交互,保证了应用的高适配性。其中,自组网侦测线程实现全网路由信息的接收、发送和处理;局域网侦测线程实现本节点路由信息的接收、发送和处理;路由维护线程动态维护路由表;自组网数据收发线程和局域网数据收发线程实现对应网络数据的收发;数据交换线程根据路由信息实时进行两级网络之间的数据交互。
为了协调线程的行为,实现临界区的保护等功能,必须采取一定的策略进行线程调度,通过线程间通信机制,达到线程的同步或者互斥,使线程的行为在一定的约束下按照人们的构想发生。通过信号量等多种Linux下的同步互斥方法,实现了多个线程之间的复杂调度与管理[4]。
4.3 网络编程设计
系统软件除了使用常规的应用层TCP、UDP网络编程方法之外,还使用了多种特殊的网络编程方法实现底层网络数据截取、IP伪装、ARP报文通信等多种功能。原始套接字(SOCK_RAW)是对原始网络报文进行处理的套接字,其可以绕过网络协议栈将数据直接发送到网络核心,直接通过链路层发送,或者从网络核心直接接收没有经过TCP/IP协议解析的原始数据包[5]。
将通用网卡设置为混杂模式,这样使用特殊套接字编程时就可以获得接入网络端的全部活动数据[6]。在实现底层网络数据截取过程中,直接得到含有IP头的网络层数据,完整地保留了目的地址、源地址、端口号等原始信息,保证透明传输功能的实现;在设计IP伪装功能时,将已经按照协议封装好源IP的数据包直接调用原始套接字发送,这样协议栈就不会将本机IP封装到数据流中,导致系统通信混乱;在ARP报文通信过程中,自主封装报文信息,通过原始套接字直接发送出去,实现了局域网络拓扑的发现功能,并且由于程序可以完全控制报文流量等参数,有效地降低了系统开销。
4.4 驱动程序设计
在编程过程中严格依照Linux驱动框架设计了HPI字符型驱动程序,其调用接口标准通用,本驱动程序实现系统操作接口open、close、write、read以及ioctl,open和close实现接口的打开和关闭以及资源的申请和释放,为了保证应用层的效率,write和read采用阻塞的读写方式,通过wait_queue机制,使应用程序在无法得到驱动资源的情况下进入休眠状态,提高了系统整体运行效率。
通过软件架构可以清晰地看到,除了HPI驱动程序以外,软件模块完全独立于硬件结构,即在其它类似的专网信道设备中,只要使用其它驱动程序替代HPI驱动程序就能完成大部分的软件移植工作,可以较好地适配到多种硬件平台[7]。
5 测试结果
基于自组网平台对本文设计的网络层交换系统软件进行测试,多个标准网络通信终端通过Wi-Fi或者以太网接入多个自组网节点,通信终端可通过自组网信道进行TCP、UDP等传输层及以上协议通信,软件运行稳定,交换速率可达到自组网无线传输极限速率,功能满足设计要求,交换性能也达到底层传输速率要求。
6 结语
本文针对自组网系统中数据路由交换的需求,阐述了网络层交换软件的设计与实现,综合运用多种编程技术,实现了复杂的系统模型功能要求,通过多种关键解决方法的设计,解决了数据路由、转发、IP层数据透明交换等技术难题,并基于自组网平台对其进行了验证,结果表明该软件能够很好地支持标准网络设备通过自组网系统进行高效的数据交换,解决了自组网系统中接入设备的数据寻路与数据交换问题。
参考文献:
[1] 吴功宜,董大凡. 计算机网络高级软件编程技术[M]. 北京: 清华大学出版社, 2008.
[2] Doyle J, Carroll J D. TCP/IP路由技术[M]. 夏俊杰,译. 北京: 人民邮电出版社, 2009.
[3] 甘刚. Linux/UNIX网络编程[M]. 北京: 中国水利水电出版社, 2008.
[4] W Richard Stevens, Stephen A Rago. UNIX环境高级编程[M]. 尤晋元,等译. 北京: 机械工业出版社, 2006.
[5] Peterson L L, Davie B S. 计算机网络系统方法[M]. 薛静锋,等译. 北京: 机械工业出版社, 2009.
[6] 宋敬彬,孙海滨. Linux网络编程[M]. 北京: 清华大学出版社, 2010.
[7] Alessandro Rubini, Jonathan Corbet, Greg Kroah-Hartman. Linux Device Drivers[M]. USA: O'Reilly Media, Inc, 2005.endprint