kettle 只有一个输入记录期待设置变量并且至少已经收到2个变量._OPNET学习笔记2...

c8a1cf839bd7a805e13ed1cd5c3c07a4.png

1798d8d80980f4bac73f94037ef79c87.png

双击主机网络打开对应的节点模型,从图中可以看到网络的分层:应用层,传输层,网络层,链路层;其中在传输层中我们用到的主要是UDP(对实时性要求比较高),网络层又包括IP封装层(负责把数据包封装成IP包)。接着双击RIP节点可以打开RIP进程模型,同时我们把RIP源码打开学习并分析RIP协议。

4e39b32c1cea4c161f6031e8845c5191.png

2e141ef9af284d54f64e3b8bb58c5ffe.png

在OPNET和VC调试的时候,要是想观察OPNET中定义的变量时,我们必须通过 op_sv_ptr 指针来获取该变量值,比如OPNET中定义的计数器 i;这时在vc调试的时候就必须是op_sv_ptr ->i来观察该值的变化情况。

1.init进程(停留态)(程序4600-4681)

入口:

(1)RIP进程中断初始化

(2)读取路由表,并初始化更新IP路由表变量

当路由表输出输入标志位等于IP_RTE_TABLE_NON_DET时,如果op_ima_sim_attr_exists()返回 OPC_TRUE 则表明该属性存在,然后去执行读取路由表属性的值op_ima_sim_attr_get (OPC_IMA_INTEGER, 某属性,&某变量);;如果路由表属性不存在,将其设置为默认值(未用到路由表)。清楚中断,并重启中断。

出口:

(1)确定中断的详细信息

先获取中断类型状态,如果中断类型在执行的的过程中,获取中断执行代码,初始化仿真日志,初始化状态变量,在没有输入路由表的情况下,确定使用RIP仿真sim_eff_mode = rip_sim_eff_mode_determine ();

转移:可以看到进程模型中有三根转移线,代码中通过状态机进行转移(状态机代码没仔细了解)。

2.output(非停留态)(4685-4738)

入口:

根据RFC 1058第3.5节,输出处理a由以下触发:

(1)定期路由更新,每30秒发送一次到每个相邻网关。定期更新包含整个RIP路由表。

(2)已触发更新。每当更改路由的跳数时,都会触发更新。触发的更新仅包含RIP路由表中最近更改的条目。这些条目设置了路由更改标志。

在输出状态下,会生成并发送定期更新或触发更新。在定期更新的情况下,将安排下一次定期路由更新。这意味着下一个网关是此更新的目标地址的所有路由都包含在消息中,其跳数为无穷大。

程序:先定义一个RIP中断指针,然后确定路由更新的类型:从中断代码中获取更新类型数据,获取当前网络路由,清除中断,然后开始广播邮件:

2f677bd95880af471fb42399db4e2753.png

广播的主要流程是:先获取接口数目信息,然后分别获取获取RIP接口的信息,判断如果该接口属于RIP接口并是启用状态时,获取IP表,当收到一个VRP广播保温时确保那个接口时VRP接口;判断是否触发外部,只有在有一个触发更新或者接口没被定义触发外部时才可以发送更新,首先获取地址排列,然后发送消息给在物理接口和子接口上公布地址的网络,然后给每个网络的子网发送信息,如果启用了网络拆分范围,并且主地址和子网地址位于同一主网络中,则不要将辅助地址作为源地址发送更新;没有启用拆分范围时,发送报文给子网IP地址。到这一步时,所有已触发的更新都已发送,因此需要重置所有更改标志;最后,重置“第一次更新”标志,FIRST_UPDATE = OPC_FALSE;如果已启用触发的扩展,则后续更新将不包含整个路由。

当更新次数为10000时,取消所有挂起的触发更新,如果RIP仿真效率被禁用或者RIP模拟效率已启用,但未超过“更新停止时间”则发送常规更新消息。

3.init_rte_table(非停留态)(4762-4817)

