,何莹1,钱德沛1,2,刘涛21北京航空航天大学,计算机学院,(10083)2西安交通大学,计算机科学与技术系,(710049)E-mail:taobell@263.net摘要:执行环境是主动网络中各种应用、移动代码的编制、管理和运行的基础,本文提出了一种可以同时运行多版本主动程序和驻留多版本主动服务的主动网络执行环境。这个执行环境中的可编程单元在功能上按协议子树划分。在执行环境里,主动节点的功能易于扩充和升级。主动程序通过执行环境提供的接口可以访问自己所需要的特定版本的主动服务程序,执行环境对不同版本的主动服务程序的同时运行进行管理和版本名字映射。关键词:主动网络;执行环境;多版本并发;版本解析1.引言主动网是一种中间节点可编程,根据功能需要能动态扩充的新型网络结构,方便网络协议的调试和部署。主动程序和主动服务可以由用户和管理员动态通过网络驻留到网络设备上进行运行,这样可以及时地对网络设备进行升级与程序更新[8]。随着网络应用的逐步增多,主动网络也需要逐步升级和更新。其具体体现在主动程序和主动服务被逐步部署到主动网络系统中。因此有可能网络中各个节点驻留的主动服务的版本并不相同,网络中正在传输的主动包里包含的主动程序的版本也不尽相同。一般来说,一定版本的主动程序需要调用一定版本或兼容版本的主动服务,而且往往不同的主动程序在同一个主动节点上运行的时候要求不同版本的主动服务。本文在分析了主动网络原型-Softnet上,提出了一个支持多版本主动服务并发执行的执行环境。其目的是为了支持并管理不同版本的同一个主动程序和服务的并发执行。1984年Saltzer和Reed等的端对端观点(end-to-endargument)[1],提出了网络计算或功能的放置问题,对层次协议的设计起到了很大的作用。网络互联的性能取决于底层网络设备的转发性能和上次协议的性能。随着互联网络的逐步发展,网络设备的性能有了大幅度的提高,从kbps级发展到现在Gbps级,但网络协议由于需要标准化等一系列问题而发展迟缓,协议的更新大概需要10年左右。而且网络设备的更换也会带来较大的成本。主动网络[2]提出了一种反传统的中间节点可编程网络,网络计算或功能的放置有了很大的改变,计算可以动态部署到执行环境中执行。主动网是一种中间节点可编程,根据功能需要能动态扩充的新型网络结构,方便网络协议的调试和部署。主动程序和主动服务可以由用户和管理员动态通过网络驻留到网络设备上进行运行,这样可以及时地对网络设备进行升级与程序更新。1本课题得到高等学校博士学科点专项科研基金(项目编号:20020006011)和北京市教委产学研项目(项目编号:CXY100060404)资助-1-随着网络应用的逐步增多,主动网络也需要逐步升级和更新。其具体体现在主动程序和主动服务被逐步部署到主动网络系统中。因此有可能网络中各个节点驻留的主动服务的版本并不相同,网络中正在传输的主动包里包含的主动程序的版本也不尽相同。一般来说,一定版本的主动程序需要调用一定版本或兼容版本的主动服务,而且往往不同的主动程序在同一个主动节点上运行的时候要求不同版本的主动服务。因此,需要主动节点支持多版本主动服务并发执行和驻留。其目的是为了支持并管理不同版本的同一个主动程序和服务的并发执行。定义一:主动服务(ActiveService)[6],驻留在主动节点上的一块程序,可以提供一定的功能。有可能是一直在运行中后台程序,也有可能是一个程序包,可以被主动程序调用,主动服务又称为软设备。定义二:主动包(ActivePacket),主动包包括包头(APHeader)、主动程序代码(ActiveCode)、程序所用参数(Parameters)和负载(Payload)四部分。其中参数是指需要随着主动包一起移动的,并由主动程序在运行时调用和产生的少量数据。负载是和传统网络包中和负载基本相同的概念,一般来说是大块需要传输的数据。定义三:主动程序(ActiveApplication),主动程序是包含在主动包里的程序,在主动包通过主动节点的时候运行,它可以调用主动节点提供的各种服务,可以访问一定的资源,运行完毕,主动包可能被丢弃,可能被更改并转发,也有可能派生多个主动包。2.主动服务程序间的依存关系在Softnet主动网络系统中,我们将主动服务程序按协议子树[3]进行划分。图2是网络协议的分层结构图,圆圈代表协议,虚线代表协议的层次划分,从下到上形成一棵协议树[9],图中协议树用a[b[d],c[e,f]]表示。按协议层次划分是把协议树按层分成相应的可编程单元图1主动节点中部分协议和服务的依存关系acbdefPU2PU1PU0图2主动网络协议树及PU划分与连接-2-,PU分上下两个出口和两个入口,类似于传统网络计算或功能。按协议的处理路径把图2分成a[b[d]],a[c[e]],a[c[f]]三棵子树,Ia代表协议a的标识,在包中,协议标识和标识位置是不可分的,用Ai代表第i层协议标识位置值,{A1=Ia,A2=Ib,A3=Id}代表子树a[b[d]]的协议子树标识(protocol-subtreeidentification,PI)。协议子树的特点和划分原则为:(1)协议子树之间没有公共的叶子节点;(2)协议子树有共同的根结点,根结点为协议树的根结点;(3)协议子树可以有共同的分枝点;(4)协议子树可以有两个以上的PI;这里每棵子树定义为一个PU,a[c[e]]和a[c[f]]都是协议子树a[c[e,f]]的子树,所以a[c[e,f]]可以有{A1=Ia,A2=Ic,A3=Ie}和{A1=Ia,A2=Ic,A3=If}两个PI,但a[c[e,f]]和a[c[e]]不能分为两个PU而在同一个执行环境里存在。设协议子树标识P={PI0,PI1,…,PIn},PU标识D={DI0,DI1,…,DIm}(n、m为自然数,对任意一个PIi∈P,存在唯一的一个DIj∈D与PIi对应;对DIj∈D,除PIi之外,可以存在PIk∈P(PIk≠PIi)与DIj对应。图3是协议子树标识和PU标识的对应关系,图3(A)是传统网络协议协议子树标识和PU标识的对应关系,即所有的协议子树标识和一个PU标识DI0对应。经过协议子树的划分,可以得到图3(B)的对应关系,即多对一关系,我们按PU标识对图3(B)进行分类得到{PI0,PIn},{PI1,PI2},…;由于多对一的关系,每类之间没有公共元素。PI0PI1PI2…PInDI0PI0PI1PI2…PIn(B)(A)DI0DI1DI2DIm图3协议子树标识和PU标识的对应关系3.多版本主动服务程序的名字解析在多版本主动服务程序的动态名字解析中,主动程序中使用的显示名字在主动网络程序执行的时候被动态地由实际的Java类名所替换,并且不同版本的主动服务程序都需要提供相应的访问接口以提供给主动程序来访问。-3-主动服务程序的名字定义定义四:显示名字,指主动服务程序类的通用名字,不带任何版本号。定义五:版本名字,某个特定版本的主动服务程序类名,只带有主版本号,这样就确定了本版本主动服务程序所能提供的相关功能和其所依赖的的其他主动服务程序。版本名字::=显示名字+主版本号定义六:实际名字,带有主版本号和次版本号的主动服务程序类,这个类具体实现了本版本主动服务程序的相关功能。此版本号不同的同版本主动服务程序类只是实现上的不同。实际名字::=版本名字+次版本号3.2名字解析的步骤从显示名字到具体的实际名字的解析需要如下两个步骤:1)名字映射显示名字必须映射到版本名字,版本名字是指只带有主版本号的类名。这表示实现了特定的部分协议或一定功能的主动网络服务版本。版本名字是主动网络服务的基础,根据版本名字就可以知道当前主动网络服务所能提供的功能。在具体实现上,版本名字所表示的类是实际实现类的父类。2)版本解析版本名字通过版本解析,得到实际名字。不同阶段对同一版本主动服务程序的不同实现由次版本号来区分。实现这个版本主动服务的程序可能存在多种版本。例如,每个实际版本表示调试或优化阶段的不同代码。版本解析的功能就是找到特定的带实现名字的程序来实现这个版本主动服务程序所要求的功能。显示名字版本名字实际名字“MyRealAS”-名字映射Æ“MyRealAS_3”-版本解析Æ“MyRealAS_3_1”图4名字解析的两个步骤3.3执行环境中的实现在有些操作系统中,动态装载器可以将代码片断装载到正在运行的应用程序中去。这些代码片断一般以动态链接库的方式存在。这些库采用了一个标准的名字约定来表示版本和兼容信息。在Java语言里,实现了以单个类为粒度的动态装载。但是,这里没有名字约定和接口兼容信息。我们的动态类装载器将添加对名字映射和版本识别的支持。而且,还要支持对通配符所表示的版本名的支持。在我们的系统中,通配符表示的版本是昀新的稳定版本。我们利用主版本和次版本两个版本号来标示不同版本的主动网络服务的Java类,其格式为:类名_主版本号_次版本号类名和主版本号相同的主动网络服务类在接口和功能上一致。随着此版本号的不同,表示着这个主动网络服务类在内部的具体实现算法上有不同,但却对外提供了同样的服务接口。次版本号可以使用通配符(*),这样表示的是任意一个可以运行的相同主版本号的主动网络服务。这时主动节点将会向代码服务器下载昀新稳定版本的代码。如果同一个主动网-4-络服务类的主版本号不一致,则表示它们在接口和功能上有较大的不一样,一般来说不能混用。但是主动网络服务的提供者应该尽量保证向后兼容。4.主动程序访问多版本的主动服务主动包在到达主动节点后,其中的主动程序被主动节点提取。主动节点为这个主动程序建立一个临时的执行环境,这个临时的执行环境将提供给主动程序访问相应的资源的接口,包括CPU,存储器,网络和主动节点所提供的主动服务。如果这个主动程序所需的特定版本或兼容版本的主动服务程序代码在主动节点的本地代码库找不到,则主动节点将派生一个主动代码下载程序从特定的代码服务器来下载所需的代码。我们的主动网络系统采用Java来实现,Java的类装载器ClassLoader[7]是Java虚拟机用来装载class文件,定义类和接口,提供软件组件之间的名字空间分离,解决不同类和接口之间的符号引用。利用Java类装载器的名字空间分离方法,我们可以用不同的类装载器装载不同的主动程序,这样可以防止恶意程序访问其它主动程序和执行环境的数据。可以较好地提高控制主动网络系统的安全性。对不同版本的主动服务程序,我们采取相同的装载器。这是因为不同版本的主动服务程序是由同一个软件提供者所写,所以它们相互之间可以信任,不会造成访问冲突和安全性问题。同时运行中的不同版本的主动服务程序利用一个统一包装的接口提供不同的访问API,在Java中,这个是利用一个可以共享访问的Java接口来实现的。图5表示了利用Java不同的ClassLoader来装载不同类型的程序,并为主动程序提供访问主动服务程序的接口的示意图。ClassLoader下面列出的是这个ClassLoader可以装载的一些Java类的名字。实线箭头表示继承,虚线箭头表示Java中的实现某个接口。EE,FansAA,EE_ActiveService是抽象类,这几个抽象类由commonClassLoader装载。MyRealActiveService是由commonClassLoader装载的接口。FansEE,MyRealActiveServiceImpl是由FansClassLoader装载的一般Java类。TestAA1是由TestAA1ClassLoader装载的一个主动程序。这个TestAA1ClassLoader是shareClassLoade