经过好几个月的慵懒的生活之后终于又有机会写一些代码啦,这次的领域比较陌生,竟然是网络拓扑发现方向的,那么就在此总结一些大体思路,再粘贴一下核心代码喽,至于其余的封装就不贴了,只贴一下核心算法部分啦~~~
接收这个任务首先拿到的是一堆的数据文件,看着就烦人,要在其中提取我想要的地址转发表?搞笑死掉,神能找得到啊,于是我首先用perl脚本对数据文件进行了简要的处理并且输出到一个文件中,由于地址转发表的相关文件有两种格式(谁知道谁搞的这种东西啊,弄了还不弄成一种格式的)于是写了两套处理脚本如下:
isoFormat.pl
#!/usr/bin/perl -w
my $ip;
my @content;
my $sum = 0;
my %portHash;
my %portStateHash;
my %resultHash;
open RESULTCONTENT,">>result.txt";
while(<>){
$ip = $ARGV;
if($ip =~ /(.+)\.txt/){
$ip = $1;
}
chomp;
if(/^iso\.3\.6\.1\.2\.1\.17\.4\.3\.1\.1\.(.+)\s=\sHex-STRING:\s(.*)/){
chomp;
$content[$sum] = "$_";
$sum++;
}
if(/^iso\.3\.6\.1\.2\.1\.17\.4\.3\.1\.2\.(.+)\s=\sINTEGER:\s(\S*)/){
chomp $2;
$portHash{$1} = $2;
}
if(/^iso\.3\.6\.1\.2\.1\.17\.4\.3\.1\.3\.(.+)\s=\sINTEGER:\s(\S*)/){
chomp $2;
$portStateHash{$1} = "$portHash{$1}"."-$2";
}
}
foreach (@content){
if(/^iso\.3\.6\.1\.2\.1\.17\.4\.3\.1\.1\.(.+)\s=\sHex-STRING:\s(.*)/){
$resultHash{$1} = "$portStateHash{$1}"."-$2";
}
}
foreach(keys %resultHash){
print RESULTCONTENT"$ip"."\-$resultHash{$_}\n";
}
specialFormat.pl
#!/usr/bin/perl -w
my $ip;
my @content;
my $sum = 0;
my %portHash;
my %portStateHash;
my %resultHash;
open RESULTCONTENT,">>result.txt";
while(<>){
$ip = $ARGV;
if($ip =~ /(.+)\.txt/){
$ip = $1;
}
chomp;
if(/^\w+:\sdot1dTpFdbAddress\.(.+)\s\(octet string\)\s(.+)\s?\[.+\]/){
chomp;
$content[$sum] = "$_";
$sum++;
}
if(/^\w+:\sdot1dTpFdbPort\.(.+)\s\(integer\)\s(\w+)/){
chomp $2;
$portHash{$1} = $2;
}
if(/^\w+:\sdot1dTpFdbStatus\.(.+)\s\(integer\)\s\w+\((\w+)\)/){
chomp $2;
$portStateHash{$1} = "$portHash{$1}"."-$2";
}
}
foreach (@content){
if(/^\w+:\sdot1dTpFdbAddress\.(.+)\s\(octet string\)\s(.+)\s?\[.+\]/){
$resultHash{$1} = "$portStateHash{$1}"."-$2";
$resultHash{$1} =~ s/\:/ /g;
}
}
foreach(keys %resultHash){
print RESULTCONTENT"$ip"."\-$resultHash{$_}\n";
}
处理完成后生成了统一格式的文件即:设备ip-端口号-端口状态-转发地址
之后又手动整理了设备mac与ip的对应文件格式为:设备ip - 设备mac地址
对生成好的规范格式的文件进行初始化生成完整的java对象集那么我们的任务便是处理这些对象识别之间的链接关系:核心算法代码如下:
package com.madonglin.finder.manager.imp;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import com.madonglin.finder.cache.SwitchCache;
import com.madonglin.finder.manager.NetDealer;
import com.madonglin.finder.vo.Link;
import com.madonglin.finder.vo.Port;
import com.madonglin.finder.vo.Switch;
public class DownPortNetDealer implements NetDealer {
@Override
public List<Link> workoutNetLinks(String markMac) {
SwitchCache cache = SwitchCache.getSwitchCache();
List<Switch> switches = cache.getSwitchs();
LinkedList<Switch> leafSwitches = new LinkedList<Switch>();
List<Switch> rootSwitches = new ArrayList<Switch>();
List<Link> links = new ArrayList<Link>();
//分析交换机的上下行接口
for(Switch tempSwitch : switches){
for(String key : tempSwitch.getKeys()){
Port tempPort = tempSwitch.getPort(key);
List<String> allMacs = tempPort.getAllMacs();
if(allMacs != null && allMacs.contains(markMac)){
tempSwitch.addUpPort(tempPort);
}else{
tempSwitch.addDownPort(tempPort);
//判断后代节点数
//FIXME 交换域确定影响结果
for(String mac : tempPort.getAllMacs()){
Switch compareSwitch = new Switch("");
compareSwitch.setMac(mac);
if(switches.contains(compareSwitch)){
tempSwitch.addChild();
//为子设备添加祖先信息
int index = switches.indexOf(compareSwitch);
Switch childSwitch = switches.get(index);
childSwitch.addParents(tempSwitch, tempPort);
}
}
}
}
}
//确定叶子节点
for(Switch temp : switches){
if(temp != null && 0 == temp.getChildNum()){
leafSwitches.addLast(temp);
}
if(0 == temp.getParentsKeys().size()){
rootSwitches.add(temp);
}
}
//判断链接关系
while(!leafSwitches.isEmpty()){
Switch tempSwitch = leafSwitches.removeFirst();
if(null != tempSwitch){
Switch fatherSwitch = null;
for(Switch key : tempSwitch.getParentsKeys()){
if(null == fatherSwitch){
fatherSwitch = key;
//FIXME 如果相同呢?
}else if(key.getChildNum() < fatherSwitch.getChildNum()){
fatherSwitch = key;
}
key.delChild();
if(0 == key.getChildNum()){
leafSwitches.addLast(key);
}
}
if(!rootSwitches.contains(tempSwitch)){
Link link = new Link();
link.setSwitchSrc(fatherSwitch.getIp());
link.setSwitchDes(tempSwitch.getIp());
link.setPortNumSrc(tempSwitch.getParentsPort(fatherSwitch).getNum());
link.setPortNumDes(tempSwitch.getUpPort().get(0).getNum());
links.add(link);
}
}
}
return links;
}
}
看个大概意思吧哈哈,经过我测试识别结果还算比较准确的
分享到:
相关推荐
UDWDM-PON(Ultra-Dense Wavelength Division Multiplexing Passive Optical Network)是一种先进的光接入网技术,旨在提升网络带宽、容量以及服务质量,以满足网络游戏等高带宽需求的应用。UDWDM-PON系统主要应用于...
【计算机三级网络技术题库详解】涵盖了广泛的网络技术知识点,包括但不限于QoS保证技术、接入技术特征、网络恢复技术、传输速率、路由器性能指标、交换机配置、网络地址转换(NAT)、IP地址规划与聚合、IPv6地址表示...
22. 高强壮性路由选择:在高可靠性的需求下,通常采用基于流量的路由选择或者随机路由选择,以提高网络的生存性和稳定性。 23. 通信子网组成:主要包括网络节点(如路由器)和通信链路,它们构成了网络的基础架构。...
5. **4端口智能快速以太网板**(SFE4):支持以太网业务接入,实现以太网数据在SDH帧结构中的映射,支持点到点、点到多点等网络形式。 **网络组网模式** 1. **链形网**:适用于线性分布的通信网,提供1+1或1:1线路...
24. **拓扑结构特点**:星型拓扑的中心节点有较高的处理能力,总线拓扑可能不支持实时通信,树型拓扑可以通过分支扩展,网状拓扑结构复杂,但提供了更高的网络冗余和稳定性。 25. **里程碑式计算机网络系统**:...
包括网络的传输速度、复用技术、MAC地址、网络安全、ADSL速率、网络管理、拥塞控制、物理层互连、MAC地址长度、SMTP端口、IP地址分类、WAP组件、ATM信元头长度、数字签名、网络协议的语法、HDLC协议、路由算法、网络...
17. **即插即用设备**:网桥可以实现即插即用,提供网络连接的便利性。 18. **帧中继**:帧中继在建立虚电路时进行路由选择,分组传输时不进行额外的路由选择。 19. **路由选择策略**:泛射路由选择适合高强壮性...
- 自动拓扑发现功能,支持NDP和CDP算法,以及通用拓扑发现算法。 - 用户可自定义网络分区,各分区拓扑具有层次关系,且能相互导入数据。 - 实时展示拓扑状态,动态显示设备状态和链路流量,根据告警阈值触发告警...
4. **虚拟局域网(VLAN)**:VLAN是通过软件划分的逻辑网络,可基于交换机端口、网络层地址、MAC地址或IP广播组来定义,以提高网络管理效率和安全性。 5. **IP地址分类**:A类地址范围1.0.0.1至126.255.255.254,B...
全国自学考试计算机网络原理(2008-2012年)试题及答案汇总,这份资料涵盖了多项...这些知识点涵盖了网络的基本概念、网络协议、数据传输、网络管理、网络安全、网络拓扑等多个方面,是计算机网络原理学习的重要内容。
【全国2008年4月高等教育自学考试计算机网络原理试题及答案】是高等教育自学考试...这些知识点反映了计算机网络原理的核心概念,包括网络层次结构、地址类型、传输速率、路由算法、网络安全、数据传输协议等多个方面。
6. ISO网络管理功能:配置管理负责网络设备的配置和参数调整,例如设置IP地址、端口等。 7. 预防拥塞的分组丢弃策略:在网络层,这种策略常用于避免网络拥堵,通过丢弃某些数据包来控制流量。 8. 物理层互连设备:...
4. **虚拟局域网(VLAN)**:VLAN的组建方法有多种,如根据交换机端口、网络层地址(IP)、MAC地址或者基于IP广播组来划分,以提高网络管理和安全性。 5. **IP地址分类**:A类IP地址范围从1.0.0.1到126.255.255.254...
在ISO建议的网管功能中,对网络拓扑构造及某些网管对象的配置和参数做出调整属于性能管理。这是因为性能管理是ISO网管功能的一部分,负责对网络的性能进行管理和优化。 预防拥塞的分组丢弃策略 预防拥塞的分组丢弃...