入口:

eeff3d9d47594065b43124d7f325a888.png

初始化RIP路由表:首先获得IP数据包,获取接口信息;如果本地节点时是一个网关时建立RIP路由表:获取一个新路径并把它插入到路由表中,并从IP表中获取它的大小,RIP协议是在IPv4接口上执行的:建立一个RIP路由表,并把IP地址表中所有的网络注册在路由表中并标记每一个有效路径,并读取其他RIP路由器的信息并更新自己的路由表,在解析接口信息时,路由表已经准备就绪,给每个节点信息分配内存;如果是一个网关节点时,在路由表中建立一个接口信息,通过ID号获取节点属性,主机节点没有RIP属性;建立一个路由实例有效数组;接着分别获取IP表上所有的IP可到达的地址,如果没有子接口信息时让这一端口失效,如果有rip运行,获取对应端口属性;接着判断RIP是否在此接口使用(先获取当前进程信息,然后判断当前路由实例指数是否正确);RIP进程未生效时,输出路由表中没有RIP接口;至少有一个端口在路由实例时设置标志位为正确,并确定RIP接口的数目;如果是一个收发接口时,分别设置收发模式,如果这既不是一个接口也不是一个子接口时,从它的接口信息属性中获取RIP参数;接着获取目的网络地址,使能RIP;获取与此接口对应的RIP表;在路由表中加一个新的网络入口地址,再在子网地址添加一个路由入口;得到网络地址范围;获取网络地址,并把子网地址也转换成主网地址;把这个新的入口网络加入路由表;把查找表销毁;把RIP路由表属性记录下来,以便于其他进程获取。

重置中断。

出口:如果在此节点上启用了IPv6,创建一个RIPng子进程。

5.delete(非停留态)(4822-4893)

两个自中断会导致进程进入此状态:(1) 路由超时计时器(2) 垃圾收集计时器。如果垃圾收集器到期,先生成一个仿真日志,然后把相关接口在路由表中删除;如果路由超时计时器到期,delete进程计时器需要重置,传播计划触发更新信息,生成仿真日志。

6.wait(停留态)(4897-5051)

在等待状态下,进程等待四个可能的事件发生:(1)响应的到达(定期或触发的更新);(2)定期更新计时器或已触发更新计时器过期(输出处理);(3)路由计时器的过期时间,可以是特定路由的垃圾收集计时器。进入等待进程时,在事件未结束时需要把路由实例设置为无效值

00e076da7242e5ba2838ffde4874eba6.png

,防止被其他进程意外使用。

出口:获取中断类型和状态;如果当前是个流中断时,分别检测这个包的收发;如果这个包时RIPng包就去唤醒子进程。使节点状态和链路状态当前不做操作;当发生一个错误中断或者重启中断时,如果是当前节点一个RIPng子进程,唤醒此进程,获取这个错误或重启对象的ID号;然后看这个中断是在互连网中还是只是在此节点,如果是在一个双向连接网络中,我们需要检查出错误的连接:在接口表中获取连接链路的对象ID表,获取RIP接口信息,确保这个接口或者它的子接口是RIP协议,并标记出RIP接口,然后把链路状态改变标志位设置为1,标志链路状态发生改变;如果只是此节点的中断,使节点状态改变标志位设置为1,代表节点状态发生改变。

7.ExtRoute(非停留态)(5056-5286)(RIP使用外部路由信息)

首先获取与此中断相关联的ICI;再获取IP的重分布信息;确定在此中断中已经收到的路由数;读取ICI包中IP注册表信息;读取IP路由表中的入口信息;把未用到的路由关闭;RIP事先不知道此网络它从这个协议中获取路径;如果发现一个最优路径,把它加到注册表中;如果分配的路径和RIP路径一致,先取消定时器,当RIP没有未这一目的地分配路径时,IP将忽视这请求,把这一路由删除,并更新路由表;如果这一目的地不能被忽略时,需要更新注册表,把这一信息发送出去;在仿真处于强制模式时,生成一个警告信息,不能完成更新;释放相应内存空间;释放ICI包。

