在NS2中新添协议

2023-12-12 09:38
文章标签 协议 ns2 新添

本文主要是介绍在NS2中新添协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在NS2下进行新协议开发的一般流程

由于NS2使用分裂对象模型,所以在协议开发的过程中,总是从C++和Tcl两个类入手。流程说明如下:

1、定义新的路由协议:在aodv.h中定义class AODV:public Agent{}。在NS2中,所有路由协议都是从Agent类继承而来的。其中,recv()函数和command()函数是从Agent类继承下来的。recv()是Agent在接收分组时的入口,源节点在

发送一个分组时会调用目标节点的相应Agent的recv()函数。它是路由层收到数据包的处理函数,包括来自上层协议和下层协议的数据包;command()是命令处理函数。要在Otcl对象中调用对应的C++对象的方法,NS是通过command()函数实现的。对于每个TclObject,NS2为其Otcl中的解释对象建立一个实例过程,cmd{}。过程cmd{}调用影像对象的方法command(),并将cmd{}的参数作为一个参数组传递给command()方法。此外,具体协议所用到的其它函数也在AODV类中定义。

2、定义一个TclClass类的子类:定义的新的路由协议需要被NS所接纳并且可以在Tcl代码中使用,需要在aodv.cc文件进行如下定义:

static class AODVclass:public TclClass{}。

TclClass是一个纯虚类,从这个基类继承出来的类提供两个功能:构造和编译类结构互为镜像的解释类结构以及提供初始化新的TclObject的方法。每个从TclClass继承出来的类都和编译类结构中的一个TclObject的子类相关联,并能初始化所关联的类的新对象。在其构造函数中调用基类的构造函数AODVclass():TclClass(“Agent/AODV”),其中Agent/AODV指定了C++中的AODV类和Tcl部分中的Agent/AODV绑定在了一起,在编写的Tcl代码中指定路由协议时就应该用Agent/AODV。

3、修改ns/tcl/lib/ns-lib.tcl文件:在NS2中运行Tcl中指定路由协议时只会用到路由协议的名称,因此,我们需要修改NS的系统Tcl代码,使得当设定路由协议为AODV时会调用我们新增加的Agent/AODV类(也就是C++下的AODV类)。这需要在ns/tcl/lib/ns-lib.tcl文件中的Simulator类的create-wireless-node成员函数中增加如下代码:

switch-exact $routingAgent_{

AODV{

set ragent [$self create-aodv-agent $node];

}

}

然后在ns/tcl/lib/ns-lib.tcl文件中定义成员函数create-aodv-agent(参照已有的路由协议)。

4、定义包头:为了进行重复包检测,路由协议需要定义自己的包头,将各种序列号、分组标识等存在这个包头中。首先在AODV-packet.h文件中定义一个结构体 struct hdr_aodv{},其中offset和access都是系统要求的,我们只需要作相应的修改。静态变量offset_是rtp头在NS2分组中的字节偏移量;packet::access()返回用于储存包头的缓冲区的第一个字节的地址。然后我们需要在ns/tcl/lib/ns-packet.tcl文件中添加包头的名字foreach prot{······AODV······}。

为了和NS2中的Tcl代码相结合,我们还需要在aodv.cc文件中定义一个PacketHeadeaClass类的子类:

static class AODVHeaderClass:public PacketHeaderClass{}。

它是各种分组头的基类,在此类中使得Tcl中的PacketHeader/AODV类与C++中的hdr_aodv绑定在一起。如果RTP头在配置时被激活,RTPHeaderClass类的静态对象class_rtphdr提供了到Otcl的连接。当模拟正在执行时,这个静态对象以“PacketHeader/RTP”和“sizeof{hdr_rt}”作为参数,调用PacketHeaderClass的构造函数。这会使RTP头的大小被储存下来,然后被PacketHeadeaManager类的对象使用。另外,bind_offest()必须在RTPHeaderClass类的构造函数中被调用,这样,PacketHeadeaManager的对象就知道这个头的偏移量(offset)储存在哪里了。

5、创建包头类型:修改ns/common/packet.h文件。首先在enum packet_t中增加一项来表示我们新增加的包的类型,定义为PT_AODV,然后在class p_info类的p_info()构造函数中增加一行给出新增包类型的名字:name_[PT_AODV]=“aodv”。

6、在AODV类的构造函数定义时将新创建的包的类型传递给Agent类的构造函数,在aodv.cc中定义此构造函数AODV::AODV():Agent(PT_AODV)。

