NS2入门指导 ---SeaSon & crabhit From DB lab of HIT
序
很多人都问我新手应该看些什么资料,或者怎么熟悉NS2这个工具。这是让很多入门者非常头痛的问题,包括我自己,当初也是困难重重,不过现在让我说我也没什么印象了,因为我当时比较盲目看了很多兑现在一点儿用都没有的资料。为了能让写的东西真的对新手有所帮助,刚才跟我师弟crabhit谈了谈,所以总结了一下,希望能起到抛砖引玉的作用。
当然,只是我们的粗略见解,如有不足,欢迎指正。
SeaSon’email: yuhui.wu@163.com
Crabhit’email: crabhit@gmail.com
一. 安装(Cygwin+ns2.2*)
这应该是让很多人头大的问题,因为NS2安装比较另类,所以很多人已如果安装的时候稍有闪失,便会出现很多莫名其妙的问题,这时候一般人会选择重装,但是如果你的问题如果是cygwin(一般NS2如果是从官方网站上下载的就不会有问题),无论重装多少次都是没用的。所以一定要确保你安装的Cygwin是正确的,如果你在哈尔滨可以联系我我有一个完整版本的Cygwin,已经经过无数人测试没有任何问题,不过大于2G,所以不能放到网上,只能找我来拷了。至于NS2你如果不是特别喜欢刺激的人就安装ns-1llinone-2.2*,至于单个安装的我也装过,装好了也会出现一些莫名其妙的问题。版本如果没有特殊需求就安装最新的ns-allinone-2.29。
具体安装方法,柯老师已经写的很完整了,已经包括Cygwin的下载,我就不罗嗦了,网址如下:
http://140.116.72.80/~smallko/ns2/setup_en.htm
安装成功之后,按照网页中的提示,测试脚本,如果没什么问题,应该就是成功
了。
二、初学者要看什么资料
1.语言基础
C/C++是使用ns2的基础。调试的过程中出现的错误大多数都是C/C++常见的错误,比如空指针等等。不要被ns环境吓倒,ns2环境中出现的C/C++问题和在你熟悉的环境中出现的C/C++问题本质上是一样的,解决的方法和思路也基本相同。
Tcl,Ns2中用到TCL其实很简单,没必要去找专门的书去看,你只需要能看懂tcl脚本配置文件就OK了,不用在这上面浪费时间。在写你自己的配置文件的时候要对结点的结构有清晰的认识,才能正确地配置你所需要的东西。
2.中文资料
《NS与网络模拟》
这本书的第4、5、7仔细看看并运行其中的例子,注意:example2.tcl有问题。其他章节如果你时间充足就看,否则略过,不用浪费时间。最后如果要分析数据看看第6章的例子就行了,具体也不用详细看。如果你将上述四章看了,并且如果你对NS2有个大概的了解了,你就可以投入看跟你做的课题或者项目相关的代码了,不相关的如果没有时间就不要浪费自己的时间了,完全可以不看,因为NS2是采用面相对象的思想实现的,模块之间独立性是非常好的。如果要进一步深入熟悉和掌握NS2的使用,必须从代码中学习。
还有就是手册的中文版,个人觉得到你用过一段时间遇到问题再看比较好,毕竟只是个手册性质的东西,否则没什么效果。
3英文资料
如果你看了2中的资料觉得自己还是不怎么明白,还有恐惧感,可以看看以下两个资料:
1)NS by Example:http://nile.wpi.edu/NS/
试着把里面的例子做一遍。如果你觉得你还没看够,再把下面的看一下:
2)Ns tutorial:http://www.isi.edu/nsnam/ns/tutorial/index.html
还是主要看例子
如果你上面两部分的资料都看了,差不多都搞懂了,那么剩下的就看代码就行了。
Ns2的代码是最好的资料,也是刚开始使用ns2最大的障碍(心理上+现实中)。ns2的代码非常庞杂,各种组织各种风格的代码都有,一下子全部了解是不可能的。其实对于绝大多数人尤其是新手来说,并不需要涉及很多的代码。在
使用ns2的过程中碰到问题了,再去看相关的代码,要善于使用工具,windows环境下最适合看代码的应该是SourceInsight了。这样使用时间长了之后自然就会对ns2的代码很熟悉了。
三、分析协议
如果你的任务是改进协议或者写新协议,你首先要至少看懂一个跟你同层次的协议。熟悉相关的接口,主要也就是command()函数和recv()函数。分析协议要分为以下两个步骤:
1. 熟悉协议的逻辑流程
看相关论文或者RFC.
2. 看代码,并与论文或RFC的逻辑流程对应起来。
看一个协议的NS2代码,一般情况下可以从recv()函数开始看,看看一个节点接受到一个包的时候怎么处理,还有就是send开头的函数,也就是本协议会发出什么样的数据包。
以Aodv为例,recv()函数包括接受到的所有包的处理方法,包括路由请求,路由应答,路由维护以及上层应用的数据包等的处理,所以你要改进Aodv必须从这个函数看起,然后再逐步跟据函数执行的流程分析。
还有要学习的就是跟踪调试,具体方法可以参考柯老师的网站上的链接:http://140.116.72.80/~smallko/ns2/gdb_season.pdf
还有就是我的讲座的PPT中也有一些我觉得比较重要的资料,有时间的话可以从网上下载看一下:
下载地址1: http://db.hit.edu.cn/~season/
下载地址2: http://140.116.72.80/~smallko/ns2/528NSppt.rar
附录
写给新手的话
--- by rong111 From : NS仿真软件 论坛
昨天完成了毕业答辩.想想看自己从对ns一无所知到写出一个千行以上的协议,虽然谈不上什么了不起的成就,但毕竟自己是曾经在一个星期之内每天睡3个小时写程序的(当然,这也是因为作者临阵抱佛脚的坏习惯所致),当程序运行通过的一刹那,当波型出来的时候,还是有一种想大叫的冲动.回忆自己曾经走过的路,想告诉初学者一些东西,也算是对自己的一点交代吧.
首先,我选定ns2作为毕业设计题目是很早的,当时是指导老师指定的题目,但因为时间不紧,也没看太多.糗的是,指导老师突然出国了,虽然当时就有一种ft的感觉,但还没有意识到ns2的恶心性,选新的指导老师时还是做的ns2,而新的老师自己并不懂ns,且下面曾经的一个做ns的师兄已经工作,只留下一篇论文.这样,我赫然发觉我是专业里唯一一个做ns的,问的人都没有.
于是当然走了不少弯路.譬如为了掌握otcl,找到tcl语言的英文几百页的pdf,看了一半发觉不知所云,更恶心的是我那时还没意识到tcl对ns其实基本没用,浪费了许多时间.诸如此类.以下是一些经验之谈,给初学者.如果你是一个老油子,可以不用看了.
首先是教材的问题.第一本当然是<ns与网络模拟>,我认为学ns的中国人应该人手一本.倒不是说这本书有多好,它上面大部分东西都是直接翻译自ns官方手册. 而是,第一,这好象是唯一本能买到的中文ns书籍.如果我们不顶一下,以后就可能根本没有ns的中文书可看了. 第二,即使你英文很好(我英文应该不差了,GT都考过),牵涉到对ns2概念的一些理解,全看英文难保没有偏差,而且我们都知道,凡外国人写的程序教材,尤其是那些被称为经典的教材,c也好,c++也好,中国人看了总觉得有点怪,因为我们的思维方式好象是有些差异的.所以就象c的初学者要看谭浩强一样,这本书还是看看吧. 第三,这本书有些地方还是很有帮助的,如mflood协议,很简单的算法,却把添加协议的要素讲得很清楚,对入门而言,比自己去看一个ns自带协议要好.另外,这本书最有价值的可能是第六章对相关工具的介绍,非常有针对性,你基本上不用去找另外的介绍了.
但是,如果因为英语不好而只看中文.ns2是学不好的.也就只能按照示例运行几个tcl脚本.脚本还可以复制粘贴.如果这也称得上"研究",那也太水了.要深入了解ns2,自己写协议是应该的.而要写对协议,就必须看ns官方手册和源程序.基本上,你总能找到和你做的东西类似的源程序,有很大的参考价值.如果你找不到,如果你不是很牛,那建议你换个题目.因为ns2中很多的封装类如果没有相似的例子,你根本就不会知道怎么用.至于手册,由于中文书翻译得不错,所以更多时候是作为有问题时的查阅工具而不是教材可能会比较方便一些(当然这并不是说官方手册可以不看,这个查阅工具是你绝对需要的).
资料除了以上提到的以外,还有一些,在论坛里有.自己搜搜吧.有些还是很有用的.
对于初学者而言,ns2是一种很恶心的语言.原因是,ns2强大的原因在于它封装了很多针对网络的类,而对于学习的人来说,这也是困难所在.很多的变量类型和函数根本就不知道从哪里来,有什么用.为此,再次强调,有针对性地看源程序是必须的.另外.如果有些你认为和算法本身无关的东西,却在许多程序里面出现,那你最好照般下来.command函数的写法是一个最好的例子.另外.recv()函数是出发点,这一点对理解协议很有帮助.
下面说说网上帮助的问题,第一,ns官方的mail我没有用过,因为我做协议的时候时间已经比较紧,等不起,有谁用过不妨说一下效果好不好.第二,这个论坛好象是国内问题回复率最高的论坛了(感谢大侠们),我也是在网上胡搜搜到的.但是对于提问者来说,在提问之前你最好确定两件事: 一,你已经仔细翻过了ns手册,在论坛中搜索过你问题的关键字且没有答案.二,你的问题不是很白痴(我见过有人用语法问题来问的,而我在刚来的时候也问了几个令现在的我汗颜的问题),那样很不礼貌,也没人会理你. 另外,如果问题没有回答,即使很急,也不用发贴再催,更不要骂娘.要知道,论坛上其实没人有义务回答你的问题.好心人只是根据自己的经验指出你问题解决可能的方向,不可能去调试你的程序.如果没有回答则意味着你的问题每人遇到过.这样解决问题只能靠你自己.毕竟,学ns2自己不花时间是不行的.
最后,我是做路由协议的,因此给同样做这个的人一些建议.看协议除了mflood之外,aodv一般就够了.如果是传感器网络,diffusion中sink的描述也是不可少的.(diffusion3就算了,太长了),另外的协议比较繁,如果你不是从事这个协议的研究,没必要深入了解.就这些了.