在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

相关文章

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

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报文通常包含以下部分: 地址域:单个字节,表示从站设备