最近在用ns2帮别人做移动自组网aodv协议的改进仿真实验,学习了路由仿真方面的不少知识,顺手记录下来。

ns2的安装

查阅网上资料发现ns2可以在cygwin上安装,为了省事就用cygwin安装了ns-2.35。具体的安装步骤可以参考下面的参考资料。

AODV协议的改进

ns2安装好后,所有的协议都存在ns-2.35目录下面打开aodv目录,里面就是aodv协议相关的代码了,其中aodv.cc是协议的主要代码,代码中关键的地方都有英文注释还是比较好理解的。

//收到的数据包都会先进入这个方法
void AODV::recv(Packet *p, Handler*) {
struct hdr_cmn *ch = HDR_CMN(p);
struct hdr_ip *ih = HDR_IP(p);assert(initialized());//assert(p->incoming == 0);// XXXXX NOTE: use of incoming flag has been depracated; In order to track direction of pkt flow, direction_ in hdr_cmn is used instead. see packet.h for details.
//如果是AODV的数据包,进入recvAODV方法if(ch->ptype() == PT_AODV) {ih->ttl_ -= 1;recvAODV(p);return;}/**  Must be a packet I'm originating...*/
if((ih->saddr() == index) && (ch->num_forwards() == 0)) {/** Add the IP Header.  * TCP adds the IP header too, so to avoid setting it twice, we check if* this packet is not a TCP or ACK segment.*/if (ch->ptype() != PT_TCP && ch->ptype() != PT_ACK) {ch->size() += IP_HDR_LEN;}// Added by Parag Dadhania && John Novatnack to handle broadcastingif ( (u_int32_t)ih->daddr() != IP_BROADCAST) {ih->ttl_ = NETWORK_DIAMETER;}
}/**  I received a packet that I sent.  Probably*  a routing loop.*/
else if(ih->saddr() == index) {drop(p, DROP_RTR_ROUTE_LOOP);return;}/**  Packet I'm forwarding...*/else {/**  Check the TTL.  If it is zero, then discard.*/if(--ih->ttl_ == 0) {drop(p, DROP_RTR_TTL);return;}}
// Added by Parag Dadhania && John Novatnack to handle broadcastingif ( (u_int32_t)ih->daddr() != IP_BROADCAST)rt_resolve(p);elseforward((aodv_rt_entry*) 0, p, NO_DELAY);
}
//根据aodv包的类型不同,进入不同的方法
void AODV::recvAODV(Packet *p) {struct hdr_aodv *ah = HDR_AODV(p);assert(HDR_IP (p)->sport() == RT_PORT);assert(HDR_IP (p)->dport() == RT_PORT);/** Incoming Packets.*/switch(ah->ah_type) {case AODVTYPE_RREQ:recvRequest(p);break;case AODVTYPE_RREP:recvReply(p);break;case AODVTYPE_RERR:recvError(p);break;case AODVTYPE_HELLO:recvHello(p);break;default:fprintf(stderr, "Invalid AODV type (%x)\n", ah->ah_type);exit(1);}}

recvRequest、recvReply、recvError、recvHello对应的就是收到控制包后不同的处理方法。与之对应的send***就是发送数据包时对应的方法。

添加ns2协议

