Spaning Tree Protocol-serbian

47

description

a simulation and description of the spaning tree protocol

Transcript of Spaning Tree Protocol-serbian

Elektrotehniki fakultet u Beogradu

Autori:Aleksandar Ponjavi 2010/277Marko dimitrijevi 2010/0137

Simulacija Spaning tree protokolaProjekat iz predmeta: Principi modernih telekomunikacija

Mentor: Milan Bjelica

Beograd, Maj 2013

SaetakU ovom radu se radi simulacija spaning tree protokola, koji rayresava problem petlji izmedju switcheva prilikom njihovog povezivanja. Simulacija je uradjena u programskom jeziku java.Kljune rei: Spanin,tree,java,simulation.

Sadraj

1. Naslovna strana . . . . . . . . . . . . . . . . . . . . . . . . . . . .12. Saetak i kljune rei . . . . . . . . . . . . . . . . . . . . . . . 23.Sadraj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . 34. Tekst rada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45. Slike i tabele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66. Matematiki izrazi . . . . . . . . . . . . . . . . . . . . . . . . 77. Zakljuak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78. Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79. Prilozi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

UvodU ovoj simulaciji cilj nam je bio da simuliramo rad spaning tree protokola na vise svieva povezanih u petlji gde mora doci do iskljuenja nekih linkova. Program je podeljen u 2 logicne celine jednu koja se bavi gui-jem (gui-graphic user interface) tojest koja je zaduena za iscrtavanje svik komponenti koje korisnik vidi, ova komponenta nije logiki neophodna za simulaciju ali je potrebna da bi se nekako ispisali rezultati simulacije. Druga logicka celina je sama simulacija u kojoj je implementiran algoritam spanin tree protokola i koja generise podatke koji se ispisuju korisniku, u nastavku e biti detaljno objanjene ove celine.

Simulacija i nacin rada algoritma:Za svaku fizicku komponentu postoji po jedna klasa u simulaciji koja predstavlja njen ekvivalent, imamo: klasu Switch u kojoj je implementiran algoritam nalazenja Root Switcha, nalazenja Root Porta i nalazenja Designated i NonDesignated portova objasnjenje ovih pojmova ce biti dato kasnije kao i objasnjenje samog SPT algoritma. Svaki Switch poseduje svoje portove preko kojih se povezuje na ostatak sveta i dobija BPDU poruke potrebne za sprovoenje algoritma, switch ima svoje unutrasnje tajmere preko kojih zna koliko vremena provodi u nekom od svojih stanja koja su FORWARDING-stabilno stanje sve je vec definisina i switch samo prosleuje pakete, CONVERGENTION-traze se podaci i ui se topologija mreze switch nije sposoban za rad. Kod za Switch:package spaningtree;

import java.util.ArrayList;

import javax.swing.JTextField;

import dragging.connectable.SwitchPresentation;

public class Switch {// podrazumevane vrednostipublic static final int MAX_PORTS = 4;private final static int HELLO_TIMER = 2;private final static int FORWARDING_TIMER = 15;public final static int AGE_TIMER = 20;public final static int ROOT_TIMER = 2 * FORWARDING_TIMER+AGE_TIMER;// root smanjen za// onoliko// koliko jos// convergetion// radiprivate static int Time;// timeri kojima se broji vreme za odredjene dogadjajeprivate int hello_timer = 0;// private int forwarding_timer=0;// ovo nam ne treba za sadprivate int root_timer = 0;private int convergention_timer = 0;// uslovi dali je aktivan tajmer za odredjen dogadjaj (za hello je uvek// aktivan)private final static boolean hello = true;private boolean forwarding = false;private boolean root = true;private boolean convergention = false;// unutrasnje promenljive switchaprivate String mac;private int priority;private JTextField jtfPrior;private SwitchPresentation parent;public int getPriority() {return priority;}

public void setPriority(int priority) {this.priority = priority;}

private String rootID;private BPDU inBPDU[] = new BPDU[MAX_PORTS], outBPDU;private int pathToRoot=101;private int rootPort=-3;// PortListprivate ArrayList ports;// u svim metodama koje rade sa inBPDU proveravamo da poruka nije null ako// jeste znaci nismo je primili pa nam null samo popunjava mesto da bu bule// istei indeksi portova i pozicija....// takodje ako radimo sa portom proverimo dali je on konektovan na nekoga,// nema svrhe ako nije konektovan, onda je disabled

public Switch( String mac,JTextField jtfPrior, SwitchPresentation tata ) {ports = new ArrayList(MAX_PORTS);parent=tata;

for(int i=0;iports.get(i).getBpdu().pathCost){pathToRoot=ports.get(i).getBpdu().pathCost;rootPort=i;}}}}}String bridgeID = Integer.toHexString(priority) + mac;//nesto obaveznoooif (rootID.equals(bridgeID)) {pathToRoot = 0;rootPort = -1;} else {rootPort = 1;int min = 101; // 100MBPS is the largestfor (int i = 0; i < ports.size(); i++) {if (inBPDU[i] != null) {if (inBPDU[i].rootID.equals(rootID)&& inBPDU[i].pathCost < min) {min = inBPDU[i].pathCost;rootPort = i;//ports.get(rootPort).setType(Port.ROOT);//System.out.println(bridgeID+i);}}}pathToRoot = min;}}*/

