关于OMNET++与NS3的对比

1,063 阅读4分钟

omnet和ns3都是以C++为基础的网络仿真软件。

但它们的体验可以说天差地别。

NS3更倾向于用尽量少的代码完成一个标准网络的仿真。NS3里有大量的常用的可供调用的模型。在一个.cc文件里就可以完成布置拓扑、配置协议栈、设置通信参数等。

OMNET++更倾向于建构一个结构清晰的仿真环境。OMNET的项目里大致分为3种文件,配置拓扑和模型间的连接关系的.ned文件,设置参数的.ini文件,以及编写自己的模块的.h和.cc文件,三类文件各司其职。而且omnet更鼓励自己编写需要的模块。omnet提供了自由度非常高的发包系统,可以控制任何一个包何时从模块中发出。

所以可见如果你需要的模块恰好ns3中有,或者可以找到他人开发的模块,那么选择ns3无疑更加方便。如果你需要根据自己或用户的需求自己开发模块,那么omnet对你则更加友好。

所以两种软件的缺点也包含在了上文中。ns3的缺点之一是结构混乱,所有的配置信息都包含在一个文件里,对于稍微大型的项目,ns3文件的可读性就很差了。另外就是对想要自己开发需要的模块的人群不太友好,ns3不提供开发教程,网络上也没有开发模块的教程,大多都是配置环境和基础使用的教程。说到这,让人不得不想起配置ns3的使用环境的步骤之复杂,建议安装前先祈祷不要遇到什么稀有bug再行安装。

那么omnet的缺点呢?它的缺点就是它的“继承地狱”。由于omnet为了方便自己开发模块,许多模块都是使用层层的继承,最终才形成可以用的模块。这导致如果你想了解一个模块的运行原理,你需要翻看所有的经过继承的模块,才能找到某个函数是在哪个文件里才被“重写”成了仿真里表现的那样。比如说adhoc主机继承自无线主机,无线主机继承自主机基类,主机基类继承自应用层及其下层的基类,它又继承自传输层及其下层的基类,然后层层继承,一直继承到物理层基类。这和ns3是不同的,对于ns3,你根本不知道一个模块的运行原理被定义在哪,对于omnet,你知道运行原理一定在这个继承树的某一个模块中被定义了,但要找到它就要费一番功夫了。

但我个人还是比较推崇omnet,因为我的毕设的内容是设计一个MAC层协议,当时有一个还算新的omnet的简单TDMA项目在github上可以下载,所以我优先使用了omnet。当然这只是其中一个原因。它相对ns3的优点在于:一、“原生”支持在windows系统上使用,这是我推崇它的最重要的原因(其实并不算原生支持,因为它的本体是linux的项目,通过在windows上安装linux的工具链来支持它在windows上运行。其实ns3也支持以这种方式运行在windows上,但ns3的教程把这种方法放在了一个很偏僻的位置,导致这种方法并不是在windows上使用ns3的主流,装虚拟机才是。而omnet打包好了在windows上安装linux工具链的全流程,只需要几个命令就可以完成安装,比ns3也更加方便。);二、更好的可视化工具。首先它在windows上有IDE,其次以比较方便的方式支持传输过程的动画演示,而且支持记录每个数据包在各个模块间的发出和接收的时序图。第三点是我推崇omnet的第二重要的原因,因为我研究MAC协议,需要的就是看每个节点的MAC层什么时候把数据包发到物理层再发出去。