一般不建议直接修改原始的aodv协议,可以将修改的协议作为新协议添加进ns2中,具体步骤如下:

  • common/packet.h
    – 添加static const packet_t PT_XXX = XX;注意修改最后PT_NTYPE的值
    – 添加type==PT_XXX ||
    – 添加name_[PT_XXX] = 'xxx'
  • trace/cmu-trace.h
    – 添加void format_caodv(Packet *p, int offset)方法
  • trace/cmu-trace.cc
    – 对应aodv的头文件,添加新协议的头文件
    – 添加CMUTrace::format_xxx(Packet *p , int offest)函数,内容参考format_aodv函数的
    – 在void CMUTrace::format(Packet* p, const char *why)函数中参照aodv的写法添加case PT_XXX: format_xxx(p, offset); break;
  • queue/priqueue.cc
    – 在case PT_AODV下面添加case PT_XXX:
  • tcl/lib/ns-packet.tcl
    – 搜索AODV,然后在AODV的下面添加XXX,表示声明。
  • tcl/lib/ns-lib.tcl
    – 添加XXX{set ragent [$self create-xxx-agent $node]}
    – 添加
    Simulator instproc create-xxx-agent { node } {
    set ragent [new Agent/XXX[$node node-addr]]
    $self at 0.0 "$ragent start"
    $node set ragent_ $ragent
    return $ragent
    }

  • tcl/lib/ns-mobilenode.tcl
    – 为了设置协议的混杂模式,添加
    # Special processing for XXX
    set xxxonly [string first "XXX" [$agent info class]]
    if {$xxxonly != -1 } {
    $agent if-queue [$self set ifq_(0)] ;# ifq between LL and MAC
    }

协议修改好后,需要对ns2进行重新编译,cd进入ns-2.35目录,输入:make clean&&make

实验仿真

编译成功后,就要进行仿真实验了,一般采用ns-2.35/indep-utils/cmu-scen-gen/目录下的cbrgen.tcl来生成数据流,采用setdest来生成拓扑关系。具体用法如下:

ns cbrgen.tcl [ -type cbr | tcp ] [ -nn nodes ] [ -seed seed ] [-mc connections ] [ -rate rate ]

各参数定义如下:

  • -type: 数据流类型。
  • -nn:节点数目。
  • -seed: 指定随机种子。
  • -mc: 节点间的最大连接数。
  • -rate: 数据流发送速率。
./setdest -v<2> -n <nodes> -s <speed_type> -m <min_speed> -M <max_speed> -t <simulation_time> -P <pause_type> -p <pause_time> -x <max_X> -y <max_Y>

各参数定义如下:

  • -v: 指定 setdest 的版本。
  • -n: 场景中总的节点数目。
  • -p: 节点在运动到达某一目的点的暂停时间, 若设置为 0 则代表不停留。
  • -s: 节点速度分布情况, uniform 代表均匀分布, normal 代表正态分布。
  • -m: 节点移动的最小速率。
  • -M: 节点移动的最大速率。
  • -P: 节点暂停时间类型。
  • -t: 网络仿真的持续时间,单位为 s。
  • -x: 仿真区域的长度,单位: m。
  • -y: 仿真区域的宽度,单位: m。

    仿真需要写tcl文件,可以仿照aodv.tcl的例子写,如果需要开启能量模型,需要在tcl文件中配置能量节点和初始参数。
    tcl运行完后会生成“.tr”为后缀的trace文件,trace文件包含了仿真过程中的所有分组调度事件,并按时间排序,具体的trace文件格式可以参照下面的参考文献,trace文件的分析一般采用gawk来提取并统计出仿真数据,最后使用gnuplot画出图形进行对比。具体gawk的使用及各项网络性能指标的公式参看下面的参考资料。
    最后,用gnuplot把gawk分析出来的数据画出来就行了,具体方法参看参考资料。

参考资料

cygwin安装ns2.35
加入提取能量模型
trace文件分析
gawk用法介绍
gnuplot用法介绍

