NS 的 网络功能实体结构及类结构 任三阳. 把 N 门时髦的技术挂在嘴边不如 将一门过时的技术记在心里。 ——BBS A poor framework is much better than nothing. ——kkzhou.

Slides:



Advertisements
Similar presentations
首 页 首 页 上一页 下一页 本讲内容 投影法概述三视图形成及其投影规律平面立体三视图、尺寸标注 本讲内容 复习: P25~P31 、 P84~P85 作业: P7, P8, P14[2-32(2) A3 (1:1)]
Advertisements

纺纱学. 2 绪 论 基本要求:了解纺纱系统的类别 重点掌握:棉纺系统的工艺流程 3 一、纺纱原理与设备 纺纱:用物理或机械的方法将纺织纤维纺成纱 线的过程。 纺纱原理:初加工、原料的选配、开松除杂、 混和、梳理、精梳、并合、牵伸、加捻、卷绕等。 纺纱方法:传统纺纱方法、新型纺纱方法。 纺纱设备:开清棉联合机、梳棉机、精梳机、
Nutch 二次开发介绍.  1.Nutch 二次开发中重点环节介绍 1.1 信息源选择及规范制定 1.2 信息预处理 1.3 索引构建 1.4 排序规则制定 1.5 查询系统及用户界面  2.Nutch 中的 plugin 介绍 2.1 Plugin 介绍 2.2 页面解析.
一、统计范围 注册地在湖里区的具有房地产开发资质的 房地产开发企业 无论目前是否有开发项目 无论开发的项目是在湖里区还是在其他区 没有开发项目的企业需要报送年报和月报 中的资金表(空表)。 新成立的项目公司,要先入库,再报报表。
第十二章 常微分方程 返回. 一、主要内容 基本概念 一阶方程 类 型 1. 直接积分法 2. 可分离变量 3. 齐次方程 4. 可化为齐次 方程 5. 全微分方程 6. 线性方程 类 型 1. 直接积分法 2. 可分离变量 3. 齐次方程 4. 可化为齐次 方程 5. 全微分方程 6. 线性方程.
在近年的高考地理试题中,考查地球上 两点间最短航线的方向问题经常出现,由于 很多学生对这类问题没有从本质上搞清楚, 又缺乏空间想象能力,只是机械地背一些结 论,造成解这类题目时经常出错。 地球上两点间的最短航线方向问题.
概率统计( ZYH ) 节目录 3.1 二维随机变量的概率分布 3.2 边缘分布 3.4 随机变量的独立性 第三章 随机向量及其分布 3.3 条件分布.
DCN 多核防火墙快速配置之 目的 NAT 配置 神州数码网络 蒋忠平.
HistCite 结果分析示例 罗昭锋. By:SC 可能原因:文献年度过窄,少有相互引用.
细分曲面 傅孝明 SA 目录 细分曲面的基本思想 两个关键问题 一些基本概念 几种简单的细分曲面算法 细分曲面方法分类.
计算机 在分析化学的应用 ( 简介 ) 陈辉宏. 一. 概述 信息时代的来临, 各门学科的研究方法都 有了新的发展. 计算机的介入, 为分析化学的进展提供了 一种更方便的研究方法.
Linux 下驱动程序简介 —USB 摄像头 CWY-CTS-SA117L 袁师盛 柴佳杰 孙融 王磊.
嵌入式操作系统 陈香兰 Fall 系统调用 10/27/09 嵌入式 OS 3/12 系统调用的意义  操作系统为用户态进程与硬件设备进行交互提供 了一组接口 —— 系统调用  把用户从底层的硬件编程中解放出来  极大的提高了系统的安全性  使用户程序具有可移植性.
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第六十二讲 ) 离散数学. 最后,我们构造能识别 A 的 Kleene 闭包 A* 的自动机 M A* =(S A* , I , f A* , s A* , F A* ) , 令 S A* 包括所有的 S A 的状态以及一个 附加的状态 s.
分析化学与无机化学中溶液 pH 值计算的异同比较 谢永生  分析化学是大学化学系的一门基础课,课 时较少,其内容主要是无机物的化学分析。 分析化学是以无机化学作为基础的,我们 都是在已掌握一定的无机化学知识后才学 习分析化学 。所以在分析 化学的学习中会 重复许多无机化学内容,造成学习没有兴.
1 为了更好的揭示随机现象的规律性并 利用数学工具描述其规律, 有必要引入随 机变量来描述随机试验的不同结果 例 电话总机某段时间内接到的电话次数, 可用一个变量 X 来描述 例 检测一件产品可能出现的两个结果, 也可以用一个变量来描述 第五章 随机变量及其分布函数.
论匀强磁场条件下磁通回 路的取法 物理四班 物理四班 林佳宁 (PB ) 林佳宁 (PB ) 指导老师 : 秦敢 指导老师 : 秦敢.
主讲教师:陈殿友 总课时: 124 第八讲 函数的极限. 第一章 机动 目录 上页 下页 返回 结束 § 3 函数的极限 在上一节我们学习数列的极限,数列 {x n } 可看作自变量 为 n 的函数: x n =f(n),n ∈ N +, 所以,数列 {x n } 的极限为 a, 就是 当自变量 n.
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第三十八讲 ) 离散数学. 第八章 格与布尔代数 §8.1 引 言 在第一章中我们介绍了关于集 合的理论。如果将 ρ ( S )看做 是集合 S 的所有子集组成的集合, 于是, ρ ( S )中两个集合的并 集 A ∪ B ,两个集合的交集.
线性代数习题课 吉林大学 术洪亮 第一讲 行 列 式 前面我们已经学习了关 于行列式的概念和一些基本 理论,其主要内容可概括为:
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第二十五讲 ) 离散数学. 定理 群定义中的条件 ( 1 )和( 2 )可以减弱如下: ( 1 ) ’ G 中有一个元素左壹适合 1 · a=a; ( 2 ) ’ 对于任意 a ,有一个元素左逆 a -1 适 合 a -1 ·
第二章 随机变量及其分布 第一节 随机变量及其分布函数 一、随机变量 用数量来表示试验的基本事件 定义 1 设试验 的基本空间为 , ,如果对试验 的每一个基 本事件 ,规定一个实数记作 与之对应,这样就得到一个定义在基本空 间 上的一个单值实函数 ,称变量 为随机变量. 随机变量常用字母 、 、 等表示.或用.
第 4 章 过程与变量的作用范围. 4.1 Visual Basic 的代码模块 Visual Basic 的应用程序是由过程组成的, 过程代码存放在模块中。 Visual Basic 提供了 三类模块,它们是窗体模块、标准模块和类 模块。 窗体模块 窗体模块是大多数 Visual Basic.
数 学 系 University of Science and Technology of China DEPARTMENT OF MATHEMATICS 第 3 章 曲线拟合的最小二乘法 给出一组离散点,确定一个函数逼近原函数,插值是这样的一种手段。 在实际中,数据不可避免的会有误差,插值函数会将这些误差也包括在内。
聚合物在生物高分子分离中的应用 王延梅 中国科学技术大学高分子科学与工程系 Tel
实验三: 用双线性变换法设计 IIR 数字滤波器 一、实验目的 1 熟悉用双线性变换法设计 IIR 数字滤波器的原理与方法。 2 掌握数字滤波器的计算机仿真方法。 3 通过观察对实际心电图信号的滤波作用, 获得数字滤波的感性知 识。
OS 进程调度模拟演示 制作人: 钱晶 高上上. OS 进程调度模拟-实验原理 静态优先级原理 在这种方式下,系统一旦把处理机分配给就绪队 列中的优先权最高的进程后,该进程便一直执行下去, 直至完成。或因为发生某事件使该进程放弃处理机,系 统方可再将处理机分配给另一优先级最高的进程。这些 事件包括有优先级更高的进程进入,或是因为某些原因.
信息利用与学术论文写作 Library of Jiangsu University, Zhenjiang Sha Zhenjiang
操作系统原理课程设计指南 姜海燕 设计考核幻灯制作  1.1 封皮:系统名称,研制人员  1.2 目的及意义  1.3 功能设计:功能框图、用例图  1.4 结构设计:系统结构  1.5 核心技术及技术路线:画图  1.6 进度安排  1.7 人员安排  1.8.
数 学 系 University of Science and Technology of China DEPARTMENT OF MATHEMATICS 第 5 章 解线性方程组的直接法 实际中,存在大量的解线性方程组的问题。很多数值方 法到最后也会涉及到线性方程组的求解问题:如样条插值的 M 和.
主讲教师:陈殿友 总课时: 124 第十一讲 极限的运算法则. 第一章 二、 极限的四则运算法则 三、 复合函数的极限运算法则 一 、无穷小运算法则 机动 目录 上页 下页 返回 结束 §5 极限运算法则.
在发明中学习 线性代数 概念的引入 李尚志 中国科学技术大学. 随风潜入夜 : 知识的引入 之一、线性方程组的解法 加减消去法  方程的线性组合  原方程组的解是新方程的解 是否有 “ 增根 ” ?  互为线性组合 : 等价变形  初等变换  高斯消去法.
东南大学计算中心 网站应用与实践 主讲人 吴俊. 2 东南大学计算中心 网站制作流程  确定主题、风格  规划栏目、收集素材  版面设计、配色  编辑页面  测试发布 FrontPage 要完成的任务.
Photoshop CS4 标准培训教程 第三章第三章 在 Photoshop CS4 中所谓的不规则选区指的是随意性强,不被局限在几何形状内, 他们可以是鼠标任意创建的也可以是通过计算而得到的单个选区或多个选区。在 Photoshop 中可以用来创建不规则选区的工具被分组放置到套索工具组、魔棒工具组.
第一节 相图基本知识 1 三元相图的主要特点 (1)是立体图形,主要由曲面构成; (2)可发生四相平衡转变; (3)一、二、三相区为一空间。
9的乘法口诀 1 .把口诀说完全。 二八( ) 四六( ) 五八( ) 六八( ) 三七( ) 三八( ) 六七( ) 五七( ) 五六( ) 十六 四十八 四十二 二十四 二十一 三十五 四十 二十四 三十 2 .口算, 并说出用的是哪句口诀。 8×8= 4×6= 7×5= 6×8= 5×8=
吉林大学远程教育课件 主讲人 : 杨凤杰学 时: 64 ( 第五十三讲 ) 离散数学. 定义 设 G= ( V , T , S , P ) 是一个语法结构,由 G 产生的语言 (或者说 G 的语言)是由初始状态 S 演绎出来的所有终止符的集合, 记为 L ( G ) ={w  T *
编译原理总结. 基本概念  编译器 、解释器  编译过程 、各过程的功能  编译器在程序执行过程中的作用  编译器的实现途径.
周期信号的傅里叶变换. 典型非周期信号 ( 如指数信号, 矩形信号等 ) 都是满足绝对可 积(或绝对可和)条件的能量信号,其傅里叶变换都存在, 但绝对可积(或绝对可和)条件仅是充分条件, 而不是必 要条件。引入了广义函数的概念,在允许傅里叶变换采用 冲激函数的前提下, 使许多并不满足绝对可积条件的功率.
 符号表  标识符的作用: 声明部分:定义了各种对象及对应的属性和 使用规则。 程序体:对所定义的对象进行各种操作。 $ididname IdnameAttributeIR  必要性 Token : 新表-符号表(种类、类型等信息):
初中几何第三册 弦切角 授课人: 董清玲. 弦切角 一、引入新课: 什么是圆心角、圆周角、圆周角定理的内容是什么? 顶点在圆心的角叫圆心角。 顶点在圆上,并且两边都和圆相交的角叫做圆周角。 定理:一条弧所对的圆周角等于它所对的圆心角的一半。 A B′ C B O.
Department of Mathematics 第二章 解析函数 第一节 解析函数的概念 与 C-R 条件 第二节 初等解析函数 第三节 初等多值函数.
1 第 7 章 存储过程、触发器和程序包 在很多时候,都需要保存 PL/SQL 程序块,以便 随后可以重新使用。这也意味着,程序块需要一个名 称,这样需才可以调用或者引用它。命名的 PL/SQL 程序块可被独立编译并存储在数据库中,任何与数据 库相连接的应用程序都可以访问这些存储的 PL/SQL 程序块。
系统介绍 一 二 系统登录 三 使用流程 四 信息维护 系统介绍 根据中国政府与有关国家政府签署的相互出具《最终用户和最终 用途说明》的协议,为了便利企业申办《最终用户和最终用途说 明》, 商务部机电和科技产业司委托中国国际电子商务中心开发了 《最终用户和最终用途说明》申请系统,企业可通过此系统填写.
网上预约集港操作指南 一、登录系统 登陆下面图片显示网址:输入堆场用户名、密码和校验码登陆系统.
首 页 首 页 上一页 下一页 本讲内容本讲内容 视图,剖视图(Ⅰ) 复习: P107 ~ P115 作业: P48(6-2,6-4), P49( 去 6-6) P50, P51(6-13), P52 P50, P51(6-13), P52 P53 (6-18,6-20) P53 (6-18,6-20)
1-4 节习题课 山东省淄博第一中学 物理组 阚方海. 2 、位移公式: 1 、速度公式: v = v 0 +at 匀变速直线运动规律: 4 、平均速度: 匀变速直线运动 矢量式 要规定正方向 统一单位 五个量知道了三 个量,就能求出 其余两个量 3 、位移与速度关系:
《 UML 分析与设计》 交互概述图 授课人:唐一韬. 知 识 图 谱知 识 图 谱知 识 图 谱知 识 图 谱.
常州机电职业技术学院 数控编程与加工技术 精品课程 项目 3 加工中心程序编制 模块 2 方形型腔类零件 上饶职业技术学院 课程负责人:罗根云 2011 年 5 月
LOGO s 数控机床故障诊断与维修. 子项目 8 掌握 M 、 T 代码的工作原理并进行控制 冷却、转速、刀库等 。 任务 8.3 编制斗笠式刀库换刀 PLC 程序,排除故障.
1 、如果 x + 5 > 4 ,那么两边都 可得 x >- 1 2 、在- 3y >- 4 的两边都乘以 7 可得 3 、在不等式 — x≤5 的两边都乘以- 1 可得 4 、将- 7x — 6 < 8 移项可得 。 5 、将 5 + a >- 2 a 移项可得 。 6 、将- 8x < 0.
新一代移动物联系统 MC MOBILE CONTROL 开启办公物联网时代 Product Promotion.
项目七: PLC 功能指令应用 带进位循环左移指令 XXXXX. 项目七: PLC 功能指令应用 FX2 系列可编程控制器移位控制指令有移位、循环移位、字移位 及先进先出 FIFO 指令等 10 条指令。 带进位循环右移指令 RCR 带进位循环左移指令 RCL 字右移位指令 WSFR 先入先出读出指令.
1 物体转动惯量的测量 南昌大学理学院
本讲主要内容: 1. 如何登陆网站后台 2. 基础信息修改 3. 网站文章类型资料更新 4. 网站图片类型资料更新 5. 网站链接类型资料更新 本讲主要目的: 在结束本讲内容之后,能够按照客户的需求对网站的资料 进行实时更新操作。
§10.2 对偶空间 一、对偶空间与对偶基 二、对偶空间的有关结果 三、例题讲析.
请同学们仔细观察下列两幅图有什么共同特点? 如果两个图形不仅形状相同,而且每组对应点所在的直线 都经过同一点, 那么这样的两个图形叫做位似图形, 这个点叫做位 似中心.
企业产品标准信息公共服务平台 操作介绍 目录 一 、系统架构介绍 二 、企业产品标准自我声明填报系统 三 、企业产品标准公示系统.
表单自定义 “ 表单自定义 ” 功能是用于制作表单的 工具,用数飞 OA 提供的表单自定义 功能能够快速制作出内容丰富、格 式规范、美观的表单。
力的合成 力的合成 一、力的合成 二、力的平行四边形 上一页下一页 目 录 退 出. 一、力的合成 O. O. 1. 合力与分力 我们常常用 一个力来代替几个力。如果这个 力单独作用在物体上的效果与原 来几个力共同作用在物体上的效 果完全一样,那么,这一个力就 叫做那几个力的合力,而那几个 力就是这个力的分力。
逻辑设计基础 1 第 7 章 多级与(或)非门电路 逻辑设计基础 多级门电路.
八. 真核生物的转录 ㈠ 特点 ① 转录单元为单顺反子( single cistron ),每 个蛋白质基因都有自身的启动子,从而造成在功能 上相关而又独立的基因之间具有更复杂的调控系统。 ② RNA 聚合酶的高度分工,由 3 种不同的酶催化转 录不同的 RNA 。 ③ 需要基本转录因子与转录调控因子的参与,这.
一、 版 面 构 成 的 概 念 版 面 构 成 的 概 念 二、 版 面 构 成 的 发 展 趋 势 版 面 构 成 的 发 展 趋 势 三、 广 告 文 字 的 版 面 构 成 广 告 文 字 的 版 面 构 成 四、 广 告 版 面 的 视 觉 流 程 广 告 版 面 的 视 觉 流 程.
U niversity of S cience and T echnology of C hina VxWorks 及其应用开发 陈香兰 年 7 月.
§5.6 利用希尔伯特 (Hilbert) 变换 研究系统的约束特性 希尔伯特变换的引入 可实现系统的网络函数与希尔伯特变换.
1 第三章 数列 数列的概念 考点 搜索 ●数列的概念 ●数列通项公式的求解方法 ●用函数的观点理解数列 高考 猜想 以递推数列、新情境下的 数列为载体, 重点考查数列的通 项及性质, 是近年来高考的热点, 也是考题难点之所在.
第二节. 广告牌为什么会被风吹倒? 结构的稳定性: 指结构在负载的作用下 维持其原有平衡状态的能力。 它是结构的重要性质之一。
韩文数据库使用说明 鲁锦松. 主要内容 一、为什么要用数据库 二、怎样利用中文数据库 三、怎样利用韩文数据库.
单元四 电动后视镜控制电路. 汽车辅助装置汽车辅助装置 一、教学目的要求: 掌握电动后视镜的组成、功用、工作过程以 及控制电路 二、主要教学内容: ( 1 )电动后视镜的组成 ( 2 )电动后视镜控制电路 ( 3 )电动后视镜工作过程 三、教学重点、难点: 电动后视镜工作过程.
SCI 数据库检索练习参考 本练习完全依照 SCI 数据库实际检索过程而 实现。 本练习完全依照 SCI 数据库实际检索过程而 实现。 练习中,选择了可以举一反三的题目,读 者可以根据题目进行另外的检索练习,如: 可将 “ 与 ” 运算检索改为 “ 或 ” 、 “ 非 ” 运算检索 等等。 练习中,选择了可以举一反三的题目,读.
Presentation transcript:

NS 的 网络功能实体结构及类结构 任三阳

把 N 门时髦的技术挂在嘴边不如 将一门过时的技术记在心里。 ——BBS A poor framework is much better than nothing. ——kkzhou

outline 1 预修知识 2 一个最简单的 ns 仿真的启动过程 3Ns 的网络实体结构和类结构

1 预修知识 C++ 、 Tcl 、 OTcl 的语法 – – – 《 ns 与网络模拟》 面向对象的思想:虚拟函数,动态创建机 制 Ns 的安装和简单仿真操作 ( 论坛上有 ) Ns 的开发工具: gdb 和 tcldebug( 非常简单 ) Ns 的分裂对象模型和 tclcl( 非常重要而且很 难,主要原理是动态创建机制 ) 要学透,注意区分类 和对象,发现好多问 题都是因为 OTcl 理解 不透造成的。

一个仿真例子的操作过程 1. 写场景 tcl 脚本,temp.tcl 2. 运行 ns temp.tcl 3. 察看仿真过程,是否有错或者是否与预想 中的大致相似 nam tmp.nam 4. 分析仿真数据 tmp.tr ,可以用各种工具 set ns [new Simulator] set tracefd [ open tmp.tr w] set namfd [open tmp.nam w] $ns trace-all $tracefd $ns namtrace-all $namfd set n0 [$ns node] set n1 [$ns node] $ns duplex-link $n0 $n1 1Mb 10ms DropTail set tcp [new Agent/TCP] set snk [new Agent/TCPSink] $ns attach-agent $n0 $tcp $ns attach-agent $n1 $snk set ftp [new Application/FTP] $ftp attach-agent $tcp $ns connect $tcp $snk $ns at 0.1 "$ftp start" $ns at 5.0 “exit 0" $ns run

例子的仿真结果 tcp tcp tcp r ack tcp tmp.tr 文件内容节选 V -t * -v 1.0a5 -a 0 A -t * -n 1 -p 0 -o 0xffffffff -c 31 -a 1 A -t * -h 1 -m s 0 n -t * -a 0 -s 0 -S UP -v circle -c black -i black n -t * -a 1 -s 1 -S UP -v circle -c black -i black l -t * -s 0 -d 1 -S UP -r D c black + -t 0.1 -s 0 -d 1 -p tcp -e 40 -c 0 -i 0 -a 0 -x { null} - -t 0.1 -s 0 -d 1 -p tcp -e 40 -c 0 -i 0 -a 0 -x { null} h -t 0.1 -s 0 -d 1 -p tcp -e 40 -c 0 -i 0 -a 0 -x { null} r -t s 0 -d 1 -p tcp -e 40 -c 0 -i 0 -a 0 -x { null} + -t s 1 -d 0 -p ack -e 40 -c 0 -i 1 -a 0 -x { null} tmp.nam 文件内容节选

2 一个最简单的 ns 脚本的启动过程 set ns [new Simulator] set n0 [$ns node] set n1 [$ns node] $ns duplex-link $n0 $n1 1Mb 10ms DropTail set tcp [new Agent/TCP] set snk [new Agent/TCPSink] $ns attach-agent $n0 $tcp $ns attach-agent $n1 $snk set ftp [new Application/FTP] $ftp attach-agent $tcp $ns connect $tcp $snk proc finish {} { exit 0 } $ns at 0.1 "$ftp start" $ns at 5.0 "finish" $ns run

启动过程 0 当命令行运行 ns ,会创建 3 个对象 _o1, _o2, _o3 _o1 和 _o2 是 RNG , _o3 是 Import (tclcl/tcl- import.tcl) simulator:~/ins/ns-2.28/idcus$ ns % set a [new Application/FTP] _o4 % _o1 info class RNG % _o2 info class RNG % _o3 info class Import % _o4 info class Application/FTP

启动过程 1 set ns [new Simulator]

#tclcl/tcl-object.tcl proc new { className args } { set o [SplitObject getid] if [catch "$className create $o $args" msg] { if [string match "__FAILED_SHADOW_OBJECT_" $msg] { # # The shadow object failed to be allocated. # delete $o return "" } global errorInfo error "class $className: constructor failed: $msg" $errorInfo } return $o } “Simulator create 4” 该操作创建一个 Simulator 对象,并 调用它的 init 函数进 行初始化

启动过程 1 Simulator instproc init args {…} #tcl/lib/ns-lib.tcl Simulator instproc init args { …… $self create_packetformat $self use-scheduler Calendar $self set nullAgent_ [new Agent/Null] $self set-address-format def if {[lindex $args 0] == "-multicast"} { $self multicast $args } eval $self next $args } 这个还未找到代码位置 ( 找 到了 ) ,可以猜想是创建数 据包的头标对应的数据结 构,创建对象 _o5 ,类型 为 PacketHeaderManager 创建对象 _o6 ,类型为 Scheduler/Calender ,一个非常 重要的类,单线程的 ns 能模拟 多节点的网络,就是通过它来 调度。但是用起来简单,只需 要知道 “ 我的一个事件,给定一 个时间,交给它,到时候它就 会处理 ” 就行了 创建对象 _o7 ,类型为 Agent/Null ,一个黑洞

#tcl/lib/ns-lib.tcl Simulator instproc use-scheduler type { $self instvar scheduler_ if [info exists scheduler_] { if { [$scheduler_ info class] == "Scheduler/$type" } { return } else { delete $scheduler_ } set scheduler_ [new Scheduler/$type] $scheduler_ now }

dbg1.8> _o4 info class Simulator dbg1.9> _o5 info class PacketHeaderManager dbg1.10> _o6 info class Scheduler/Calendar dbg1.11> _o7 info class Agent/Null dbg1.12> _o8 info class AllocAddrBits dbg1.13> _o9 info class AllocAddr dbg1.14> _o10 info class Address dbg1.15> _o11 info class invalid command name "_o11" while executing "_o11 info class" dbg1.16> 目前为止已经产 生了 10 个对象了

启动过程 2 ☆ set n0 [$ns node] set n1 [$ns node]

#tcl/lib/ns-lib.tcl Simulator instproc node args { $self instvar Node_ routingAgent_ wiredRouting_ satNodeType_ …… # Enable-mcast is now done automatically inside Node::init{} # # XXX node_factory_ is deprecated, HOWEVER, since it's still used by # mobile IP, algorithmic routing, manual routing, and backward # compability tests of hierarchical routing, we should keep it around # before all related code are wiped out. set node [eval new [Simulator set node_factory_] $args] set Node_([$node id]) $node #add to simulator's nodelist in C++ space $self add-node $node [$node id] #set the nodeid in c++ Node - ratul $node nodeid [$node id] $node set ns_ $self $self check-node-num return $node } 代码没有找到。 这一步的所有对象都 由这个命令创建 ( 找到 了,其实就是 new Node) 在 c++ 的 Simulator 对象中 加入该 node 对象

new Node 之后,会调用 Node 类的 init 函数 #tcl/lib/ns-node.tcl if {[llength $args] != 0} { set address_ [lindex $args 0] } else { set address_ $id_ } $self cmd addr $address_; $self mk-default-classifier 显式调用 command 方 法的一个例子。介绍一 下 command 函数 Node instproc mk-default-classifier {} { Node instvar module_list_ # At minimum we should enable base module foreach modname [Node set module_list_] { $self register-module [new RtModule/$modname] } Node instproc register-module { mod } { $self instvar reg_module_ $mod register $self set reg_module_([$mod module-name]) $mod } module_list_ 是 Node 的 变量!只有 Base 一个 值

RtModule/Base instproc register { node } { $self next $node $self instvar classifier_ set classifier_ [new Classifier/Hash/Dest 32] $classifier_ set mask_ [AddrParams NodeMask 1] $classifier_ set shift_ [AddrParams NodeShift 1] # XXX Base should ALWAYS be the first module to be installed. $node install-entry $self $classifier_ } 每一个 RtModule/xxx 在 register 函数中都 会 new 一个 classifier

Node instproc install-entry { module clsfr {hook ""} } { $self instvar classifier_ mod_assoc_ hook_assoc_ if [info exists classifier_] { if [info exists mod_assoc_($classifier_)] { $self unregister-module $mod_assoc_($classifier_) unset mod_assoc_($classifier_) } # Connect the new classifier to the existing classifier chain, # if there is any. if [info exists hook_assoc_($classifier_)] { if { $hook == "target" } { $clsfr target $hook_assoc($classifier_) } elseif { $hook != "" } { $clsfr install $hook $hook_assoc_($classifier_) } set hook_assoc_($clsfr) $hook_assoc_($classifier_) unset hook_assoc_($classifier_) } set mod_assoc_($clsfr) $module set classifier_ $clsfr } 保存最后一 次调用时的 clsfr module 列表, 以 classifier 为 索引 classifier 列表, 以 classifier 为索 引

RtModule instproc register { node } { # Attach to node and register routing notifications $self attach-node $node $node route-notify $self $node port-notify $self } 进入到 rtmodule 的 c++ 代码中,把该节 点的指针交给 rtmodule 的一个变量 Node instproc route-notify { module } { $self instvar rtnotif_ if {$rtnotif_ == ""} { set rtnotif_ $module } else { $rtnotif_ route-notify $module } $module cmd route-notify $self } RtModule instproc route-notify { module } { $self instvar next_rtm_ if {$next_rtm_ == ""} { set next_rtm_ $module } else { $next_rtm_ route-notify $module } 把 rtmoudule 构成链表

Node instproc port-notify { module } { $self instvar ptnotif_ lappend ptnotif_ $module } Node RtModule/Base Classifier/Hash/Dest mod_assoc_(_o13)=_o12 classifier_ entry_ 红色是 Node 的 变量 表示对象之间的联系纽带数据包的传输

dbg1.23> set n1 [$ns node] _o11 dbg1.24> _o11 info class Node dbg1.25> _o12 info class RtModule/Base dbg1.26> _o13 info class Classifier/Hash/Dest dbg1.28> set n2 [$ns node] _o14 dbg1.29> _o14 info class Node dbg1.30> _o15 info class RtModule/Base dbg1.31> _o16 info class Classifier/Hash/Dest dbg1.32> _o17 info class invalid command name "_o17" while executing "_o17 info class" dbg1.33> 路由模块,如果要加入策略路 由的话,或者自己开发路由协 议,需要自己开发这个模块。 其实该模块的功能是计算路由, 而执行路由是由 Classifier 进行 的 路由的执行

启动过程 3 ☆ $ns duplex-link $n0 $n1 1Mb 10ms DropTail #tcl/lib/ns-lib.tcl Simulator instproc duplex-link { n1 n2 bw delay type args } { $self instvar link_ set i1 [$n1 id] set i2 [$n2 id] if [info exists link_($i1:$i2)] { $self remove-nam-linkconfig $i1 $i2 } eval $self simplex-link $n1 $n2 $bw $delay $type $args eval $self simplex-link $n2 $n1 $bw $delay $type $args # Modified by GFR for nix-vector routing if { [Simulator set nix-routing] } { # Inform nodes of neighbors $n1 set-neighbor [$n2 id] $n2 set-neighbor [$n1 id] }

dbg1.33> $ns duplex-link $n1 $n2 1Mb 10ms DropTail dbg1.34> _o17 info class Queue/DropTail dbg1.35> _o18 info class SimpleLink dbg1.36> _o19 info class Connector dbg1.37> _o20 info class Connector dbg1.38> _o21 info class DelayLink dbg1.39> _o22 info class TTLChecker dbg1.40> _o23 info class Queue/DropTail

dbg1.41> _o24 info class SimpleLink dbg1.42> _o25 info class Connector dbg1.43> _o26 info class Connector dbg1.44> _o27 info class DelayLink dbg1.45> _o27 info class DelayLink dbg1.46> _o28 info class TTLChecker dbg1.47> _o29 info class invalid command name "_o29" while executing "_o29 info class" dbg1.48>

启动过程 4 set tcp [new Agent/TCP] set snk [new Agent/TCPSink] 在 tcl/lib/ns-agent.tcl 中 Agent/TCP instproc init {} { eval $self next set ns [Simulator instance] $ns create-eventtrace Event $self } Class Agent/Null -superclass Agent Agent/Null instproc init args { eval $self next $args }

dbg1.55> set tcp [new Agent/TCP] _o29 dbg1.56> _o29 info class Agent/TCP dbg1.57> _o30 info class invalid command name "_o30" while executing "_o30 info class" dbg1.58> set nul [new Agent/TCPSink] _o30 dbg1.59> _o30 info class Agent/TCPSink dbg1.60> _o31 info class invalid command name "_o31" while executing "_o31 info class" dbg1.61>

启动过程 5 set ftp [new Application/FTP] 没有相关代码,说明都使用默认情况:简单 new 一个对象而已 dbg1.61> set ftp [new Application/FTP] _o31 dbg1.62> _o31 info class Application/FTP dbg1.63> _o32 info class invalid command name "_o32" while executing "_o32 info class" dbg1.64>

启动过程 6 ☆ $ns attach-agent $n0 $tcp $ns attach-agent $n1 $snk 这一步非常重要,也非常复杂。因为这一步完成 了 – 路由模块的加载 –Agent 和 node 的连接 #tcl/lib/ns-lib.tcl Simulator instproc attach-agent { node agent } { $node attach $agent …… } % _o33 info class Classifier/Port % _o32 info class Classifier/Port % _o34 info class invalid command name "_o34" 这两步创建了 两个对象

#tcl/lib/ns-node.tcl Node instproc attach { agent { port "" } } { $self instvar agents_ address_ dmux_ lappend agents_ $agent $agent set node_ $self $agent set agent_addr_ [AddrParams addr2id $address_] if { $dmux_ == “” } {# 会进入这里,因为还没有给 dmux 赋过值 # Use the default mask_ and port_ values set dmux_ [new Classifier/Port] # point the node's routing entry to itself # at the port demuxer (if there is one) $self add-route $address_ $dmux_# 把到自己的路由加入进去 } if { $port == “” } {# 会进入,因为一般不指定端口 set port [$dmux_ alloc-port [[Simulator instance] nullagent]] } $agent set agent_port_ $port $self add-target $agent $port } 把该 agent 加到 node 的 agent 列表 插叙: Ns 的 IP 地址 >> //classifier/classifier.cc if (strcmp(argv[1],"alloc-port") == 0) { int slot; NsObject* nullagent = (NsObject*)TclObject::lookup(argv[2]); slot = getnxt(nullagent); tcl.resultf("%u",slot); return(TCL_OK); } 就像维护序列号 一样,分配的 port 都是在它的 port 的 基础上加 1 不清楚具体操作 Node instproc add-target { agent port } { $self instvar ptnotif_ foreach m [$self set ptnotif_] { $m attach $agent $port } Ptnodif_ 是路由模块组成 的数组。这里通过 attach 把 agent 加入到每个路由模 块的路由表。是否应该是 dmux_ 的映射表? RtModule instproc attach { agent port } { $agent target [[$self node] entry] [[$self node] demux] install $port $agent }

RtModule instproc add-route { dst target } { $self instvar next_rtm_ [$self set classifier_] install $dst $target if {$next_rtm_ != ""} { $next_rtm_ add-route $dst $target }} Node instproc add-route { dst target } { $self instvar rtnotif_ if {$rtnotif_ != ""} { $rtnotif_ add-route $dst $target } $self incr-rtgtable-size } Classifier instproc install {slot val} { $self set slots_($slot) $val $self cmd install $slot $val } 进入 classifier 的 c++ 代码 有两个变量要引起注意: rtnotif_ 和前面提到的 ptnotif_ ;我觉得 rtnotif_ 是路由模块, ptnotif_ 是端口映射模块。有相关函数 ( 类似 route- notify 函数 )port-notify ,但没有看到调用的地方 ( 在 RtModule 的 register 函数中调用了,也就是 说在路由模块既负责寻路又负责端口的对应, 后者只是一个虚名,还是由 Classifier/Port 自 己完成的 ) 。 xxx-notify 函数就是把 路由模块对象加入到 相应的数组中,即 ptnotif_ 和 rtnotif_

Node RtModule/Base Classifier/Hash/Dest mod_assoc_(classifier_) classifier_ entry_ 红色是 Node 的 变量 表示对象之间的联系纽带数据包的传输 Classifier/Port dmux_ Agent

启动过程 7 $ftp attach-agent $tcp 很简单,不创建对象,直接进入 c++ 代码 把 ftp 和 tcp 连接起来 – 把 c++ 的 tcp 对象的 app_ 变量赋为 ftp 的 c++ 对象 – 把 c++ 的 ftp 对象的 agent_ 变量赋为 tcp 的 c++ 对 象

启动过程 8 $ns connect $tcp $snk 不创建对象 Simulator instproc connect {src dst} { $self simplex-connect $src $dst $self simplex-connect $dst $src return $src } % $ns connect $tcp $snk _o29 % _o29 info class Agent/TCP Simulator instproc simplex-connect { src dst } { $src set dst_addr_ [$dst set agent_addr_] $src set dst_port_ [$dst set agent_port_] return $src }

启动过程 9 $ns at 0.1 "$ftp start“ $ns at 5.0 “exit 0“ $ns run Simulator instproc at args { $self instvar scheduler_ return [eval $scheduler_ at $args] } % $ns at 0.1 "$ftp start" 1 % % $ns at 10.0 "exit 0" 2 % 进入 scheduler.cc

_o1 _o3 _o2 _o4 _o5 _o6 _o7 _o8 _o9 _o10 _o11 _o14 _o12 _o13 _o15 _o16 _o17_o18 _o19_o20 _o21_o22 RNG Import Simulator PacketHeaderManager Scheduler/Calender Agent/Null AllocAddrBits AllocAddr Address Node RtModule/Base Classifier/Hash/Dest Node Classifier/Hash/Dest RtModule/Base _o28 _o27 _o26_o25 _o24_o23 Queue/DropTail Connector SimpleLink DelayLink TTL_Checker Connector Queue/DropTail Connector SimpleLink DelayLink TTL_Checker Connector _o29_o31 _o30 Agent/TCPApplication/FTP Agent/TCPSink _o32 Classifier/Port _o33 Classifier/Port

Agent/TCP Agent SplitObject TclObject Agent TcpAgent Agent/TCP 的实例 new Agent/TCP 全局函数 new{} 对应类的 create{} ,分 配内存。该函数不可 见,是二进制的 对应类的 init{} 基类的 init{} ,最终调用 SplitObject 的 init{} $self create-shadow $args ,进入 c++ 代码. 。 TclClass 虚函数 TclClass::create 对应 c++ 对象自己 的 create 函数 TcpAgent 的实例

TclObject NsObject Agent RoutLogicParentNode Node Connector TcpAgent LinkDelay Classifier Queue DestHashClassifier AddressClassifierPortClassifier HashClassifier REDDropTail Process Application Application/FTP 每个 c++ 类都对应一个 OTcl 类。 并且 OTcl 还为一些联系紧密的 c++ 类构造一个 OTcl 类 ( 那些显式 出现了 Class xxx –superclass xxx) ,例如 Link 只有 OTcl 类, 因为太简单