基于NS2的多层卫星网络路由协议开发方案

2016-04-08 02:25韩江雪李昕
软件 2016年2期
关键词:路由协议计算机仿真卫星网络

韩江雪++李昕

摘要:卫星通信网络早在20世纪初期就已经被提出,地面网络通信系统无法满足日益增长的通信业务发展需求,商业和军事领域也直接或间接地推动了卫星通信系统的发展。随着卫星通信网络越来越复杂,卫星组网向多层化发展,而典型的地面网络路由技术由无法应用于卫星网络,因此,卫星通信系统中如何进行有效的路由选择也逐渐成为新的焦点问题。而由于卫星网络路由技术应用环境的特殊性,研究人员无法基于真实网络环境进行研究,只能通过仿真工具进行仿真实验,NS2是指Network Simulator version 2,NS(Network Simulator)是开源的软件模拟平台,研究人员使用它对网络技术进行开发研究,NS2已经包含了卫星节点、卫星链路等模块,但是这些模块较为简单,只能模拟单层卫星网络。因此,本文提出了在NS2中模拟多层卫星网络,实现层间通信,研发多层卫星网络路由协议的方法。

关键词:计算机仿真;卫星网络;路由协议;NS2

中图分类号:TP319

文献标识码:A

DOI:10.3969/j.issn.1003-6970.2016.02.016

引言

卫星网络通信范围覆盖全球,可以保证较高速率的传输速度,支持大规模可扩展的网络结构,当前,卫星网络星座主要有单层卫星星座和多层卫星星座两种,主要包含低轨道卫星(IEO),中轨道卫星(MEO)或者地球同步卫星(GEO)三种轨道类型的卫星,目前,世界上各个国家都已经建立起了较为完善的卫星通信网络系统。而未来的卫星通信系统势必要为更多的用户提供更快速更加高效可靠的通信服务。因此,结合多轨道、多层次的卫星构建更广泛更健壮的立体式多层卫星网络通信系统已经成为卫星网络的发展趋势,随着空间网络越来越复杂化,多层卫星通信网络中如何实现快速有效的路由问题也日益成为新的研究焦点。而由于卫星网络的特殊性,普通研究人员没有条件在实际网络中进行研究,只能通过仿真平台进行,因此,本文将描述如何在NS2中模拟多层卫星网络拓扑,仿真层间卫星链路,实现星间通信,研发多层卫星网络中的路由协议。

1 多层卫星网络

多层卫星网络是指结合低轨道卫星,中轨道卫星或者地球同步卫星,使用层间卫星链路连接不同轨道的卫星群体,结合不同轨道卫星的优势,建立起立体式、多层次、交叉覆盖的卫星网络,多层卫星通信网络的拓扑结构如下图所示:

相对于单层卫星构成的空间网络,多层卫星通信网络具有更高的可扩展性、灵活性以及强的抗毁性。要使用卫星组网,必须首先解决网络中如何快速有效进行路由的问题,多层卫星网络的路由算法大多采用集中式路由方式,高层卫星为集中控制群体,低层卫星为接入卫星,通信过程中由高层卫星为低层计算最优路径,数据在低层卫星中进行转发。

2 NS2仿真平台

NS2仿真平台实际上模拟了一个时间调度引擎,调度引擎的核心对象是调度器类,负责进行时间推进并对在时间轴上的各个事件队列进行调度,调度的过程中可能会在新的时刻触发新的事件,那么这些事件就会被加入对应时间点上的事件队列中,等待调度引擎进行调度。调度器类采用先进先出的数据结构逐个调度事件,直到时间推进到仿真结束时刻,模拟过程中止。

NS2使用C++和Otcl语言进行开发,Otcl语言负责编写仿真脚本,制定仿真计划,调用NS2中封装好的各个功能模块,C++语言对tcl脚本解释执行。

NS2仿真平台已经封装了许多功能模块,最基本的是节点、链路、数据包格式等等。其中也包括了卫星网络仿真模块,但是实现的卫星网络功能较为简单并且与真实场景差异较大,仿真实验时需要在这部分功能的基础上进行二次开发。

2.1 卫星网络模块

NS2中卫星网络仿真模块的核心代码在ns-2.35目录下的satellite文件夹中,主要包括satnode类,sathandoff类,satroute类,satlink类等源文件分别用来模拟卫星节点、卫星链路切换、卫星路由、卫星链路等。

2.1.1 sathandoff模块

由于卫星的移动性,不同轨道间的卫星或者是地面站与卫星间为了保证能够正常通信需要经常进行链路切换(找到一颗位置上更加合适的卫星连接上),sathandoff就是负责这部分的工作,其中包括termhandoff以及sathandoff两个主要的函数分别包含了地面站和卫星的切换机制。每颗卫星都包含一个sathandoff的实例,切换是由链路检测切换时间来控制的,在tcl脚本中配置好链路切换检测的周期,每颗卫星或地面站就会周期性地调用sathandoff或者termhandoff函数检测并切换链路(需要切换时)。

2.1.2 satroute模块

satroute类模拟了卫星路由层的功能,其中Recv和ForwardPacket两个函数实现了收、发数据包的功能。NS2白带了一个集中式的路由代理satRouteLogic类,默认情况下,当卫星需要转发数据包时就使用这个路由代理类计算全网最短路径路由表并依照路由表转发数据,最短路径可以配置成使用跳数或链路时延两种计算方式。使用路由代理类相当于是默认每颗卫星在每一时刻都知道全网实时拓扑,这显然是不切实际的,因此实际仿真时不应使用这个路由代理。

