Definicije funkcija za protokole koji slede
#define MAX_PKT 10! "# Odredjuje veli$inu paketa u %ajtovi&a #"
t'pedef unsi(ned int se)_nr* "# redni %roj ili %roj potvrde #"
t'pedef struct +unsi(ned c,ar data-MAX_PKT.*/ packet* "# definicija paketa #"
t'pedef enu& +data0 ack0 nak/ fra&e_kind*
t'pedef struct +
fra&e_kind kind* "# vrsta ovo( okvira#"
se)_nr se)* "# redni %roj #"
se)_nr ack* "# %roj potvrde #"
packet info* "# paket &r1no( sloja #"
/ fra&e*
"# 2ekaj da se ne3to do(odi* upi3i tip do(adjaja u pro&enljivu event#"
void 4ait_for_event5event_t'pe #event6*
"# 7z&i iz &re1no( sloja paket za prenos#"
void fro&_net4ork_la'er5packet #p6*
"# Podatke iz dolazno( okvira isporu$i &re1no& sloju #"
void to_net4ork_la'er5packet #p6*
"# Preuz&i dolazni okvir iz fizi$ko( sloja i kopiraj (a u r #"
void fro&_p,'sical_la'er5fra&e #r6*
"# Prosledi fizi$ko& sloju okvir za slanje #"
void to_p,'sical_la'er5fra&e #s6*
"# Pokreni sat i o&o(u8i do(odjaj ti&eout #"
void start_ti&er5se)_nr k6*
"# 9austavi sat i one&o(u8i do(adjaj ti&eout #"
void stop_ti&er5se)_nr k6*
"# O&o(u8i &re1no& sloju da izazove do(adjaj net4ork_la'er_read' #"
void ena%le_net4ork_la'er5void6*
"# 9a%rani &re1no& sloju da izazove do(adjaj net4ork_la'er_read' #"
void disa%le_net4ork_la'er5void6*
"# Macro inc : cikli$no uve8ava k za jedinicu #"
#define inc5k6 if 5k ; MAX_<=>6 k ? k @ 1* else k ? 0
Protokol 1
neo(rani$en jednos&eran prenos
Pretpostavke:
A
Podaci se prenose sa&o u jedno& s&eru
A
Mre1ni slojevi su uvek spre&ni i na izvori3tu i na
odredi3tu
A
Bre&e o%rade je zane&arljivo
A
Caferi su neo(rani$ene veli$ine
A
Ko&unikacioni kanal ne (u%i okvire
Protokol
jednos&erni protokol Gstani i $ekajG
Pretpostavke:
A
Podaci se prenose sa&o u jedno& s&eru
A
Mre1ni slojevi su uvek spre&ni i na izvori3tu i na
odredi3tu
A
Podaci se o%radjuju ograničenom %rzino&
A
Caferi su ograničenog kapaciteta
A
Ko&unikacioni kanal ne (u%i okvire
9adatak protokola je da spre$i po3iljaoca da zatrpa
pri&aoca podaci&a koje on ne sti1e da o%radi
Protokol H
jednos&erni protokol na %u$ni& kanali&a
A
7koliko se okvir o3teti priliko& slanja0
posla8e&o (a ponovoI
A
Jta se de3ava ako se potvrda o3tetiK
A
Od(ovor: koristiti taj&er i nu&erisati pakete
A
Dovoljno je koristiti jedan %it za nu&erisanje
paketa
#define MAX_<=> 1
t'pedef enu& +fra&e_arrival0 cksu&_err0 ti&eout/
event_t'pe*
#include FprotocolE,F
void senderH5void6
+
se)_nr neLt_fra&e_to_send* "# redni %roj slede8e( okvira koji se 3alje #"
fra&e s*
packet %uffer* "# %afer za pakete koji se 3alju#"
event_t'pe event*
neLt_fra&e_to_send ? 0* "# inicijalizacija %rojeva odlazni, paketa#"
fro&_net4ork_la'er5D%uffer6* "# uz&i prvi paket #"
4,ile 5true6 +
sEinfo ? %uffer* "# napravi okvir za preno3enje#"
sEse) ? neLt_fra&e_to_send* "# unesi redni %roj u okvir#"
to_p,'sical_la'er5Ds6* "# po3alji okvir#"
start_ti&er5sEse)6* "# ako potvrda ne sti(ne na vre&e0 isklju$i se #"
4ait_for_event5Devent6* "# fra&e_arrival0 cksu&_err0 ti&eout #"
if 5event ?? fra&e_arrival6 +
fro&_p,'sical_la'er5Ds6* "# uz&i potvrdu #"
if 5sEack ?? neLt_fra&e_to_send6 +
fro&_net4ork_la'er5D%uffer6* "# uz&i slede8i okvir za slanje#"
inc5neLt_fra&e_to_send6* "# predji na slede8i redni %roj #"
/
/
/
/
Provera rada protokola
kona$ni& auto&ato&
A
<tanja auto&ata ozna$i&o sa <NO (de je
< ? 0 ili 10 okvir koji po3iljalac poku3ava da 3alje
N ? 0 ili 10 okvir koji pri&alac o$ekuje
O ? 00 10 M ili A0 i predstavlja stanje kanala
A
P&a&o 1Q &o(u8i, stanja
A
Risu sva stanja dostupna iz inicijalno(
Provera rada protokola
kona$ni& auto&ato&
A
Kona$ni auto&at za protokol H
Provera rada protokola
kona$ni& auto&ato&
A
Ra osnovu auto&ata ispituje&o
potencijalne (re3ke u definisanju protokola
Re s&e postojati putanja u kojoj po3iljalac dva
puta &enja stanje0 dok pri&alac ostaje u
isto& stanju
Deadlock – postoji podskup dostupni, stanja
iz ko( ne&a prelaza i unutar ko(a nije
&o(u8e napredovanje protokola
Protokol klizni, prozora
A
Dvos&erni prenos podataka
A
Mo(u8e S3lepovanjeG potvrde uz podatke
A
Ru&erisanje paketa od 0 do
A
Po3iljalac 5pri&alac6 u svako& trenutku $uvaja
skup redni, %rojeva okvira koje s&e da po3alje
5pri&i6
A
Beli$ina prozora je o(rani$ena veli$ino& %afera
A
Tranice prozora ne &oraju %iti konstantne
veli$ine
1 2 −
n
Protokol U
tipa Svrati se RG
A
Kada pri&alac do%ije po(re3an okvir ili (a
uop3te ne do%ije0 sve slede8e okvire
od%acuje ne 3alju8i za nji, potvrdu
A
Ovoj strate(iji od(ovara prozoru pir&aoca
veli$ine 1
A
Takodje0 izostavlja&o pretpostavku da
&re1ni sloj uvek i&a spre&an paket za
slanje
"# Potvrda n podrazu&eva n M 10 n M 0 itdE #"
4,ile 5%et4een5ack_eLpected0 rEack0 neLt_fra&e_to_send66 +
"# O%radi 3lepovanu potvrduE #"
n%uffered ? n%uffered M 1* "# u %aferu je jedan okvir &anje #"
stop_ti&er5ack_eLpected6* "# okvir je sti(ao ispravan0 zaustavi taj&er #"
inc5ack_eLpected6* "# suzi prozor po3iljaoca #"
/
%reak*
case cksu&_err: %reak* "# zane&ari neispravne okvire#"
case ti&eout: "# po3alji ponovo sve okvire za koje nije sti(la potvrda #"
neLt_fra&e_to_send ? ack_eLpected* "# po$ni sa ponovni& slanje& odavde #"
for 5i ? 1* i ;? n%uffered* i@@6 +
send_data5neLt_fra&e_to_send0 fra&e_eLpected0 %uffer6*
inc5neLt_fra&e_to_send6* "# pripre&i se da po3alje3 slede8i okvir #"
/
/
if 5n%uffered ; MAX_<=>6
ena%le_net4ork_la'er56*
else
disa%le_net4ork_la'er56*
/
/
<lanje okvira i oporavljanje od
(re3aka kod protokola U
<elektivno ponavljanje
A
Pro%le& kod protokola U je tro3enje veliko( dela
propusno( opse(a kada su (re3ke $esteE
A
Ovde pri&alac %aferuje pristi(le podatke koji se
nalaze unutar predvi[eno( prozoraE
A
Po3iljalac pokre8e taj&er za svaki paket i pri
isteku taj&era 3alje sa&o od(ovaraju8i paketE
A
Dozvoljava &o(u8nost da paketi putuju razli$iti&
putanja&a 5ne sti1u poslati& redosledo&60 a da
i, sloj veze isporu$uje &re1no& sloju
ispravani& redosledo&E
#define MAX_<=> V "# tre%a %iti Wn M 1 #"
#define RN_C7\< 55MAX_<=> @ 16"6
t'pedef enu& +fra&e_arrival0 cksu&_err0 ti&eout0 net4ork_la'er_read'0 ack_ti&eout/
event_t'pe*
#include FprotocolE,F
%oolean no_nak ? true* "# nije poslata nijedna ne(ativna potvrda #"
se)_nr oldest_fra&e ? MAX_<=>@1* "# inicijalna vrednost #"
static void send_fra&e5fra&e_kind fk0 se)_nr fra&e_nr0 se)_nr fra&e_eLpected0 packet
%uffer-.6
+
"# Kreira i 3alje okvir sa podaci&a0 pozitivno& ili ne(ativno& potvrdo&E #"
fra&e s*
sEkind ? fk* "# kind ?? data0 ack0 or nak #"
if 5fk ?? data6 sEinfo ? %uffer-fra&e_nr Y RN_C7\<.*
sEse) ? fra&e_nr* "# P&a s&isla sa&o za okvire sa podaci&a#"
sEack ? 5fra&e_eLpected @ MAX_<=>6 Y 5MAX_<=> @ 16*
if 5fk ?? nak6 no_nak ? false*
to_p,'sical_la'er5Ds6* "# po3alji okvir #"
if 5fk ?? data6 start_ti&er5fra&e_nr Y RN_C7\<6*
stop_ack_ti&er56* "# &o(u8e je 3lepovanje potvrde #"
/
void protocolQ5void6
+
se)_nr ack_eLpected* "# donja (ranica prozora po3iljaoca #"
se)_nr neLt_fra&e_to_send* "# (ornja (ranica prozora po3iljaoca @ 1 #"
se)_nr fra&e_eLpected* "# donja (ranica prozora pri&aoca #"
se)_nr too_far* "# (ornja (ranica prozora pri&aoca @ 1 #"
int i*
fra&e r*
packet out_%uf-RN_C7\<.* "# %aferi za podatke koji se 3alju #"
packet in_%uf-RN_C7\<.* "# %aferi za podatke koji sti1u #"
%oolean arrived-RN_C7\<.* "# %it &apa pristi(li, okvira #"
se)_nr n%uffered* "# koliko se odlazni, %afera trenutno koristi #"
event_t'pe event*
ena%le_net4ork_la'er56*
ack_eLpected ? 0*
neLt_fra&e_to_send ? 0*
fra&e_eLpected ? 0*
too_far ? RN_C7\<*
n%uffered ? 0*
for 5i ? 0* i ; RN_C7\<* i@@6 arrived-i. ? false*
4,ile 5true6 +
4ait_for_event5Devent6*
s4itc,5event6 +
case net4ork_la'er_read': "# pri,vati0 s&esti u &e&oriju i po3alji novi okvir #"
n%uffered ? n%uffered @ 1* "# pro3iri prozor #"
fro&_net4ork_la'er5Dout_%uf-neLt_fra&e_to_send Y RN_C7\<.6*
send_fra&e5data0 neLt_fra&e_to_send0 fra&e_eLpected0 out_%uf6*
inc5neLt_fra&e_to_send6* "# po&eri (ornju (ranicu prozora #"
%reak*
case fra&e_arrival: "# sti(ao je okvir sa podaci&a ili upravlja$ki okvir #"
fro&_p,'sical_la'er5Dr6* "# uz&i dolazni okvir iz fizi$ko( sloja #"
if 5rEkind ?? data6 + "# sti(ao je neo3te8en okvir #"
if 55rEse) I? fra&e_eLpected6 DD no_nak6
send_fra&e5nak0 00 fra&e_eLpected0 out_%uf6*
else start_ack_ti&er56* "# $eka&o odre[eno vre&e za 3lepovanje potvrde #"
if 5%et4een5fra&e_eLpected0 rEse)0 too_far6 DD 5arrived-rEse)YRN_C7\<. ?? false66 +
"# Okviri se &o(u pri&ati %ilo koji& redo& #"
arrived-rEse) Y RN_C7\<. ? true* "# ozna$i od(ovaraju8i %afer kao pun #"
in_%uf-rEse) Y RN_C7\<. ? rEinfo* "# unesi podatke u %afer #"
4,ile 5arrived-fra&e_eLpected Y RN_C7\<.6 +
"# Prosledi okvire i po&eri prozor #"
to_net4ork_la'er5Din_%uf-fra&e_eLpected Y RN_C7\<.6*
no_nak ? true*
arrived-fra&e_eLpected Y RN_C7\<. ? false*
inc5fra&e_eLpected6* "# po&eri donju (ranicu prozora pri&aoca #"
inc5too_far6* "# po&eri (ornju (ranicu prozora pri&aoca #"
start_ack_ti&er56* "# $eka&o da 3lepuje&o potvrdu za prosle[eni okvir #"
/
/
/
if55rEkind??nak6 DD %et4een5ack_eLpected05rEack@16Y5MAX_<=>@160neLt_fra&e_to_send66
send_fra&e5data0 5rEack@16 Y 5MAX_<=> @ 160 fra&e_eLpected0 out_%uf6*
4,ile 5%et4een5ack_eLpected0 rEack0 neLt_fra&e_to_send66 +
n%uffered ? n%uffered M 1*
stop_ti&er5ack_eLpected Y RN_C7\<6*
inc5ack_eLpected6* "# po&eri donju (ranicu prozora po3iljaoca #"
/ %reak*
"# okvir je o3te8en0 po3alji RAK poruku #"
case cksu&_err:
if 5no_nak6 send_fra&e5nak0 00 fra&e_eLpected0 out_%uf6* %reak*
"# Ris&o do%ili potvrdu za najstariji okvir0 3alje&o (a ponovo #"
case ti&eout: send_fra&e5data0 oldest_fra&e0 fra&e_eLpected0 out_%uf6* %reak*
"# Mre1ni sloj ve8 du(o ne&a pakete za slanje0 3alje&o potvrdu %ez podataka #"
case ack_ti&eout: send_fra&e5ack000fra&e_eLpected0 out_%uf6*
/
if 5n%uffered ; RN_C7\<6 ena%le_net4ork_la'er56* else disa%le_net4ork_la'er56*
/
/