public void setRootPorts() {if(rootPort>0 ){ports.get(rootPort).setType(Port.ROOT);}else {for (int i = 0; i < ports.size(); i++){if(ports.get(i).getState()!= Port.DISABLED && ports.get(i).getType()==Port.UNDEFINED )ports.get(i).setType(Port.ROOT);}}}

public void setOtherPorts() {if (rootPort < 0) {for (int i = 0; i < ports.size(); i++)if(ports.get(i).getState()!=Port.DISABLED){ports.get(i).setType(Port.DESIGNATED);}} else {for (int i = 0; i < ports.size(); i++) {if(ports.get(i).getState()!=Port.DISABLED){if (i != rootPort) {// kad prelazimo u konvergenciju TYPE svih// na minus 1!!! :Dif (ports.get(i).getConnectedTo() != null&& ports.get(i).getConnectedTo().getType() == Port.ROOT)ports.get(i).setType(Port.DESIGNATED);else {if (inBPDU[i] != null&& inBPDU[i].pathCost > (pathToRoot+ ports.get(i).getCost())) {ports.get(i).setType(Port.DESIGNATED);//ports.get(i).getConnectedTo().setType(Port.NONDESIGNATED);} else{ports.get(i).setType(Port.NONDESIGNATED);//ports.get(i).getConnectedTo().setType(Port.DESIGNATED);}}}}}}}

public void setPortsStateTo(int t) {// ovo postavlja state od portovafor (int i = 0; i < ports.size(); i++) {if (ports.get(i).getState() != Port.DISABLED) {ports.get(i).setState(t);}}}public int addPort(Port p){if(ports.size()= Switch.AGE_TIMER) {// ako// jesteports.get(i).setNoBPDU(true);// dali da se diskonektuje????????// ports.get(i).disconnect();

// nema poruka sa nekog porta znaci pukla veza znaci ponovo// mora konvergencija mreze..forwarding = false;root = true;convergention = true;setPortsStateTo(Port.LISTENING);setTypeConvergention();}ports.get(i).setLastMessageTime(ports.get(i).getLastMessageTime() + 1);

}}

if (convergention && !root) {// convergetion brojac radi kad root zavrsiconvergention_timer++;//findRootPort();setPortsStateTo(Port.LEARNING);if (convergention_timer == 50) {convergention = false;convergention_timer = 0;forwarding = true;setRootPorts();setOtherPorts();setPortsStateTo(Port.FORWARDING);}}

if (!convergention) {// ako dobijemo poruku koja kaze da treba da ponovo// trazimo root// te poruke ignorisemo ako je convergention (convergetion sigurno// traje duze nego rut)for (int i = 0; i < ports.size(); i++) {if (inBPDU[i] != null) {if (inBPDU[i].find_root_again == true) {// ako neko zatrazi// konvergencijuforwarding = false;root = true;convergention = true;setPortsStateTo(Port.LISTENING);}}}}

if (root) {root_timer++;findRoot();if (root_timer == ROOT_TIMER) {root_timer = 0;//setRootPorts();//setOtherPorts();root = false;// gotov je rut ali sta ako nam i dalje stizu paketi koji su// poslati dok nije bio gotov...// ti paketi treba da se ignorisu neko vreme, zato ostaje// convergetion=true}}

if (forwarding) {// tu mi nista ne radimo :)}

}

public Port getPort(int i) {// vraca port sa indeksom ireturn ports.get(i);}

public Port getFirstFreePort() {// vraca indeks kao int a u p stavlja trazeni// port koji nije konektovanPort p = null;int i;for (i = 0; i < ports.size(); i++) {if (!ports.get(i).busy) {p = ports.get(i);ports.get(i).busy=true;break;}}return p;}

public static int getTime() {return Time;}

public static void setTime(int time) {Time = time;}public String getState(){if(forwarding)return "forwarding".toUpperCase();if(root)return "serching for root".toUpperCase();if(convergention)return "convergention".toUpperCase();return "bad thing";}public String getroot(){return rootID;}

public SwitchPresentation getParent() {return parent;}

public void setParent(SwitchPresentation parent) {this.parent = parent;}public void startConvergention(){forwarding = false;root = true;convergention = true;setPortsStateTo(Port.LISTENING);setTypeConvergention();}public void setTypeConvergention(){for(int i = 0;i