8.import_rte_table(停留态)(5291-5314)

当在仿真时设置import IP Routing Table 时会进入此进程,重启中断,一般是在IP进程中唤醒此进程。

9.node_fail_rec(非停留态)(5320-5354)

a4c942d0332bd1ccbee2b76987ec28c7.png

首先取消垃圾收集计时器;读取所有路由实例的信息,如果失效模式为“Clear Router Table”,更新ODB日志,使RIP进程停止;RIPv2存储子网掩码,RIPv1不存储子网掩码,但是需要获取更新接口和所选掩码的信息。把相关入口从路由和IP表中删除。删除在之前进程中生成的IP地址对象;取消垃圾收集事件;清除RIP路由表。如果实现模式不是“Clear Router Table”,更新ODB日志,使RIP进程停止;取消所有挂起事件。

ce9a9a8dc86fbc641ebafa2c13087acf.png

首先更新ODB日志;获取当前仿真时间;对所有的路由实例进行循环索引,如果失效模式为“Clear Router Table”,获取RIP接口信息和IP接口数据包;在链路连接状态把路由信息记录;在路由表中把这一入口添加进去。当失效模式是“Retain Route Table”,为每个更新完成的路由设置标志位,路由信息更新完成后生成刷新日志,如果RIP触发更新是失效状态,即使节点恢复也不会更新路由;定期更新路由信息。

10.link(非停留态)(5359-5410)

在连接到周围节点的链接失效后调用该函数。首先更新ODB日志;获取路由表中所有的入口,从中找出连接这个失效链路的下一跳,获得子网掩码,把相关的入口从路由表和IP表中删除,销毁之前进程产生的IP地址对象,取消垃圾回收事件,如果不是本地街街口,启用垃圾回收计时器;初始化跳数为无穷大不可达,把入口永久标志位设置为失效,把路由改变标志位设置为启用(当定时器删除这一入口时,节点需要广播这一目的地址不可达)。

连接到周围节点的链接恢复后调用该函数。首先获取这一接口的RIP表,读取RIP接口信息,检查这个接口或者子接口是否为RIP接口,在把这一入口加入路由表之前,要确保连接的所有节点都处于有效状态;更新ODB日志;循环通过这一链路的子接口,并把它们加入到路由表中:首先获取RIP接口信息检查子接口是否启用RIP,从IP接口表中获取相关接口信息,循环通过主要地址和次要地址,获取地址排列信息,得到网络地址,把这一入口设为直连添加到路由表中,并添加到IP表中;如果连接的节点有一个处于关闭,更新显示ODB日志。

11.response(非停留态)(5415-5774)

当收到一个接口更新请求时先获取这一接口和子接口的参数;当不能确定接口信息或者源地址是本地IP地址,又或者这一信息不是520端口发出的时,将忽略这一请求;获取RIP接口信息,确定其中正确连接的路由实例;对不是RIP的接口摧毁此进程,并获取RIP接口的RIP表;初始化触发更新信号为失效;读取这一请求的总字节数,并计算出需要更新的路由数(RIP请求的头部为4字节,其他更新信息为20字节,公式为num=(RIP请求总字节数-4)/20);获取路由信息数据指针;获取路由更新类型;筛选出正确状态的包;检查所有更新路由:获取子网掩码,如果是直连网络忽略路由更新信息,更新路由跳数(更新跳数和之前跳数的最小值);把更新表的源地址设置为下一跳;如果没有找到目的网络的路由,在未定义此目的地址不可达时添加一个新路径;获取目的地址的子网掩码;判断是否这一目的地址存在IP路由表中,如果存在且具有更好的管理距离时更新路由表和IP表;如果存在这一路径,比较是否来自同一网关,不是时更新计数器;如果新的跳数与旧的跳数不一样或者新的跳数低于旧的时,需要更新路由表,如果新的路由跳数是无穷大,需要删除这一路径;或者跳数相同,但来自不同网关时即下一跳不一样时,也需要更新路由表。

