中国开发网: 论坛: 程序员情感CBD: 贴子 169514
C007
SNMP网络自动拓扑发现算法分析,请大家指出不足和待改进的地方啊
主循环控制模块:程序初始化及算法深度控制,到达指定深度后跳出循环;
子网搜索模块:搜索子网内的所有活动主机和路由器;
ICMP模块:处理ECHO请求及应答;判断当前节点ip是否处于活动状态
SNMP模块:处理SNMP相关操作。
搜索的网络需要添加到已发现网络集合。算法中为了避免多次发现同一路由器(因为路由器有多个IP地址),需要遍历路由器的IPList。程序使用的主要算法流程如下:
●子网搜索模块
(1)利用Ping搜索子网内所有的活动IP地址。
(2)利用SNMP区分路由器和普通主机;
(3)针对每一个路由器,下载有关MIB变量(System组,Interfaces组,IP组),对MIB变量分析,分别写入IPList和NetList。
(4)为防止路由器被多次发现,要遍历IPList。
(5)将在(3)中发现的而又没有搜索的网络添加到深度为n+1的临时网络集合中。
●主循环控制模块
(1)从深度为n的临时网络集合中抽取一个子网进行子网搜索(调用子网搜索模块)。
(2)将(1)中搜索的网络添加到已发现网络集合。
(3)重复进行(1)和(2)直到临时网络集合为空。
(4)如果n小于指定深度(n
其中主要过程分为以下两步:
1.初始化一个默认路有器,并将它加入初始队列中,然后读取这个路由器的ipAddrTable表,interface.ifTable.ifEntry表 以及这个路由器的标示IP
2. 广度探索优先探测路由器,直到待访问队列为空。取出路由器队列中的第一个节点,作为当前路由器 并把队列中第一个节点出队 ,读取当前路由器的arp表 ,将获取的ip与mac保存;将这个路由器加入已访问队列,读取这个路由器上的路由表 获得当前路由器所有连接初始ip,获得所有连接初始ip中非直连的路由器的标示ip,判断这些路由器是否已经访问过,如没有则将这些标示ip加入待访问队列中,取这个路由器的ipAddrTable表
以及读取这个路由器的interface.ifTable.ifEntry表,同时获取这个路由器的标示ip; 判断这个路由器是否已在待访问队列或已访问队列中,若存在于其中一个队列,则不加入待访问队列,否则加入待访问队列,将待访问队列出列。
狼牙月,伊人憔悴; ─────────────── ◥◣ ──╮
█ ╭╯
我举杯,饮尽了风雪。 ◢◤ ╰──────
──────────╮
 ───── ——周杰伦《发如雪》 ╰───

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录