Simulacijski modeli mrežnih aplikacija kao generatora prometa - GASERI


U ovom poglavlju koristit ćemo jednostavan model stvarnog ponašanja mrežnih aplikacija koji je poznat pod nazivom on-off aplikacija. Uočimo da većina mrežnih aplikacija radi tako da određeni vremenski period šalje podatke, a onda određeni v...



Onion Details



Page Clicks: 0

First Seen: 03/15/2024

Last Indexed: 10/23/2024

Domain Index Total: 397



Onion Content



Preskoči na sadržaj Simulacijski modeli mrežnih aplikacija kao generatora prometa U ovom poglavlju koristit ćemo jednostavan model stvarnog ponašanja mrežnih aplikacija koji je poznat pod nazivom on-off aplikacija. Uočimo da većina mrežnih aplikacija radi tako da određeni vremenski period šalje podatke, a onda određeni vremenski period miruje. Primjerice, aplikacija pregledavanje web stranica kao što je Firefox može učitati web stranicu ( on period), a zatim "mirovati" (barem što se mrežnog prometa tiče) dok korisnik pregledava web stranicu ( off period). Ti periodi zatim alterniraju, a njihova vremena trajanja mogu varirati slučajno ili prema nekom pravilu. Stvarne aplikacije koje rade po ovom pravilu mogu koristiti UDP ili TCP. User Datagram Protocol (UDP) nije pouzdan te se stoga koristi u onim prijenosima u kojima nije od presudne važnosti primiti svaki pojedini paket. Pakete koje UDP šalje nazivamo datagramima. U zaglavlju sadrže sve informacije potrebne da paket bude dostavljen procesu na odredištu, ali pritom ne postoji mehanizam kojim se potvrđuje primitak već je taj dio ostavljen višim slojevima za implementaciju u slučaju da ga trebaju. UDP koristi mehanizam slanja koji ne uspostavlja konekciju niti provjerava prije slanja je li odredišni čvor aktivan. Prvenstvena namjena UDP-a je osigurati što brži prijenos uz eventualnu nepouzdanost samog prijenosa. UDP podržava načine slanja multicast i broadcast; ovaj prvi koristi se, primjerice, kod emitranja televizije putem Interneta. Transmission Control Protocol (TCP) ostvaruje pouzdan prijenos sadržaja time što se potvrđuje primitak samo onih segmenata koji su stigli na odredište u ispravnom stanju. Drugim riječima, ne potvrđuje primitak paketa koji su na putu iskrivljeni (ili izgubljeni) te se time zahtjeva da se ti segmenti ponovno pošalju. TCP time ispravlja greške nastale u prijenosu. U slučaju da je paket uspješno primljen šalje se potvrda (acknowledgment, kraće ACK) pošiljatelju paketa koji tada pouzdano zna da je sadržaj koji je poslao uspješno primljen točno u tom obliku u kojem je poslan. Ovaj protokol koristi se za sve prijenose u kojima je od presudne važnosti da poslana poruka stigne u cijelosti i točno takva kakva je poslana na odredište. Pouzdan prijenos nužan je primjerice za slanje e-maila, preuzimanje sadržaja sa web stranica, rad na udaljenom računalu, preuzimanje datoteka i slično. Bitno je naglasiti da neki od prijenosa podataka koriste vlastite protokole viših slojeva za preciznije definiranje prijenosa i načina prikaza sadržaja, kao što su primjerice HTTP (za web stranice) ili SMTP (za e-mail), no to ne mijenja činjenicu da se na nižem sloju prijenos odvija TCP-om. Klasa OnOffApplication koja je dio simulatora ns-3 može se koristiti UDP ili TCP kao protokol transportnog sloja. Za određivanje trajanja on i off perioda on-off aplikacije koriste se slučajne varijable. U području teorije vjerojatnosti jedan od osnovnih pojmova je slučajna varijabla. Kako u trenutnom studijskom programu kolegij Vjerojatnost i statistika slijedi nakon Računalnih mreža, ovdje ćemo definirati i koristiti slučajne varijable na vrlo ograničen način dovoljan za naše potrebe. Možemo reći da je slučajna varijabla ona varijabla čija vrijednost ovisi o slučajnosti. Ono što određuje vrste slučajnih varijabli je učestalost pojavljivanja određenih brojeva. Ograničit ćemo se na korištenje dvije najjednostavnije vrste slučajnih varijabli, konkretno: ConstantRandomVariable , koja vraća uvijek isti "slučajan" broj (ima atribut Constant kojim se taj broj postavlja), UniformRandomVariable , koja vraća slučajan broj iz zadanog intervala tako da se u prosjeku svi brojevi iz tog intervala pojavljuju podjednako često (ima atribute Min i Max kojim se ograničava interval). UDP on-off aplikacija Ponovno ćemo analizirati kod liniju po liniju. Zaglavlja #include #include #include #include #include using namespace ns3 ; identična su kao u prethodnom primjeru. S druge strane, uočimo da su linije LogComponentEnable ( "OnOffApplication" , LOG_LEVEL_INFO ); LogComponentEnable ( "PacketSink" , LOG_LEVEL_INFO ); različite; naime, kako ćemo ovdje koristiti on-off aplikaciju i odvod za pakete umjesto UDP echo klijenta i poslužitelja, linije su promijenjene te uključujemo loging za OnOffApplication te PacketSink . Općenito, ovaj mehanizam služi da bi ispisivao poruke određenih komponenata simulatora ns-3; kada bi ns-3 ispisivao sve poruke koje simulacija stvara, čak i najjednostavnija simulacija imala bi izlaz reda veličine nekoliko tisuća redova. Stvaramo jednostavnu topologiju kao i ranije. NodeContainer nodes ; nodes . Create ( 2 ); PointToPointHelper pointToPoint ; pointToPoint . SetDeviceAttribute ( "DataRate" , StringValue ( "5Mbps" )); pointToPoint . SetChannelAttribute ( "Delay" , StringValue ( "2ms" )); NetDeviceContainer devices ; devices = pointToPoint . Install ( nodes ); InternetStackHelper stack ; stack . Install ( nodes ); Ipv4AddressHelper address ; address . SetBase ( "10.1.1.0" , "255.255.255.0" ); Ipv4InterfaceContainer interfaces ; interfaces = address . Assign ( devices ); PacketSinkHelper je pomoćnik koji stvara "odvod" (engl. sink) za pakete, odnosno stvara aplikaciju koja će primati pakete i biti svojevrsni "poslužitelj" za "klijentsku" on-off aplikaciju. Za razliku od poslužiteljske aplikacije, odvod neće slati nikakav odgovor on-off aplikaciji već će sve što stigne na odgovarajuću adresu i vrata biti odbačeno ("pušteno u odvod"). PacketSinkHelper imena sink kod stvaranja prima 2 parametra; prvi parametar je znakovni niz, u ovom slučaju "ns3::UdpSocketFactory", koji označava protokol koji on-off aplikacija koristi. Preciznije, definira na koji će način biti stvorena mrežna utičnica (engl. network socket ) te aplikacije, odnosno koja će se "tvornica" koristiti (odakle i factory u nazivu). Drugi parametar je mrežna adresa na kojoj će paketi biti pušteni u odvod. Obzirom da se očekuje adresa procesa, ona se sastoji od IPv4 adrese i vrata; u ns-3-u je ta kombinacija tip InetSocketAddress . Prvi dio dohvaćamo metodom GetAddress() iz objekta interfaces koji smo ranije kreirali, odnosno dohvaćamo IPv4 adresu drugog čvora, a drugi dio je broj vrata na kojima će aplikacija primati pakete (u našem slučaju je to 9). Nakon toga u kontejner za aplikacije imena apps instaliramo taj odvod, i definiramo vremena početka i kraja rada. Ovdje smo stavili da odvod počinje s radom sekundu prije pripadne on-off aplikacije i završava sekundu nakon da stignu i budu primljeni svi paketi koji su eventualno poslani u posljednjem trenutku. PacketSinkHelper sink ( "ns3::UdpSocketFactory" , InetSocketAddress ( interfaces . GetAddress ( 1 ), 9 )); ApplicationContainer apps = sink . Install ( nodes . Get ( 1 )); apps . Start ( Seconds ( 1.0 )); apps . Stop ( Seconds ( 11.0 )); OnOffHelper je pomoćnik koji služi za stvaranje on-off aplikacije. Kao i PacketSinkHelper prima dva parametra od kojih je prvi protokol, a drugi mrežna adresa tipa InetSocketAddress na koju će aplikacija slati podatke , dakle adresa odredišta. Pomoću metode SetAttribute() kao i do sada postavljamo različite atribute. Atributi koje postavljamo su redom DataRate , odnosno količina prometa u jednici vremena koju aplikacija stvara kada je aktivna, PacketSize , odnosno veličina paketa koju aplikacija stvara izražena u bajtovima, OnTime i OffTime , odnosno trajanje vremena (izraženo u sekundama) u kojem je aplikacija aktivna i trajanje vremena u kojem je neaktivna (respektivno). OnTime i OffTime su atributi koji imaju donekle specifičnu sintaksu, koja ovisi od vrste slučajne varijable koju će on-off aplikacija koristiti. Primjer za ConstantRandomVariable i UniformRandomVariable demonstriramo u nastavku. OnOffHelper onOffApp ( "ns3::UdpSocketFactory" , InetSocketAddress ( interfaces . GetAddress ( 1 ), 9 )); onOffApp . SetAttribute ( "DataRate" , StringValue ( "1Mbps" )); onOffApp . SetAttribute ( "PacketSize" , UintegerValue ( 2048 )); onOffApp . SetAttribute ( "OnTime" , StringValue ( "ns3::ConstantRandomVariable[Constant=2.0]" )); onOffApp . SetAttribute ( "OffTime" , StringValue ( "ns3::UniformRandomVariable[Min=1.0|Max=3.0]" )); Dakle, ovim kodom stvorena je aplikacija koja u vremenu kada je aktivna šalje pakete veličine 2048 bajta brzinom 1 Mbit/s. Period aktivnosti traje uvijek točno 2 sekunde, nakon čega slijedi period neaktivnosti koje traje najmanje 1 sekundu, a najviše 3 sekunde. Instalaciju on-off aplikacije vršimo na isti način kao i instalaciju UDP echo aplikacije. ApplicationContainer clientApps = onOffApp . Install ( nodes . Get ( 0 )); clientApps . Start ( Seconds ( 2.0 )); clientApps . Stop ( Seconds ( 10.0 )); Važno je spomenuti da on-off aplikacija nakon početka rada ima prvo period neaktivnosti. Ovo je dovoljno da bi aplikacija radila. Međutim, iskoristit ćemo još jednu metodu objekta tipa PointToPointHelper , a to je EnableAsciiAll() koja čini da se stvaraju tekstualne datoteke koje sadrže izvještaj o paketima u simulaciji. Ta metoda prima niz znakova koji će biti prefiks imena datoteka koje će stvoriti. Važno je da se ova metoda pozove nakon svih poziva Install() metode nad objektom pointToPoint , što je najlakše napraviti tako da pozovete metodu neposredno prije samog pokretanja simulacije sa Simulator::Run() . Time se izbjegava mogućnost nepravovremenog poziva metode koja u tom slučaju neće generirati ništa ili će pak generirati pogrešan izvještaj. Datoteka koju generira ova metoda bit će smještena u direktoriju gdje se događa kompajliranje vašeg programskog koda. U slučaju da ste kao odredište spremanja datoteka projekta odabrali vaš kućni direktorij (u virtualnoj mašini to je /home/student ), a projekt nazvali ga rm2-vj2-primjer1 , direktorij u kojem se nalazi AsciiTracing datoteka zove se rm2-vj2-primjer1-build- . Taj direktorij, sadrži izvršnu datoteku vašeg projekta, datoteke s objektnim kodom ( *.o ) i AsciiTracing datoteke koje imaju prefiks u imenu koji ste zadali. Naravno, pretpostavka je da ste prethodno pokrenuli izvršnu datoteku koja će stvoriti AsciiTracing datoteke (upravo zbog toga što ih stvara izvršna datoteka simulacije AsciiTracing datoteke se i nalaze u tom direktoriju). Imena AsciiTracing datoteka generirana su prema uzorku -X-Y.tr , pri čemu je X je identifikator čvora, a Y identifikator mrežnog sučelja na čvoru. U sadržaju datoteke svaki redak predstavlja jedan paket. Stupci su standardizirani i redom su: Prvi stupac sastoji se od jednog znaka koji označava što se dogodilo sa paketom. Mogućnosti su: r : Receive (primljen) + : Enqueue (dodavanje u red čekanja) - : Dequeue (uklanjanje iz reda čekanja) Drugi stupac je vrijeme u kojem se promatrani događaj nad paketom dogodio i izraženo je u sekundama. Treći stupac je putanja do događaja koji s...