ČVUT Fakulta dopravní v Praze Simulace průchodu paketu prostřednictvím jednoduché sítě VSM (K611) Matyáš Horák 2011/2012
Úvod Trochu se pohybuji, v oblasti počítačových sítí, vybral jsem si tedy simulaci jednoduché sítě s hvězdicovitou strukturou což je v dnešní době nejčastější typ sítě. Simulaci budu provádět pomocí napsaného programu v PHP. Popis systému Modelový příklad je tvořen 4 prvky: - PC1 - PC2 - Switch - Server Prvky jsou mezi sebou propojené prostřednictvím Switche. Switch obsahuje tzv. vyrovnávací paměť ve které udržuje jednotlivé pakety které se nepodařili odeslat na daném portu. V tomto případě obsahuje 3 aktivní porty (13, 23 a 34). Server je brán jako zařízení, který má za úkol řídit pakety resp. Je zpracovat a dále odeslat. Počítač PC1 i PC2 obsahuje službu která komunikuje se serverem. Může se třeba jednat o prostý CHAT po síti řízený serverem. Jeden z počítačů generuje pakety v časovém intervalu s exponenciálním rozdělením. Pokud se paket chce odeslat je nutné zjistit zda není daný spoj využíván jiným zařízením. Pokud ano pak počítač již sám generuje číslo resp. Interval za jak dlouho se pokusí odeslat paket. Tento interval je z normálního rozdělení. Tento krok se opakuje do doby než se podaří paket odeslat. Switch jak jsem již říkal obsahuje CACHE, pokud je CACHE plná a přichází další paket pak je paket automaticky zahozen. V reálné síti zařízení paket posílá znovu do doby než bude správně doručen, platí jen pro protokol TCP. Server pakety negeneruje ale provádí jejich obsluhu a zpracování. Doba obsluhy si troufám tvrdit, že je opět z exponenciálního rozdělení. Na obrázku je vidět celé schéma zapojení. Stránka 2 z 27
Vlastní řešení Jak jsem se již zmínil model jsem psal v jazyce PHP primárně určený k programování dynamických web stránek. Nevýhoda PHP je hlavně v tom že výpočet probíhá na serveru. Je zde toto omezení z hlediska že pokud by se prováděl výpočet na větším počtu cyklů a výpočet by trval déle jak 30sekund mohlo by dojít k zastavení vypočtu na serveru z hlediska bezpečnostního opatření proti zacykleným skriptům. Většina PHP serveru má defaultně nastavené vyčkávací watchdog na 30sekund. Z grafického hlediska jsem použil jsem jednoduchou šablonu do které jsem implementoval PHP kód. Pro generování grafů jsem využil Google char tools který disponuje hned několika varianty vykreslování grafu. Z pohledu rychlosti jsem ve skutečnosti využil jen chart.apis.google.com. Obecně nejvíc času jsem strávil s nastavením grafu aby výsledek správně vykresloval. Vyzkoušel jsem i jiné aplikace pro kreslení grafu ale nebyli příliš vhodné z hlediska omezení vykreslování množství bodů nebo rychlosti vykreslování. Poměrně všechny programy měly problém s vykreslením více jak 800 bodů. Funkční simulace je k dispozici na http://www.ivorechovka.cz/mates/vsm2/index.php Popis aplikace Celý kód je poměrně složitý, nebudu zde tedy popisovat všechny jeho části ale zaměřím se na ty zajímavé a problematické. V první řadě jsem potřeboval vyřešit generování náhodných čísel z exponenciálního rozdělení protože PHP umí generovat čísla jen z normálního rozdělení. Našel jsem že existuje rozšiřující balík pro PHP5 který obsahuje již tyto statistické funkce. Tento balík se mi ale nepovedlo zprovoznit tak jsem vytvořil vlastní funkci generující s exponenciálním rozložením. Správnost funkce jsem si ověřil z grafu pravděpodobnosti. Stránka 3 z 27
Každý paket generuji jako novou třídu obsahující několik parametru pro pozdější analýzu: class packet { var $start_cas; cas yacatek pochodu paketu var $stop_cas; cas konce pochodu paketu var $od; yacatek cesty var $do; cil cesty var $aktivni = 0; zda je jeste aktivni var $provede_akci; cas kdy se hlasi o INT var $pozice; aktualni pozice var $ttl; kolik zbejva do sestreleni var $zpracovano; zda prošel serverem Souborem pravidel jsem pak každý tento paket přesouval z jednotlivých částí sítě. Pomocí příznaků jsem řešil obsazenost jednotlivých tras. V každém jednom ťiku se zjišťuje, zda nějaký paket nežádá obsluhu (var provede_akci). Resp. Se cyklicky prochází seznam packetů. Počet ťiku je dané dobou simulace. Jedna jednotka času je jeden ťik. Stránka 4 z 27
Parametry, které je možno ovlivňovat : - Celková doba běhu programu resp počet ťiku (Délka simulace) - Velikost vyrovnávací paměti CACHE - Střední hodnota exp. Rozdělení odesílání paketu z PC1 - Střední hodnota exp. Rozdělení odesílání paketu z PC2 - Střední hodnota exp. Rozdělení počtu ťiků na zpracování paketu Serverem Analýza výsledků a optimalizace Výsledky jsou poměrně velmi ovlivňované vstupními údaji a to hlavně to jak moc často potřebujeme zpracovávat pakety na serveru. Zase oproti tomu mají jednotlivé spoje mezi prvky omezenou kapacitu využitelnosti. Pro srovnání jsem provedl několik simulací, kde jsem měnil jen jeden parametr. Reference Stránka 5 z 27
Stránka 6 z 27
Varianta vyšší výkon serveru V této simulaci jsem změnil výkonost serveru. Výkon jsem zvětšil 10x ale výsledné doručení paketů se zvedlo jen velmi málo v řádech procent. Stránka 7 z 27
Varianta vetší výkon u jednoho PC V tomto případě je mnohem více odeslaných paketů. Sít je poměrně dost využita je zde také vidět mnohem víc doručených paketů, i když s větším časovým zpožděním. Velikost Cache má velký vliv při výsledném zpracování, bereme v úvahu že packet může být zahozený už i po zpracování a tím ztrácíme minimálně 8 ťiků. Každé nastavení jsou výhodná pro něco jiného a to pokud chceme přenést velká množství dat na úkor zpoždění nebo malé množství dat, ale s malým zpožděním. Dost podstatné je i to jak je daná síť moc vytížená. V modelu se nebere v úvahu více připojených strojů. V takovém případě by docházelo k mnohem větším vytížení a nemožnost přistupovat na síť. Nejvíce vykazující z pohledu využitelnosti sítě mi přišla charakteristika četnost časů průchodu sítí. Pro více cyklů se charakteristika tvářila jako hustota pravděpodobnosti exponenciální rozdělení. Pomocí Excelu jsem provedl test hypotézy na 95% hladině. Hypotéza se nepotvrdila resp. Na 95% hladině se nejedná o exponenciální rozdělení. Stránka 8 z 27
Mezera na grafu mezi 0 a 8 je způsobená tím že paket musí projít síť a minimální hodnota za jakou se dokáže dostat do cíle je 8 ťiků. Závěr Ze začátku jsem se pokoušel vytvořit model v programovacím jazyce FLASH který vypočítává hodnoty na straně stanice resp. U uživatele. Měl jsem zde ale problém řešit některé programové části a simulaci jsem nakonec provedl v PHP. Tento model je velmi zjednodušený neboli v reálném světě se počítačové sítě chovají mnohem záludněji. V této simulaci mě poměrně hodné omezoval samotný jazyk PHP protože jsem si nemohl dovolit delší časy výpočtů které by zde byli potřeba. Zase jako ukázka toho, že se dá simulovat i v jiných prostředích než je například HPSim to je dobrá. Vlastní naprogramování simulace má mnoho dalších výhod a to hlavně tu že programátor není omezen z hlediska možností variabilních parametrů. Nakonec si simulaci dělá podle vlastních potřeb. Použité zdroje 1. https://developers.google.com/chart/ 2. http://php.net/manual/ Stránka 9 z 27
Příloha: Zdrojový kód <?php // path to where you installed the library require './lib/googlechart.php'; require './lib/googlebarchart.php'; require './lib/markers/googlechartshapemarker.php'; require './lib/markers/googlecharttextmarker.php'; //require('./function.php'); if (!$_REQUEST["send"]) { $_REQUEST["delka_simulace"]=800; $_REQUEST["PC1_sth"]=10; $_REQUEST["PC2_sth"]=10; $_REQUEST["S_sth"]=5; $_REQUEST["velikost_cache"]=10;?> <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <meta name="description" content="vsm simulace sit" /> <link rel="stylesheet" type="text/css" href="./styl.css" /> <link rel="stylesheet" type="text/css" href="./form/stylform.css" /> <title>vsm simulace - 1v4</title> <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /> <script type="text/javascript" src="./form/view.js"></script> <script type="text/javascript" src="http://www.google.com/jsapi"></script> <!--[if lt IE 9]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]--> <script language="javascript" type="text/javascript" src="jquery.min.js"></script> <script language="javascript" type="text/javascript" src="jquery.jqplot.min.js"></script> <link rel="stylesheet" type="text/css" href="jquery.jqplot.css" /> </head> <body> <div id="banner"> <h1>vsm - simulace</h1> </div> <div id="content"> <img width="800px" src="./vsmschema.png" /> <h1>vstupní data</h1> <form action="index.php" method="post"> <table> Stránka 10 z 27
<td>délka simulace</td> <td><input type="text" name="delka_simulace" value="<?php echo $_REQUEST["delka_simulace"];?>" /></td> <td> [800]</td> <td>velikost CACHE</td> <td><input type="text" name="velikost_cache" value="<?php echo $_REQUEST["velikost_cache"];?>" /></td> <td> [10]</td> <td>str hodnota EXP r. odesílání datagramů PC-1 </td> <td> <input type="text" name="pc1_sth" value="<?php echo $_REQUEST["PC1_sth"];?>" /></td> <td> [10]</td> <td>str hodnota EXP r. odesílání datagramů PC-2 </td> <td> <input type="text" name="pc2_sth" value="<?php echo $_REQUEST["PC2_sth"];?>" /></td> <td> [10]</td> <td>str hodnota EXP r. zpracování datagramů SERVEREM </td> <td> <input type="text" name="s_sth" value="<?php echo $_REQUEST["S_sth"];?>" /></td> <td> [5]</td> </table> <input type="hidden" name="send" value="1"/> <input type="submit" value="simulovat" /> </form> <?php inicializace if ($_REQUEST["send"]) { $dobasimulace = 800; celkova doba jedne simulace $TTL = 10; //time to live packetu $strhodexpg1 = 5; //stredni hodnota pro EXP generator pro PC1 $strhodexpg2 = 10; //stredni hodnota pro EXP generator pro PC2 $strhodexpgsw = 1; //stredni hodnota zpracovani switchem $strhodexpgsrv = 5; //stredni doba zpracovani na serveru $velikostcache = 10; // velikost pameti switche if ($_REQUEST["delka_simulace"]) $dobasimulace = $_REQUEST["delka_simulace"]; if ($_REQUEST["velikost_cache"]) $velikostcache = $_REQUEST["velikost_cache"]; if ($_REQUEST["PC1_sth"]) $strhodexpg1 = $_REQUEST["PC1_sth"]; if ($_REQUEST["PC2_sth"]) $strhodexpg2 = $_REQUEST["PC2_sth"]; Stránka 11 z 27
if ($_REQUEST["S_sth"]) $strhodexpgsrv = $_REQUEST["S_sth"]; $obsazena13 = 0; obsazenost mezi 1a3 $obsazena23 = 0; obsazenost mezi 2a3 $obsazena34 = 0; obsazenost mezi 3a4 statisticke promene $obsazenost3vcase; $zahozenevcase; $prichodvcasep1; $prichodvcasep2; $prichodvcases; $dobapruchodu; jake jsou doby pruchodu $CetnostPruchodu; cestnost jednotlivzch casu pruchodu $vyuzititrasy13; $vyuzititrasy23; $vyuzititrasy34; ZACATEK PC1 obsahuje prvni paket $packetr[] = new packet(1,2,1,expgenerator($strhodexpg1),$ttl); PC2 obsahuje prvni paket $packetr[] = new packet(2,1,2,expgenerator($strhodexpg2),$ttl); zacatek behu cas simulace for ($cas = 0; $cas < $dobasimulace ;$cas++) { $celkem_zahodit = 0; budu citat kolik zahozenych $celkem_prichodp1 = 0; budu citat kolik prisel do P1 $celkem_prichodp2 = 0; budu citat kolik prisel do P2 $celkem_prichods = 0; budu citat kolik prisel do S $vyuzititrasy13[]=$obsazena13; $vyuzititrasy23[]=$obsazena23; $vyuzititrasy34[]=$obsazena34; Obsazenost3vCase(); jak moc je obsazeny SW foreach ($packetr as $OPacket) { //obsluhuji vsechnz packety postupne if ($OPacket->aktivni && ($OPacket->provede_akci == $cas)) { //zjistuji zda je paket aktivni a zda bude neco delat //echo "ted by neco chtel delat <br />"; if ($OPacket->pozice == 1) { //vychazi z pozice 1 if ($obsazena13) Vyckava($OPacket); //cesta 13 je obsazena else Posunz1na13($OPacket); //cesta 13 je volna elseif (($OPacket->pozice == 13) && ($OPacket->zpracovano == 0)) { //vychazi z pozice 13 $obsazena13 = 0; //uvolnil jsem cestu if (!plnacache()) Posunz13na3($OPacket); //prazdna cache muze presouvat else { $OPacket->aktivni = 0; //zabit switchem ma plnou cache $celkem_zahodit++; elseif (($OPacket->pozice == 13) && ($OPacket->zpracovano == 1)) { //vychazi z pozice 13 $obsazena13 = 0; //uvolnil jsem cestu Stránka 12 z 27
$celkem_prichodp1++; statistiky prichozi Posunz13na1($OPacket); elseif (($OPacket->pozice == 3) && ($OPacket->zpracovano == 0)) { //packety ktere jeste nebyli na serveru if ($obsazena34) Vyckava($OPacket); //cesta 34 je obsazena else Posunz3na34($OPacket); //cesta 34 je volna elseif (($OPacket->pozice == 34) && ($OPacket->zpracovano == 0)) { //prichayi na server $obsazena34 = 0; //uvolnuji cestu 34 $celkem_prichods++; prichod do S Posunz34na4($OPacket); elseif ($OPacket->pozice == 4) { //presun na server //odchazi ze server if ($obsazena34) Vyckava($OPacket); //cesta 34 je obsazena else Posunz4na34($OPacket); //cesta 34 je volna elseif (($OPacket->pozice == 34) && ($OPacket->zpracovano == 1)) { //prichayi na switch $obsazena34 = 0; //uvolnuji cestu 34 if (!plnacache()) Posunz34na3($OPacket); //presun na switch jen kdzy praydna cache else { $OPacket->aktivni = 0; //zabit switchem ma plnou cache $celkem_zahodit++; elseif (($OPacket->pozice == 3) && ($OPacket->zpracovano == 1) && ($OPacket->do == 2)) { //packety ktere jeste byli na serveru a jdou do 2 if ($obsazena23) Vyckava($OPacket); //cesta 23 je obsazena else Posunz3na23($OPacket); //cesta 34 je volna elseif (($OPacket->pozice == 3) && ($OPacket->zpracovano == 1) && ($OPacket->do == 1)) { //packety ktere jeste byli na serveru a jdou do 2 if ($obsazena13) Vyckava($OPacket); //cesta 13 je obsazena else Posunz3na13($OPacket); //cesta 13 je volna elseif (($OPacket->pozice == 23) && ($OPacket->zpracovano == 1)) { //prichayi na 2 $obsazena23 = 0; //uvolnuji cestu 23 $celkem_prichodp2++; statistiky prisel do P2 Posunz23na2($OPacket); //presun na server elseif (($OPacket->pozice == 23) && ($OPacket->zpracovano == 0)) { //prichayi na 3 $obsazena23 = 0; //uvolnuji cestu 23 if (!plnacache()) Posunz23na3($OPacket); //presun na switch jen kdzy praydna cache else { $OPacket->aktivni = 0; //zabit switchem ma plnou cache $celkem_zahodit++; elseif (($OPacket->pozice == 2) && ($OPacket->zpracovano == 0)) { //odchazi z 2 if ($obsazena23) Vyckava($OPacket); //cesta 23 je obsazena else Posunz2na23($OPacket); //cesta 23 je volna $zahozenevcase[] = $celkem_zahodit; Stránka 13 z 27
$prichodvcasep1[] = $celkem_prichodp1; $prichodvcasep2[] = $celkem_prichodp2; $prichodvcases[] = $celkem_prichods; konec behu casu simulace ZPRACOVANI DAT ZpracujDobyPruchodu(); Zpracovavam cas pruchodu site ZpracujCetnostPruchodu(); zpracovava jednotlive cestnosti pruchodu PRINT OUT Vysledku?> <h1>výsledky SIMULACE</h1> <table class='sample'> <th>doba Simulace</th> <td><?php echo $dobasimulace;?></td> <th>velikost CACHE</th> <td><?php echo $velikostcache;?></td> <th>celkem vyprodukovaných paketů</th> <td><?php echo CelkemVygenerovanoPacketu();?></td> <th>celkem zahozených - plná cache</th> <td><?php echo CelkemZahozenych();?></td> <th>celkem dorazilo z P1 do P2</th> <td><?php echo CelkemVPC1();?></td> <th>celkem dorazilo z P2 do P1</th> <td><?php echo CelkemVPC2();?></td> <th>zůstalo v zásobníku CACHE (vyřízené/na cestě ke zpracování)</th> <td><?php echo CelkemVcacheReady()." / ".CelkemVcacheNoReady();?></td> <th>celkem dorazilo na server</th> <td><?php echo CelkemPrichozichS();?></td> <th>využití trasy 1-3</th> <td><?php echo VyuzitiTrasy13();?>%</td> <th>využití trasy 2-3</th> <td><?php echo VyuzitiTrasy23();?>%</td> Stránka 14 z 27
<th>využití trasy 3-4</th> <td><?php echo VyuzitiTrasy34();?>%</td> </table> <h2>grafické výstupy</h2> <h3>průchod sítí</h3> <?php $datagrafcetnostpruchodu = UpravDataProGraf2($CetnostPruchodu); echo "<img src='http://chart.apis.google.com/chart?chxr=0,0,".max($cetnostpruchodu)." 1,0,200 &chxt=y,x &chxp=1,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200 &chbh=a,0,0 &chs=800x220 &cht=bvg &chco=4d89f9 &chds=0,".max($cetnostpruchodu)." &chd=t:".$datagrafcetnostpruchodu." &chtt=četnost+časů+průchodu+sítí' width='800' height='220' alt='vertical bar chart' />";?> <h4>popisná statistika</h4> <table> <td>průměrná hodnota</td> <td> <?php echo mmmr($dobapruchodu,mean);?></td> <td>střední hodnota</td> <td> <?php echo mmmr($dobapruchodu,median);?></td> <td>modus</td> <td> <?php echo mmmr($dobapruchodu,mode);?></td> <td>rozsah</td> <td> <?php echo mmmr($dobapruchodu,range);?></td> </table> <h3>využití CACHE</h3> <?php $outler2 = UpravDataProGraf2($obsazenost3vcase); $pocet_prvku =count($obsazenost3vcase); if ($pocet_prvku > 800) $pocet_prvku = 800; echo "<img src='http://chart.apis.google.com/chart?chxt=y,x &chxr=0,0,".max($obsazenost3vcase)." 1,0,".$pocet_prvku." &chxp=1,0,100,200,300,400,500,600,700,800 &chbh=a,0,0 Stránka 15 z 27
&chds=0,".max($obsazenost3vcase)." &chs=800x225 &cht=bvg &chco=a2c180 &chd=t:".$outler2." &chtt=využití+cache' width='800' height='225' alt='vertical bar chart' />";?> <h3>příchody na P1</h3> <?php $outler2 = UpravDataProGraf2($prichodVcaseP1); $pocet_prvku =count($prichodvcasep1); if ($pocet_prvku > 800) $pocet_prvku = 800; echo "<img src='http://chart.apis.google.com/chart?chxt=y,x &chxr=0,0,".max($prichodvcasep1)." 1,0,".$pocet_prvku." &chxp=1,0,100,200,300,400,500,600,700,800 &chbh=a,0,0 &chds=0,".max($prichodvcasep1)." &chs=800x225 &cht=bvg &chco=a2c180 &chd=t:".$outler2." &chtt=příchody+na+p1' width='800' height='225' alt='vertical bar chart' />";?> <h3>příchody na P2</h3> <?php $outler2 = UpravDataProGraf2($prichodVcaseP2); $pocet_prvku =count($prichodvcasep2); if ($pocet_prvku > 800) $pocet_prvku = 800; echo "<img src='http://chart.apis.google.com/chart?chxt=y,x &chxr=0,0,".max($prichodvcasep2)." 1,0,".$pocet_prvku." &chxp=1,0,100,200,300,400,500,600,700,800 &chbh=a,0,0 &chds=0,".max($prichodvcasep2)." &chs=800x225 &cht=bvg &chco=a2c180 &chd=t:".$outler2." &chtt=příchody+na+p2' width='800' height='225' alt='vertical bar chart' />";?> <h3>příchody na Server</h3> <?php $outler2 = UpravDataProGraf2($prichodVcaseS); $pocet_prvku =count($prichodvcases); if ($pocet_prvku > 800) $pocet_prvku = 800; Stránka 16 z 27
echo "<img src='http://chart.apis.google.com/chart?chxt=y,x &chxr=0,0,".max($prichodvcases)." 1,0,".$pocet_prvku." &chxp=1,0,100,200,300,400,500,600,700,800 &chbh=a,0,0 &chds=0,".max($prichodvcases)." &chs=800x225 &cht=bvg &chco=a2c180 &chd=t:".$outler2." &chtt=příchody+na+server' width='800' height='225' alt='vertical bar chart' />"; //konec casti kdyz odeslan formular?> </div> <footer>php 5.3.6-pl1-gentoo Server Apache/2.2.17 VSM sim 1.4 Matyáš Horák 2012/05</footer> </body> </html> <?php Funkce @version $Id$ @copyright 2012 class packet { var $start_cas; cas yacatek pochodu paketu var $stop_cas; cas konce pochodu paketu var $od; yacatek cesty var $do; cil cesty var $aktivni = 0; zda je jeste aktivni var $provede_akci; cas kdy se hlasi o INT var $pozice; aktualni pozice var $ttl; Stránka 17 z 27
kolik zbejva do sestreleni var $zpracovano; kolik zbejva do sestreleni konstruktor function packet($od, $do, $pozice, $provede_akci, $ttl){ $this->od = $od; $this->do = $do; $this->pozice = $pozice; $this->provede_akci = $provede_akci; $this->ttl = $ttl; $this->aktivni = 1; $this->zpracovano = 0; generovani normalniho rozdeleni function unformrandom(){ $x = rand(0,100000000)/100000000; //if (rand(0,2) == 0) return $x; return $x; function unformrandomb(){ $x = intval( ceil(10 rand(0,100000000)/100000000)); //if (rand(0,2) == 0) return $x; return $x; vyckavaci funce function Vyckava($packet){ $packet->provede_akci += unformrandomb(); generovani exp rozdeleni function expgenerator($expstrednihodnota){ $lambda = 1/$expStredniHodnota; return intval( ceil(-log(1.0 - unformrandom()) / $lambda)); posun paketu z 1 na 13 function Posunz1na13($packet){ global $obsazena13; global $packetr; global $TTL; global $strhodexpg1; global $cas; $obsazena13 = 1; //obsadil jsem cestu Stránka 18 z 27
$packetr[] = new packet(1,2,1,$cas + expgenerator($strhodexpg1),$ttl); //PC1 obsadi novy cekaci paket $packet->pozice = 13; //meni pozici $packet->provede_akci += 2; //cas ktery stravi na ceste $packet->start_cas = $cas; //cas kdy je na ceste zjistuju jestli je plna ci prazdna cache function plnacache(){ global $packetr; global $velikostcache; $celkemvcache = 0; foreach ($packetr as $OPacket) { if ($OPacket->pozice == 3) { $celkemvcache++; if ($celkemvcache < $velikostcache) return 0; else return 1; posun paketu z 13 na 3 function Posunz13na3($OPacket){ global $TTL; global $strhodexpgsw; //stredni hodnota sw zpracovani $OPacket->pozice = 3; //meni pozici $OPacket->provede_akci += expgenerator($strhodexpgsw); //cas ktery stravi na 3 Posunz 3 na 34 @param mixed $OPacket @return function Posunz3na34($OPacket) { global $obsazena34; global $TTL; $obsazena34 = 1; //obsadil jsem cestu $OPacket->pozice = 34; //meni pozici $OPacket->provede_akci += 1; //cas ktery stravi na ceste Posun z 34 na 4() @param mixed $OPacket @return Stránka 19 z 27
function Posunz34na4($OPacket){ global $TTL; global $strhodexpgsrv; //stredni hodnota server zpracovani $OPacket->pozice = 4; //meni pozici $OPacket->provede_akci += expgenerator($strhodexpgsrv); //cas ktery stravi na 4 Posun z 4 na 34() @param mixed $OPacket @return function Posunz4na34($OPacket){ global $obsazena34; global $TTL; $obsazena34 = 1; //obsadil jsem cestu $OPacket->pozice = 34; //meni pozici $OPacket->provede_akci += 1; //cas ktery stravi na ceste $OPacket->zpracovano = 1; //packet bzl osetren na serveru vraci se zpet Posun z 3 na 23() @param mixed $OPacket @return function Posunz3na23($OPacket){ global $obsazena23; global $TTL; $obsazena23 = 1; //obsadil jsem cestu $OPacket->pozice = 23; //meni pozici $OPacket->provede_akci += 2; //cas ktery stravi na ceste Posun z 34 na 3() @param mixed $OPacket @return function Posunz34na3($OPacket) { global $TTL; global $strhodexpgsw; //stredni hodnota sw zpracovani $OPacket->pozice = 3; //meni pozici $OPacket->provede_akci += expgenerator($strhodexpgsw); //cas ktery stravi na 3 Posun z 23 na 2() @param mixed $OPacket @return function Posunz23na2($OPacket) { global $cas; $OPacket->pozice = 2; //meni pozici $OPacket->stop_cas = $cas; //cas ktery stravi na ceste $OPacket->aktivni = 0; //je v cili Stránka 20 z 27
Posun z 23 na 3() @param mixed $OPacket @return function Posunz23na3($OPacket){ global $TTL; global $strhodexpgsw; //stredni hodnota sw zpracovani $OPacket->pozice = 3; //meni pozici $OPacket->provede_akci += expgenerator($strhodexpgsw); //cas ktery stravi na 3 Posunz 2 na 23() @param mixed $OPacket @return function Posunz2na23($OPacket){ global $obsazena23; global $packetr; global $TTL; global $strhodexpg2; global $cas; $obsazena23 = 1; //obsadil jsem cestu $packetr[] = new packet(2,1,2,$cas + expgenerator($strhodexpg2),$ttl); //PC1 obsadi novy cekaci paket $OPacket->pozice = 23; //meni pozici $OPacket->provede_akci += 2; //cas ktery stravi na ceste $OPacket->start_cas = $cas; //cas kdy je na ceste Posun z 3 na 13() @param mixed $OPacket @return function Posunz3na13($OPacket){ global $obsazena13; global $TTL; $obsazena13 = 1; //obsadil jsem cestu $OPacket->pozice = 13; //meni pozici $OPacket->provede_akci += 2; //cas ktery stravi na ceste Posun z 13 na 1() @param mixed $OPacket @return function Posunz13na1($OPacket){ global $cas; $OPacket->pozice = 1; //meni pozici $OPacket->stop_cas = $cas; //cas ktery stravi na ceste $OPacket->aktivni = 0; //je v cili Stránka 21 z 27
pocet hotovejch v PC1 function CelkemVPC1(){ global $packetr; $celkemvpc1=0; foreach ($packetr as $OPacket) { if (($OPacket->pozice == 1) && ($OPacket->aktivni == 0)) $celkemvpc1 ++; return $celkemvpc1; pocet zahozenych function CelkemZahozenych(){ global $zahozenevcase; $celkem = 0; foreach ($zahozenevcase as $zaho) { $celkem += $zaho; return $celkem; pocet prichozich P1 function CelkemPrichozichP1(){ global $prichodvcasep1; $celkem = 0; foreach ($prichodvcasep1 as $zaho) { $celkem += $zaho; return $celkem; pocet prichozich P2 function CelkemPrichozichP2(){ global $prichodvcasep2; $celkem = 0; foreach ($prichodvcasep2 as $zaho) { $celkem += $zaho; Stránka 22 z 27
return $celkem; pocet prichozich S function CelkemPrichozichS(){ global $prichodvcases; $celkem = 0; foreach ($prichodvcases as $zaho) { $celkem += $zaho; return $celkem; pocet hotovejch v PC2 function CelkemVPC2(){ global $packetr; $celkemvpc2=0; foreach ($packetr as $OPacket) { if (($OPacket->pozice == 2) && ($OPacket->aktivni == 0)) $celkemvpc2++; return $celkemvpc2; pocet v cache hotovejch function CelkemVcacheReady(){ global $packetr; $celkem=0; foreach ($packetr as $OPacket) { if (($OPacket->pozice == 3) && ($OPacket->zpracovano == 1)) $celkem++; return $celkem; pocet v cache nehotovejch function CelkemVcacheNoReady(){ global $packetr; $celkem=0; foreach ($packetr as $OPacket) { if (($OPacket->pozice == 3) && ($OPacket->zpracovano == 0)) $celkem++; Stránka 23 z 27
return $celkem; celekm vzrobenzch packetu function CelkemVygenerovanoPacketu(){ global $packetr; $celkemvpacketu=0; foreach ($packetr as $OPacket) { $celkemvpacketu++; return $celkemvpacketu; Obsazenost 3 v Case() @return function Obsazenost3vCase() { global $obsazenost3vcase; $celkem = CelkemVcacheNoReady() + CelkemVcacheReady(); $obsazenost3vcase[] = $celkem; Vytahuju jake jsou cca doby pruchodu site @return function ZpracujDobyPruchodu() { global $dobapruchodu; global $packetr; foreach ($packetr as $OPacket) { if (($OPacket->pozice == 2) && ($OPacket->aktivni == 0)) $dobapruchodu[] = $OPacket->stop_cas - $OPacket->start_cas ; if (($OPacket->pozice == 1) && ($OPacket->aktivni == 0)) $dobapruchodu[] = $OPacket->stop_cas - $OPacket->start_cas ; Cetnosti pruchodu @return function ZpracujCetnostPruchodu() { global $dobapruchodu; global $CetnostPruchodu; for ($i = 0; $i <= 200; $i++) { $celkem_techto = 0; Stránka 24 z 27
foreach ($dobapruchodu as $Pruchod) { if ($Pruchod == $i) $celkem_techto++; $CetnostPruchodu[] = $celkem_techto; StredniHodnota @return function StredniHodnotaPruchodu() { global $dobapruchodu; $strhodnota=0; $pocet_hodnot = count($dobapruchodu); for ($i = 0; $i <= 200; $i++) { $celkem_techto = 0; foreach ($dobapruchodu as $Pruchod) { if ($Pruchod == $i) $celkem_techto++; $strhodnota+=($celkem_techto/$pocet_hodnot)$i; return $strhodnota; function mmmr($array, $output = 'mean'){ if(!is_array($array)){ return FALSE; else{ switch($output){ case 'mean': $count = count($array); $sum = array_sum($array); $total = $sum / $count; break; case 'median': rsort($array); $middle = round(count($array) / 2); $total = $array[$middle-1]; break; case 'mode': $v = array_count_values($array); arsort($v); foreach($v as $k => $v){$total = $k; break; break; case 'range': sort($array); $sml = $array[0]; rsort($array); $lrg = $array[0]; $total = $lrg - $sml; break; return $total; Stránka 25 z 27
AVG doby pruchodu @return function AVGdobaPruchodu() { global $dobapruchodu; $i=0; $celkem=0; foreach ($dobapruchodu as $Pruchod) { $i++; $celkem +=$Pruchod; return $celkem/$i; UpravDataProGraf() @param mixed $obsazenost3vcase @return "[[1,1], [2,2], [3,3], [4,4]] function UpravDataProGraf($obsazenost3vcase) { $i = 0; $out = ""; foreach ($obsazenost3vcase as $obsazenost) { $i++; $out.= "['".$i."',".$obsazenost."],"; $out.= ""; return $out; UpravDataProGraf() @param mixed $obsazenost3vcase @return "[[1,1], [2,2], [3,3], [4,4]] function UpravDataProGraf2($obsazenost3vcase) { $i = 0; $out = ""; foreach ($obsazenost3vcase as $obsazenost) { $i++; if ($obsazenost == null) $obsazenost = 0; if ($i < 801) $out.= $obsazenost.","; $out.= "0"; return $out; Vyuziti Trasy 13 @return function VyuzitiTrasy13() Stránka 26 z 27
{ global $vyuzititrasy13; global $dobasimulace; $celkem_techto = 0; foreach ($vyuzititrasy13 as $Pruchod) { if ($Pruchod == 1) $celkem_techto++; return ($celkem_techto/$dobasimulace)100; Vyuziti Trasy 23 @return function VyuzitiTrasy23() { global $vyuzititrasy23; global $dobasimulace; $celkem_techto = 0; foreach ($vyuzititrasy23 as $Pruchod) { if ($Pruchod == 1) $celkem_techto++; return ($celkem_techto/$dobasimulace)100; Vyuziti Trasy 34 @return function VyuzitiTrasy34() { global $vyuzititrasy34; global $dobasimulace;?> $celkem_techto = 0; foreach ($vyuzititrasy34 as $Pruchod) { if ($Pruchod == 1) $celkem_techto++; return ($celkem_techto/$dobasimulace)100; Stránka 27 z 27