基于NS2的AODV协议的修改与仿真的实现相关推荐

  1. 【MORE协议】基于MORE的改进协议设计的MATLAB仿真

    0.完整源码获得方式 方式1:微信或者QQ联系博主 方式2:订阅MATLAB/FPGA教程,免费获得教程案例以及任意2份完整源码 1.软件版本 MATLAB2021a 2.本算法理论知识 随着无线通信 ...

  2. 基于MATLAB的leach协议能量检测算法仿真

    目录 1.算法概述 2.仿真效果 3.MATLAB仿真源码 1.算法概述 LEACH协议,全称是"低功耗自适应集簇分层型协议" (Low Energy Adaptive Clust ...

  3. 基于NS-2的网络视频传输仿真平台的建立

    基于NS-2的网络视频传输仿真平台的建立   ----网络视频传输仿真平台的建立 摘 要 随着Internet和多媒体技术的迅猛发展, Internet已逐步从单一的数据传送网向数据.语音.图像等多媒 ...

  4. 基于ns2和ns3进行AODV协议改进仿真

    记录研二时协议改进的心酸历程 AODV改进和仿真建议: 1.文献阅读: 2.学会仿真: 3.路由协议源代码修改和改进: AODV改进和仿真建议: 背景:研一暑假(2021.07)导师告诉我研究方向,并 ...

  5. AODV协议的NS2仿真

    无线传感网技术团队科研原始记录 姓名:赵亮 时间:2017.12.30 周次:18 记录编号:3 科研方向: 无线传感网 原始记录       本周继续在NS2下进行仿真工作. 1. Trace文件格 ...

  6. NS2 学习笔记—— AODV协议

    在NS2中,AODV路由协议主要包括以下几个组件: 1.协议实体 2.路由表 3.定时器 (1)广播定时器 (2)周期Hello报文广播定时器 (3)用于邻居管理的定时器 (4)用于路由缓存的定时器 ...

  7. 华中科技大学计算机与网络,华中科技大学计算机通信与网络实验报告-基于NS2的协议分析实验...

    华中科技大学计算机通信与网络实验报告-基于NS2的协议分析实验 (26页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.9 积分 实验二基于NS2的协 ...

  8. 图解AODV协议(demo)

    <!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --> 图解 AODV 协议 (demo) 本文的分析基于 ns-2.33 中 ...

  9. 基于UDP高性能传输协议UDT

    UDP详解 一.  概述 UDT是一个高性能的基于UDP的数据传输协议,它是为支持高速广域网上海量数据传输而设计,为解决TCP的效率和公平问题,同时提供可靠的数据流和报文传输. UDT是C++库,几乎 ...

最新文章

  1. ashx+jQuery,一个轻量级的asp.net ajax解决方案
  2. laravel mysql like_Laravel数据库查询中对 like 的值进行转义
  3. Qt编写安防视频监控系统4-删除视频
  4. 提示JS错误:WebForm_PostBackOptions 未定义
  5. 模拟一次CSRF(跨站请求伪造)例子,适合新手
  6. json-server-----》基本使用
  7. 在Spring容器外部连接对象依赖项
  8. Linux驱动如何在不同版本上快速迭代升级
  9. Newtonsoft.Json反序列化(Deserialize)出错:Bad JSON escape sequence
  10. java.util.zip 用法,Java压缩文件工具类ZipUtil使用方法代码示例
  11. RapidJson 的使用
  12. python爬虫-8个最高效的Python爬虫框架,你用过几个?
  13. java中位于集合框架顶层位置的是,CoreJava第二次内测有答案
  14. 423.从英文中重建数字
  15. 卡永久QQ飞车紫钻 记录
  16. JUC总览,来自汪文君整理
  17. android编程实现128条形码的生成和识别
  18. matlab 插值出错,MATLAB插值问题
  19. 什么是DNS?为什么选择UDP?详细的DNS解析过程?
  20. Simple---强大的XOM工具

热门文章

  1. 13个很酷但很少有人知道的HTML元素
  2. jdk8銝要onematch_JDK8新特性详解 - 纯粹而又极致的光--木九天 - OSCHINA - 中文开源技术交流社区...
  3. Django 基础三神装(HttpResponse、render,、redirect)
  4. Oracle数据库迁移-EMC迁移到华为6800
  5. 关于Intel FPGA的功耗估计问题
  6. 低功耗之产品功耗计算
  7. UCML 导出键列不足
  8. 关于服务器开放SQL Server1433端口
  9. 程序汪粉丝校招拿下京东小米Java岗offer,薪资都是18K
  10. 写一篇关于环境设计的论文