NS 手册(中文版)
NS 手册(中文版)
NS 手册(中文版)翻译委员会
主编 liguo
编委 跑 咖啡伴侣 海底浮云
满地找牙 卿袅 walker
阿月 宝哥 飘 结
序言
本书主要是翻译 ns manual 上的内容。涵盖了从 ns 的基本架构到各个常用模
块的使用,从 ns 的构件到各种调试追踪的使用。范围应该是相当的广泛。本书
是完全依照 ns manual 英文版进行翻译。对于部分特殊单词,有中英对照。希望
能对 NSer 有一定的帮助。
本书的使用建议,建议将《ns 手册(中文版)》作为浏览和索引使用,由于
译者的水平和精力有限,读者如果遇到具体问题,希望能都根据中文版找到原文
的相应位置,认真阅读英文原文。
NS 是一个相对来说比较复杂的工具,学习 NS 对于一些初学者来说,是痛
苦的,有时甚至是绝望的!但是,经历了这个过程之后,很多人会发现,NS 的
学习其实是痛并快乐着的。虽然你经历了痛苦,但是,你的收获也是巨大的。
NS 的入门就是一座山,其实只要你翻过了这座山,剩下的就只有一履平川了。
这里我要特别感谢 NS 网络模拟论坛,给我们所有 NSers 提供了一个交流,
讨论的平台。有时,或者有些人会抱怨怎么没有人回答我的问题,怎么这里的人
都不热心……其实,我想给这种人一点建议:多看看其他人的帖子,这样做不但
可能找到你的答案,也可以减少版面上很多重复的问题,方便其他人查找。当然,
我们也会尽量回答问题的。还有,问问题的时候一定要具体,其实有很多问题,
不是别人不愿意回答,而是因为问题太模糊,人家根本就看不懂,所以,问问题
一定要清楚,说明你要问的问题,贴出相关代码和报错信息等等。
啰嗦了这这么多,下面也来点儿和这本书有关的东东。这里要感谢我们参
与翻译的十一位同学,在巨大的学习压力(毕业、发论文)下,还抽出宝贵的时
间来无偿的为大家提供服务。他们当中有计算机系和通信系的同学,有本科生、
研究生和博士生。有来自北方和南方的各个高校的。总之,我们这群背景各不相
同的人,为了同一个目标,尽心竭力地为大家提供准确、流畅的《NS 手册(中
文版)》。
下面是翻译委员会各个成员的分工:
跑
咖啡伴侣
海底浮云
满地找牙
卿袅
阿月
宝哥
飘
结
本书的其他部分翻译由麦子的幸福同学友情提供,在此我们向他表示衷诚
挚感谢。
由于本书作者自身水平和时间有限,翻译中可能存在大量不足,希望大家
多多包涵。
最后,推荐一些我觉得比较有用的资料,对于初学者来说比较有参考价值。
3,4,5,6,7,8
20
26,31
40,41
10,13
14,15
37,38,39
18,19
12,13
17,21
44
liguo
walker
- I -
其中有部分由 without 提供,在此致谢。
liguo
2005 年 7 月
- II -
目录
序言............................................................................................................................... I
第 3 章 OTcl 连接....................................................................................................... 1
第 4 章 类 Simulator................................................................................................. 22
第 5 章 节点和包转发.............................................................................................. 29
第 6 章 链路:简单链路.......................................................................................... 49
第 7 章 队列管理和包调度...................................................................................... 56
第 8 章 延时和链路.................................................................................................. 73
第 9 章 ns 中的差异服务模型................................................................................. 75
第 10 章 代理............................................................................................................ 82
第 11 章 定时器........................................................................................................ 99
第 12 章 分组头及其格式...................................................................................... 103
第 13 章 误差模型...................................................................................................116
第 14 章 局域网...................................................................................................... 121
第 15 章 NS 中(修改的)寻址结构 ................................................................... 130
第 16 章 Mobile networking in ns .......................................................................... 133
第 17 章 NS 中的卫星网络 ................................................................................... 157
第 18 章 无线传播模型.......................................................................................... 175
第 19 章 NS 中的能量模型 ................................................................................... 181
第 20 章 定向扩散.................................................................................................. 183
第 21 章 XCP:显式拥塞控制协议...................................................................... 192
第 22 章 对跟踪和监控的支持.............................................................................. 200
第 23 章 对 Test Suite 的支持................................................................................ 214
第 24 章 单播路由.................................................................................................. 217
第 25 章 组播路由.................................................................................................. 226
第 26 章 ns 编码风格............................................................................................. 237
第 27 章 分级路由.................................................................................................. 243
第 28 章 UDP Agent ............................................................................................... 246
第 29 章 TCP Agent................................................................................................ 248
第 30 章 Agent/SRM .............................................................................................. 257
第 31 章 UDP 代理................................................................................................. 271
第 32 章 应用程序和传输 Agent API.................................................................... 273
第 33 章 作为应用程序的网络缓冲区.................................................................. 281
第 34 章 Session-level packet distribution ............................................................. 297
第 35 章 Emulation................................................................................................. 302
第 36 章 Nam.......................................................................................................... 307
第 37 章 会话级包分发.......................................................................................... 313
第 38 章 Asim:近似的分析的模拟........................................................................ 318
第 39 章 仿真.......................................................................................................... 322
第 40 章 Nam.......................................................................................................... 328
第 41 章 NAM trace ............................................................................................... 332
第 44 章 NS 和 NAM 的教学使用 ........................................................................ 344
- III -
附录一 网络模拟器 NS2 简析 .............................................................................. 348
附录二 开发新(路由)协议整个流程和要点.................................................... 388
- IV -
第三章
OTcl 连接
ns 是一个用 C++编写,并且以 OTcl 为前端的面向对象的模拟器。模拟器支持 C++
中的类的层次结构(在本文档中我们把这种层次结构叫做编译层次)和 OTcl 解
释器中的类似的层次结构(在文档中我们把这种层次结构叫做解释层次)。这两
种层次密切相关,从用户的脚度,编译层次的类和解释层次的类是一一对应的。
(在解释层次中,)类 TclObject 是基类。用户通过解释器创建一个新的模拟对象;
这些对象首先在解释器中被实例化;然后在编译层次中同样镜像一个相应的对
象。接着解释类层次通过类 TclClass 中定义的方法自动建立, 用户则是通过
TclClass 类中定义的方法镜像这些实例化对象。当然 C++和 OTcl 中的其他层次
结构还是存在的,这些其他的层次是不会被 TclObject 镜像的。
3.1 概念综述
为何使用两种语言?因为模拟所需要做的有两种不同类型的事情。一方面,细节
性的模拟协议,这需要一种系统的编程语言,这种语言可以有效的控制字节,包
头和实现使用大规模数据的算法。对于这些任务,执行时的速度非常重要,但是
转化时的速度(如,执行模拟,找错,修正错误,重编译,重新执行)相对而言
并不重要。
但另一方面,大部分网络研究都是只有对于参数、配置或者快速搜索大量场景都
只有微小的变化。针对这些方面,重复的时间(改变模式和重执行)变得更加重
要。因此配置只设置一次(在模拟开始的时候),执行这部分的工作变得不太要
紧。
ns 使用 C++和 OTcl 同时满足了这两种需求。C++能够快速执行但是难于变化,;
这一性质使得其适合于;具体协议的实现。OTcl 执行比较慢但是可以迅速的变
化(甚至是交互式的),这一性质使得其成为模拟配置的理想对象。ns(通过 tclcl)
提供了将两种语言的对象和变量同时出现的纽带。
如果需要更多关于脚本语言和分裂语言编程的信息,请参考 IEEE Computer[26]
上 Outerhout 的文章。关于更多网络模拟分裂编程的信息,参考 ns paper[12]
两种语言分别何时使用?使用两种语言我们将面对不同语言使用在不同场合的
问题
1
我们基本的建议是:OTcl 适用于:
配置、安装和一次性的工作
如果你能够使用已有的 C++对象做你所希望的
C++适用于:
如果你做的是需要流中每个包都运行的工作
如果你不得不改变了 C++中已有的类,使他们不可预测
例如,链接是 OTcl 对象,他集合了延迟,排队和可能的丢失模型。如果仅仅使
用这些,可以使你的实验成功,那当然最好。但是如果你想做得更实际点(需要
一种特殊的排队策略和模型),你就需要新的 C++对象了。
显然这里存在灰色区域:大多数路有在 OTcl 中实现(虽然核心 Dijkstra 算法是
在 C++中实现的)。同时,我们模拟 HTTP 时,让所有数据流在 OTcl 中实现,而
所有的包处理却在 C++中。除非在模拟时间内每秒有 100 个数据流,不然这种方
法是可行的。总的来说,如果我们需要在每秒钟调用许多次 Tcl,那最好还是将
这些代码移植入 C++代码中。
3.2 代码综述
在这个文档里面,我们用名词解释器(interpreter)表示 OTcl 里面的解释器。解
释器接口代码在单独的目录:tclcl。其他的仿真代码在目录:ns-2。我们将用符
号~tclcl/来表示在 tcl 目录的一个特定的,同样的,我们将用符号
~ns/来表示 ns-2 目录下一个特定的。
在~tclcl 里面定义了很多类。我们只着重讲述在 ns 中使用的 6 个类:Tcl 类(在
3。3 节),它包含 c++代码将要用来访问解释器的方法;TclObject 类(sec 3.4)
是所有模拟器对象的基类。这些对象在编译层次也有对应;TclClass 类(section3。
5 ) 定 义 了 被 解 释 类 的 层 次 , 以 及 允 许 用 户 实 例 化 TclObject 的 方 法 ; 类
TclCommand(section3.6)用来定义简单的全局解释器命令。类 EmbeddedTcl
(section3。7)含有装载高层次内建命令的方法,这些命令使得仿真的配置更加
容易。最后,类 InstVar(section3.8)含有访问 c++成员变量作为 otcl 瞬时变量
的方法。
本章介绍的过程与函数可以在~tclcl/tcl.{cc,h},~tclcl/tcl2.cc,~tclcl/tcl-object.tcl,
和~tclcl/tracedvar.{cc,h}找到。文件~tclcl/tcl2c++.c 用来建立 ns,而且在本章有简
略的介绍。
2
3.3 类 Tcl
Tcl 类 封装 OTcl 解释器的真正的实例,并提供与解释器访问和交流的方法,本节
描述的方法和用 c++代码的 ns 程序员相关,该类提供了以下操作方法.
获得 tcl 实例的一个指针
通过解释器激活 OTcl 过程
追踪和将结果返回解释器
报告错误状态并退出统一的状态
存储并查找”TclObject”
获得对解释器的直接访问
在下面各小节中,我们分别介绍各种方法
3.3.1 获取类 Tcl 的实例的指针(reference)
一个简单的类的实例被作为一个静态成员变量,在~tclcl/Tcl.cc 中声明;而程序
员必须获取一个这个实例的指针去访问这个部分描述的其他方法。这种访问这个
实例的(命令形式的)描述为:
Tcl& tcl = Tcl::instance();
3.3.2 激活 OTcl 过程
通过 Tcl 实例,一共有四种方式可以激活一个 OTcl 命令。从他们使用参数的方
面来说,有本质的不同。每个函数都传递一个字符串给解释器,然后解释器通过
一个全局文本来识别这个字符串。如果解释器返回一个 TCL_OK,则这些函数将
会返回一个相应 OTcl 过程,如果解释器返回一个 TCL_ERROR,则函数调用
tkerror()。用户可以重载这个过程,让它;忽略某些种类的错误。OTcl 编程的
复杂过程属于本文件讨论范围之外。下一小节(3.3.3)将描述获取解释器返回结
果的方法。
tcl.eval(char* s)调用 Tcl_GlobalEval(),通过解释器执行 s。
tcl.evalc(const char* s)保存字符串参数 s。它将字符串 s 复制到中间
缓冲区; 然后再在中间缓冲区里面调用前面的 eval(char* s)。
tcl.eval()假设命令已经存在于类 internal bp_;它直接调用 tcl.eval(char*
bp_).缓冲区自己的指针可以通过方法 tcl.buffer(void)获得。
tcl.evalf(const char* s,.....)是一个类似于的 Printf(3)。它在内部使用
vsprintf(3)来创建输入字符串。
3