7、编译代码:在完成了协议的定义和实现后,我们要对新增加的文件进行编译并链接到NS2中去,这需要修改ns/Makefile文件里,增加对新类的编译。我们的文件放在ns/aodv目录下,在Makefile文件里OBJ_CC变量的定义中增加下面这行:

aodv/aodv.o aodv/······

将所有将要生成的的.o文件放在此处。然后依次执行:

./configure, make depend, make命令来重新编译NS2。

8、初步测试,首先编写一个tcl文件aodv.tcl 来验证程序的正确性。(场景设定部分可以只取简单的几个节点即可)。

9、生成随机场景:

./setdest –n 30 –p 10 –M 20 –t 500 –x 1000 –y 1000 >scene-30n-10p-20M-500t-1000-1000。(必须在setdest工具所在的目录下执行此命令)并将生成的文件放在和aodv.tcl文件相同的目录(ns/aodv)下。这样下一步的source命令才能找到场景文件,否则需要指定相对或绝对路径。

10、使用source “scene-30n-10p-20M-500t-1000-1000”命令替换刚才的测试文件tcl文件中的场景设定部分。此外还要相应地改变测试文件aodv.tcl文件中的拓扑大小及节点数等,使之与生成场景时的参数保持一致,否则运行ns时会出错。

11、生成随机数据流:

ns cbrgen.tcl –type tcp –nn 30 –seed 1 –mc 5 –rate 1.0 > cbr-30n-5c-lp

(必须在cbrgen.tcl所在的目录ns/indep-utils/cmu-scen-gen下执行)。并将生成的文件也放在和aodv.tcl文件相同的目录下(ns/aodv)。这样下一步的source命令才能找到场景文件,否则需要指定相对或绝对路径。

12、使用source “cbr-30n-5c-lp” 命令替换刚才的测试tcl文件中的数据流设定部分。

13、在ns/aodv下重新执行ns aodv.tcl命令。在tcl脚本中定义了如下代码: set tracefd [open aodv.tr w]

$ns trace-all $tracefd

它们用于打开一个名为aodv.tr的文件,用来记录模拟过程的trace数据,变量tracefd指向该文件。

而如下代码:

set namtracefd [open aodv.nam w]

$ns namtrace-all $namtracefd

用于打开一个名为aodv.nam的文件,用来记录nam的trace文件,并调用nam程序. 

14、编写awk脚本:把评价路由协议的性能指标如吞吐量、平均时延等,通过awk程序语言编写后缀为.awk的文件,然后运行gawk命令得到相应的数据文件。

15、使用gnuplot工具进行画图分析:在NS2下进行协议仿真时常用gnuplot工具的第二种工作方式,即首先编写一个plot脚本文件xx.plot。在其中可以设置生成图片的格式、x轴、y轴及title等,最后用plot “xx.data”画图。写好plot脚本后,调用gnuplot xx.plot画图。

16、使用nam工具直观地查看网络模拟过程。

这篇关于在NS2中新添协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/484126

相关文章

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

Modbus-RTU协议

一、协议概述 Modbus-RTU(Remote Terminal Unit)是一种基于主从架构的通信协议,采用二进制数据表示,消息中的每个8位字节含有两个4位十六进制字符。它主要通过RS-485、RS-232、RS-422等物理接口实现数据的传输,传输距离远、抗干扰能力强、通信效率高。 二、报文结构 一个标准的Modbus-RTU报文通常包含以下部分: 地址域:单个字节,表示从站设备

网络原理之TCP协议(万字详解!!!)

目录 前言 TCP协议段格式 TCP协议相关特性 1.确认应答 2.超时重传 3.连接管理(三次握手、四次挥手) 三次握手(建立TCP连接) 四次挥手(断开连接)  4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答 8.捎带应答  9.基于字节流 10.异常情况的处理 小结  前言 在前面,我们已经讲解了有关UDP协议的相关知识,但是在传输层,还有

DNS协议基础笔记

1.定义 DNS(Domain Name System,域名系统)是互联网的一项核心服务,它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。 2.域名解析过程 当用户在浏览器中输入一个域名,浏览器首先会检查自己的缓存中是否有该域名对应的 IP 地址。本地 DNS 服务器收到查询请求后,首先会检查自己的缓存中是否有该域名对应的 IP 地址。根域名服务器收到查询请