12.idle(停留态)(5778-5828)

获取中断类型和状态,如果是一个RIPng包时,唤醒子进程;如果是一个失效或恢复中断并且此节点存在RIPng子进程时,同样唤醒子进程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python tkinter控件_Python3 tkinter基础 Label pack 设置控件在窗体中的位置

? python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 conda : 4.5.11 type setting : Markdown ? 普通布局 code """ Author : 行初心 Date : 18-10-1 Blog : www.cnblogs.com/xingchuxin GitHub : github.com/GratefulHeartCoder ""…

oracle的mins,分钟的英文缩写,10min还是10mins!

请问,分钟的英文缩写是min,小时的英文缩写是h,还是hr?秒的..._知乎[图文]时间分钟的英文缩写是什么minutes 10 minutes意思是十分钟的,比如说路程 10minutes就是十分钟 没有10minutes这种表达[图文]分钟 min【minute】 超过多少分钟就用介词past表示超过 还差几分钟…

postman测试工具,如何对参数使用md5加密

先创建环境变量password,并定义了变量值(例如:123456)访问登录接口通常是post提交登录用户名称和登录密码,且以json格式提交,所以在body-raw-json,填写json串如下图所示: 接着在pre-…

开源java性能分析工具_Java性能监控:您应该知道的5个开源工具

开源java性能分析工具鲜为人知但有用:开源应用程序性能监视的状态 对于任何应用程序来说,最重要的事情之一就是性能。 我们要确保用户获得他们能获得的最佳体验,并想知道我们的应用已启动并正在运行。 这就是为什么我们大多数人至少使用一种…

cmd编译可以通过执行没有结果_Go语言是如何完成编译的

Go语言是一门需要编译才能运行的编程语言,也就说代码在运行之前需要通过编译器生成二进制机器码,随后二进制文件才能在目标机器上运行,如果我们想要了解Go语言的实现原理,理解它的编译过程就是一个没有办法绕过的事情。预备知识想…

如何通过postman测试需要登录授权的接口

思路 请求需要登录授权的接口,就意味着你要传token给接口,所以请求接口(要测试的接口)之前就要先获取token,因为登录成功后服务端才会返回token,而token又设置了时效,所以每次请求接口&#xf…

wordpress linux 目录,快速搭建WordPress(Linux)

作者:彭济环境要求一、配置LAMP(LinuxApacheMysqlPHP)1、安装apachesudo apt-get install apache2 //安装apache2apache2 -v //查看版本网页访问本机ip地址,查看是否安装成功2、安装phpsudo apt-get install php //安装phpphp -v //查看版本sudo apt-get…

atheros蓝牙设备驱动 小米_小米Air 13笔记本黑苹果WiFi蓝牙硬件改装方案二

该方案适合小米笔记本Air 13初代,适合小米笔记本PRO等型号,适合通用的预留有M.2 PCIE通道SSD卡槽的电脑。也是作者极力推荐的终极改造方案。总体方案: 使用笔记本主板上的M.2 nvme通道 SSD硬盘接口进行拓展。使用BCM943602CS专用的M.2[NGFF]转接卡进行改…

python实现局域网攻击_通过python实现DNS欺骗

假设在一个的局域网内有两个人:Bob和Eve。Eve想让Bob访问他创建的恶意网页,这样她就可以通过隐藏性的下载给Bob的计算机上安装恶意软件,或者可能展示一个欺骗性的站点来试图窃取Bob的认证信息。(图片来自以上提供的链接&#xff0…

背景区域为负样本什么意思_词向量-skipgram与负采样

大纲:1. onehot vs 分布式表示2. 分布式表示的全局泛化能力3. how to learn word2vec - intuition4. SkipGram5. SkipGram Negative Sampling6. 评估词向量7. CBOW与SkipGram对比1. onehot vs 分布式表示Onehot表示:V (apple, going, I, home, machine ,learing)ap…

嵌入式linux应用程序实例,嵌入式Linux应用程序访问物理地址的实例

前言  按照Linux分层驱动思想,外设驱动与主机控制器的驱动不相关,主机控制器的驱动不关心外设,而外设驱动也不关心主机,外设访问核心层的通用应用程序接口进行数据传输,主机和外设之间可以进行任意的组合。这样思想要…

线程同步 线程安全_同步装饰器来替换线程安全类

线程同步 线程安全您知道什么是线程安全吗? 如果没有,下面是一个简单的示例。 所有类都必须是线程安全的,对吗? 并不是的。 其中一些必须是线程安全的? 又错了。 我认为它们都不必是线程安全的,而它们都必须…

forge开发_使用Forge,WildFly Swarm和Arquillian开发微服务

forge开发在这篇文章中,我们将看到如何使用WildFly Swarm和Forge开发微服务,以及如何使用Arquillian和Rest Assured对其进行测试。 WildFly Swarm提供了一种创新的方法来打包和运行Java EE应用程序,方法是将它们与足够的服务器运行时一起打包…

zynq+linux固化程序,如何在 Zynq UltraScale+ MPSoC 上实现 Linux UIO 设计

原标题:如何在 Zynq UltraScale MPSoC 上实现 Linux UIO 设计简介作者: Alex He (何晔), 赛灵思高级嵌入式应用工程师这里的 UIO 即 Userspace I/O,本文中 UIO 泛指 UIO 设备和 UIO 驱动。它在 Linux kernel 的世界里比较小众&…

thinkpad笔记本散热风扇_极致的散热体验,ORICO 全铝DIY双风扇笔记本散热垫评测...

电脑的出现,极大的改变了人类的生活。娱乐、办公、游戏、电子竞技等等都需要用到电脑。而电脑也慢慢的在升级着。电脑的体积也由最开始的的占据几间屋子的庞大体积,到后来的台式机、台式一体机、电脑的体积慢慢的变的越来越小。而便携式笔记本电脑的出现…

Web产品的交互说明文档应该怎么写?

经常与开发同学聊天,他们说有一个详细的说明文档可以帮助他们更准确的进行工时评估,还可以帮助他们提高工作效率,减少多余的思考时间。因此在这里分享一些制作交互说明文档的经验。 我先说说说交互原型包含哪些部分? 版本说明及更…

linux类似360软件,linux下有什么类似鲁大师查看电脑配置的软

满意答案drqyna2017.05.26采纳率:40% 等级:11已帮助:5455人linux如何查看系统的硬件配置如何在linux系统下查看系统配置?在图形模式下我们可以很方便的利用Linux的图形工具,点击几下就可以查看到Linux系统的的硬件信…

thinkphp json_原创干货 | Thinkphp序列化合总

听说转发文章会给你带来好运最近Thinkphp几个版本都出了反序列化利用链,这里集结在一起,下面是复现文章,poc会放在最后01Thinkphp5.1.37环境搭建composercreate-project topthink/think5.1.37 v5.1.37poc演示截图调用链单步调试漏洞起点在\th…

笔记本能安装联想智能云教室吗_挑战Jupyter Notebook:云协作、云硬件,上云的Notebook编程环境...

对全世界的 Python 高手而言,Jupyter Notebook 是目前最流行的编程环境,但它也有一些令人难以忍受的缺点。为此,一个位于旧金山的小团队开发了一款名为 Deepnote 的笔记本工具,这是一种云协作、云硬件,上云的 Notebook…

在Linux中su和sudo区别,Linux中su和sudo的用法和区别

目录sudosudo:暂时切换到超级用户模式以执行超级用户权限,提示输入密码时该密码为当前用户的密码,而不是超级账户的密码。缺点是每次执行超级用户权限都要在命令前加上 sudo ,优点是在当前终端再使用 sudo 不要再重复输入密码(只对…