移动Ad Hoc网(MANET)即早期军事研究中所称的移动分组无线网络,是以分组无线网技术为基础的互联的无线电台、计算机硬件和软件的集合。由于可快速配置稳定有效的动态网络,移动 Ad Hoc网技术已被主要应用于军事、消防、安全和救援等场合,其次还被用于工业和商业应用中,同时由于其组网灵活、费用低廉而被作为蜂窝移动通信网的补充技术。
本文首先简要介绍了移动 Ad Hoc网的现状及发展前景,移动 Ad Hoc网的基本概念、网络特点、网络体系结构和面临的一系列问题。然后,基于移动 Ad Hoc网的网络环境,对多种用于移动 Ad Hoc网络的路由协议进行了分析比较,并重点分析研究了AODV路由协议。
本文借鉴OPNET网络仿真工具建立了基于AODV协议的Ad Hoc网络仿真模型。通过对节点属性和数据源数量的不同配置得到多个AODV仿真模型,通过对网络模型的负载、延迟和传输效率等仿真结果进行详细分析,验证了AODV的路由协议在MANET网络中应用的可行性,为实际系统的设计和规划提供了参考模型和参考数据。同时编程实现了无线传感器网络的DSRA算法,为进一步研究有关的路由协议奠定了基础。
"Ad Hoc"[1]一词来源于拉丁语,意思是“专用的、特定的”。通常也可称为“无固定设施网”或“自组织网”。由于其组网快速、灵活、使用方便,目前Ad Hoc网络己经得到了国际学术界的广泛关注。
Ad Hoc网络的前身是分组无线网(Packet Radio Network,PRNET)[2],对分组无线网的研究源于军事通信的需要。早在1972年,美国的DARPA[3]就启动了无线网项目PRNET[4],研究战场环境下利用分级无线网进行数据通信。此后,DARPA于1983年启动了高残存性自适应网(Survivable Adaptive Network, SURAN) [5]项目,研究如何将PRNET的研究成果加以扩展以支持更大规模的网络。1994年,DARPA启动了全球移动信息系统(Global Mobile Information Systems,GloMo) [6]项目,旨在对能够满足军事应用需要的、高抗毁性的移动信息系统进行全面深入的研究。1991年成立的IEEE802.11标准委员会采用了“Ad Hoc”一词来描述这种特殊的自组织对等式多跳移动网络,Ad Hoc网络就此诞生[7]。 IETF( IETF,Intenret工程任务组)专门成立了移动Ad Hoc网络小组(Mobile Ad Hoc Network, MANET)来专门研究Ad Hoc网络的相关问题[8]。
现有的无线通信系统都是采用预先建立的网络结构,利用固定的基站之间的交换实现各终端之间的通信[8]。采用这样的模式可以在不改变网络主要结构的情况下支持移动终端的接入。但是科技的发展和社会生活的现代化对通信领域提出了更高的要求,在某些特殊情况下,现有的通信系统已无法满足需要,例如战场上部队快速展开和推进、发生地震或水灾后的营救。这些场合的通信不能依赖于任何预先架设的网络设施,基于健壮性考虑也不能采取有中心的控制方式,由此提出了组建无线移动网络的想法[9]。
移动 Ad Hoc网由自由移动的节点组成,这些节点可以安装在飞机,轮船,汽车,人或更小的设备上。移动 Ad Hoc网是移动节点组成的自治系统,这种系统可以独立操作,也可以连接到固定网络。在连接到固定网络时,移动 Ad Hoc网络只能作为端网络。
移动 Ad Hoc网具有以下几个突出的特点:
(1)自组性与分布式拓扑结构。Ad Hoc网络可以在任何时刻、任何地方自组织构建,而不需要现有的信息基础网络设施的支持。自组性和鲁棒性要求网络中各个节点的地位平等,必须采用分布式的拓扑结构。
(2)动态变化的拓扑结构。Ad Hoc网络中节点可以随意的移动,也可以动态的加入或者退出整个网络,因此网络具有动态变化的拓扑结构。
(3)有限的无线传输带宽。无线移动信道具有十分恶劣的通信环境,信号的衰落、各种噪声的干扰以及信道的共享与竞争都给无线传输带宽带来了挑战。
(4)移动终端的有限性。Ad Hoc网络中移动终端内存小,CPU处理能力低,所带电源和发射功率也十分有限,使网络的设计更加困难。
(5)安全性差。无线信道的安全性较差,容易被窃听、入侵、攻击,此外,Ad Hoc网络采用分布式结构也进一步降低了网络的安全性。
这些特点使得在设计移动 Ad Hoc网的协议时需要考虑固定互联网络中不需要考虑的很多条件和假设。
图5.9说明由于场景二和场景三通过对Hello包的发送时间间隔增长和增加了Hello包允许丢失的数目减轻网络的负载。但这么做却增加了路由发现时间,路由维护时间,路由建立时间,从上图可看出总的网络平均延时增加。
图5.10中场景二和场景三通过对Hello包的发送时间间隔增长和增加了Hello包允许丢失的数目减轻了路由的负载。
图5.10 平均路由负载
|
图5.11 平均吞吐量
节点进程模型源代码:
#include
#include
static void rx_cutver(void)
{
Packet* pkptr;
FIN(rx_cutver());
pkptr=op_pk_get(RX_IN_STRM);
if(successor_picked!=255)
{
op_pk_nfd_get(pkptr,"source",&successor_userid);
successor_picked=255;
}
op_pk_destroy(pkptr);
FOUT;
}
static void tx_cutver(void)
{
Packet* pkptr;
FIN(tx_cutver());
pkptr=op_pk_get(SRC_IN_STRM);
op_pk_nfd_set(pkptr,"source",local_node_userid);
if((successor_picked==255)&&(successor_confirmed!=255))
{
op_pk_nfd_set(pkptr,"destination",successor_userid);
op_pk_nfd_set_dbl(pkptr,"source_position_x",local_node_position_x);
op_pk_nfd_set_dbl(pkptr,"source_position_y",local_node_position_y);
successor_confirmed=255;
}
op_pk_send(pkptr,TX_OUT_STRM);
FOUT;
}
static void rx_normal(void)
{
int dest=0;
int mob=0;
int clus;
double distance,x,y;
Packet* pkptr;
FIN(rx_normal());
pkptr=op_pk_get(RX_IN_STRM);
local_node_cluster=((cluster1>cluster2)?1:2);
op_pk_nfd_get(pkptr,"cluster",&clus);
op_pk_nfd_get(pkptr,"destination",&dest);
op_pk_nfd_get(pkptr,"mobile",&mob);
if(dest==local_node_userid)
{successor=255;
op_pk_nfd_get(pkptr,"source",&cutvertex_userid);
op_pk_nfd_get(pkptr,"source_position_x",&destination_position_x);
op_pk_nfd_get(pkptr,"source_position_y",&destination_position_y);
cutver_packet_arrive_time=op_sim_time();
}
if (successor!=255 && moving!=255 && mob==255 && local_node_cluster==clus)
{
op_pk_nfd_get(pkptr,"moving_destination_x",&parent_destination_x);
op_pk_nfd_get(pkptr,"moving_destination_y",&parent_destination_y);
x=parent_destination_x-local_node_position_x;
y=parent_destination_y-local_node_position_y;
distance=sqrt(x*x+y*y);
if(distance>MAX_R)
{
moving=255;
destination_position_x=parent_destination_x-x*MAX_R/distance;
destination_position_y=parent_destination_y-y*MAX_R/distance;
}
}
op_pk_destroy(pkptr);
FOUT;
}
static void tx_normal(void)
{Packet* pkptr;
double x,y,r,a,bear;
char gs[40];
FIN(tx_normal());
pkptr=op_pk_get(SRC_IN_STRM);
local_node_cluster=((cluster1>cluster2)?1:2);
op_pk_nfd_set(pkptr,"cluster",local_node_cluster);
op_pk_nfd_set(pkptr,"source",local_node_userid);
if(successor!=255 && moving==255 && sended_moving_message!=255)
{
sended_moving_message=255;
op_pk_nfd_set(pkptr,"mobile",255);
op_pk_nfd_set_dbl(pkptr,"moving_destination_x",destination_position_x);
op_pk_nfd_set_dbl(pkptr,"moving_destination_y",destination_position_y);
sprintf(gs,"%f meter/sec",5.0);
x=destination_position_x-local_node_position_x;
y=destination_position_y-local_node_position_y;
r=sqrt(x*x+y*y);
a=asin(y/r)*(180.0/3.1415926);
if(x>=0 && y>=0)
{bear=90+a;}
else if(x<0 && y>0)
{bear=270-a;}
else if(x<=0 && y<=0)
{bear=270+fabs(a);}
else if(x>0 && y<0)
{bear=90-fabs(a);}
op_ima_obj_attr_set_dbl(local_node_objid,"bearing",bear);
op_ima_obj_attr_set_str(local_node_objid,"ground speed",gs);
}
op_pk_send(pkptr,TX_OUT_STRM);
FOUT;
}
static void rx_succes(void)
{
int sor=0;
Packet* pkptr;
FIN(rx_succes());
pkptr=op_pk_get(RX_IN_STRM);
op_pk_nfd_get(pkptr,"source",&sor);
if(sor==cutvertex_userid)
{cutver_packet_arrive_time=op_sim_time();}
if(op_sim_time()-cutver_packet_arrive_time>=20.0 && moving!=255)
{moving=255;}
op_pk_destroy(pkptr);
FOUT;
}
static void tx_succes(void)
{
Packet* pkptr;
double x,y,r,a,bear;
char gs[40];
FIN (tx_success());
pkptr=op_pk_get(SRC_IN_STRM);
local_node_cluster=((cluster1>cluster2)?1:2);
op_pk_nfd_set(pkptr,"cluster",local_node_cluster);
op_pk_nfd_set(pkptr,"source",local_node_userid);
if(moving==255&&sended_moving_message!=255)
{
sended_moving_message=255;
op_pk_nfd_set(pkptr,"mobile",255);
op_pk_nfd_set_dbl(pkptr,"moving_destination_x",destination_position_x);
op_pk_nfd_set_dbl(pkptr,"moving_destination_y",destination_position_y);
sprintf(gs,"%f meter/sec",5.0);
x=destination_position_x-local_node_position_x;
y=destination_position_y-local_node_position_y;
r=sqrt(x*x+y*y);
a=asin(y/r)*(180.0/3.1415926);
if(x>=0 && y>=0)
{bear=90+a;}
else if(x<0 && y>0)
{bear=270-a;}
else if(x<=0 && y<=0)
{bear=270+fabs(a);}
else if(x>0 && y<0)
{bear=90-fabs(a);}
op_ima_obj_attr_set_dbl(local_node_objid,"bearing",bear);
op_ima_obj_attr_set_str(local_node_objid,"ground speed",gs);
op_ima_obj_attr_get(local_node_objid,"bearing",&local_node_bearing);
}
op_pk_send(pkptr,TX_OUT_STRM);
FOUT;
}