2.1.3 satlink模块

satlink类负责模拟星间链路,包括星地链路、同层卫星轨道内链路、同层卫星轨道间链路。

3 多层卫星网络路由协议在NS2中的实现方案

NS2仿真平台中已经实现了部分卫星网络仿真模块,拥有极地卫星节点和地球同步卫星节点,但是星间链路只包括同层卫星之间的链路,没有层间链路的定义与实现。并且模块中实现的路由功能使用的是集中式的路由代理satRouteLogic类,每颗卫星转发数据时由路由代理类实时根据全网拓扑计算网络最短路径,这也与实际情况不符,因此,需要将自己的路由协议方案,下面,将从层间链路、链路切换、星间通信、路由模块等方面介绍如何在NS2中搭建多层卫星网络以及仿真自己的路由协议。

3.1 层间链路及链路切换

NS2中satellite文件夹下的satlink.cc以及satlink.h文件实现了卫星链路模块,为了实现层间链路,首先在satlink.h中加入层间链路宏定义:

#defrne LINK ISL INTERLAYER 9

接着,在satlink.cc中定义在tcl语法中对层间链路的标识:

if(strcmp( argv[2], “geo”)==0){

type_=LrNK_GSL_GEO;

return TCL_OK:

}……

else if( strcmp( argv[2],“interlayer”)==0){

type_= LINK ISL_INTERLAYER;

retum TCL OK;

}

这样就可以在tcl脚本中使用interlayer指令将两颗不同层的卫星进行连接,如下代码所示:

$ns add-isl interlayer $n(0)$n(1)$opt(bw_isl)$opt(ifq) $opt(qlim)

但是,这样的连接是没有实际意义的,因为层间卫星节点的运动轨迹不同,两颗卫星由于空间位置、倾角的原因不可能永久连接,因此,需要实现层间链路的链路切换功能。

链路切换功能是satellite文件夹下的sathandoff类,类中的handoff函数实现了轨道间链路,反向缝链路以及星地链路的切换功能。这里将层间链路的切换功能加入handoff函数,层间链路切换的核心代码如下:

for(slhp=(SatLinkHead*)local->linklisthead().lh_first;slhp;

slhp=(SatLinkHead*) slhp->nextlinkhead()){

peer_meo=get_peer(slhp);

peer_slhp_meo=get_peer_linkhead(slhp);

dist_to_peer_meo=SatGeometry::distance(peer_coord_meo,local_coord_);

int layerchanges=FALSE;

for(inti=MEO->minld;i <=MEO->count;i++)

{

double dist_to_Meo_next;

disttoMeonext=SatGeometry::distance(Meopos->coord(),local_coord_);

if(disttoMeonext

peer_nextslhp_meo=getMeopeer_nextlinkhead(peer_next_meo);

tx_channeI meo=slhp->phy_tx()->channel();

rx_channel_meo=slhp->phy_rx()->channel();

}

}

}

层间链路切换由低层卫星触发,根据星间距离、倾角选择一颗合适的高层卫星进行链路切换。

3.2 星间通信

主干卫星为了为低层卫星计算路由表,需要定期收集低层卫星的链路状态,这就涉及到星间通信,但是在NS2中并没有相应的模块实现,为此,可以将低层卫星定期上传链路状态的功能集成到卫星路由模块。卫星路由模块由satelite文件夹下的satroute类实现。首先在satroute类中创建定时器,负责周期性上传链路状态报告,在定时器触发的函数中通过Pakcet类构造链路状态数据包并上传给主干卫星。核心代码如下:

NsObject*link_entry_;

Packet*p=allocpkt();

hdr_ip *iph= hdr_ip::access(p);

iph->saddr()=node()->address();

iph->daddr()=GeoAd;

hdrc->la st_hop_=myaddr_;//for tracing purposes

link_entry_=slhpGeo;

link_entry_->recv(p,(Handler*)0);

3.3 路由模块

satroute类实现了卫星路由模块,其中的Recv和ForwardPacket函数分别描述了卫星节点的发送和接收数据包的功能。ForwardPacket函数调用了SatRouteLogic类实时计算路由表确定下一跳,在实际开发路由协议的时,需要屏蔽SatRouteLogic类,调用自己生成的路由表进行数据转发。

首先,在satroute.h头文件中定义路由表结构体:

struct slot_entry{

int next_hop;

NsObject* entry;

};

低层卫星的路由表由主干节点定期收集链路状态报告并汇总后计算得出,主干节点计算完成后通过星间通信下发给低层卫星,低层卫星接收到路由表后更新slot_entry结构体。

实际转发数据包时,只需在ForwardPacket函数中访问slot_entry结构体,找到下一跳节点并转发数据即可完成路由工作。

4 结论

本文给出了如何在NS2仿真平台中模拟多层卫星网络,实现层间链路、链路切换、星间通信,仿真路由协议的方法,研究人员只需要按照文中介绍的内容进行开发,即可实现多层卫星网络路由协议的仿真测试。

猜你喜欢
路由协议计算机仿真卫星网络
2023卫星网络与空间应用技术大会召开
高通量卫星网络及网络漫游关键技术
全球低轨卫星网络最新态势研判
基于Pareto多目标遗传的LEO卫星网络多业务Qos路由算法
精确打击效能评估系统中路由协议的研究
自动控制原理的仿真实验教学设计