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