Professional Documents
Culture Documents
Protokoli PDF
Protokoli PDF
podataka
Definicije funkcija za protokole koji slede
#define MAX_PKT 1024 /* Odredjuje veličinu paketa u bajtovima */
typedef struct {
frame_kind kind; /* vrsta ovog okvira*/
seq_nr seq; /* redni broj */
seq_nr ack; /* broj potvrde */
packet info; /* paket mržnog sloja */
} frame;
frame_expected = 0;
while (true) {
wait_for_event(&event); /* mogućnosti: frame_arrival,cksum_err */
if (event == frame_arrival) { /* stigao je ispravan okvir */
from_physical_layer(&r); /* uzmi pristigli okvir */
if (r.seq == frame_expected) {
to_network_layer(&r.info); /* prosledi podatke mrežnom sloju */
inc(frame_expected); /* sledeći put očekuj drugi drugi redni broj */
}
s.ack = 1 - frame_expected; /* zabeleži koji je okvir potvrdjen */
to_physical_layer(&s); /* pošalji potvrdu */
}
}
}
Provera rada protokola
konačnim automatom
• Stanja automata označimo sa SRC gde je
S = 0 ili 1, okvir koji pošiljalac pokušava da šalje
R = 0 ili 1, okvir koji primalac očekuje
C = 0, 1, - ili A, i predstavlja stanje kanala
• Imamo 16 mogućih stanja
• Nisu sva stanja dostupna iz inicijalnog
Provera rada protokola
konačnim automatom
• Konačni automat za protokol 3
Provera rada protokola
konačnim automatom
• Na osnovu automata ispitujemo
potencijalne greške u definisanju protokola
Ne sme postojati putanja u kojoj pošiljalac dva
puta menja stanje, dok primalac ostaje u
istom stanju
Deadlock – postoji podskup dostupnih stanja
iz kog nema prelaza i unutar koga nije
moguće napredovanje protokola
Protokol kliznih prozora
• Dvosmerni prenos podataka
• Moguće “šlepovanje” potvrde uz podatke
Numerisanje paketa od 0 do 2 − 1
n
•
• Pošiljalac (primalac) u svakom trenutku čuvaja
skup rednih brojeva okvira koje sme da pošalje
(primi)
• Veličina prozora je ograničena veličinom bafera
• Granice prozora ne moraju biti konstantne
veličine
Protokol 4 - jednobitni protokol kliznih prozora
#define MAX_SEQ 1 while (true) {
typedef enum {frame_arrival, wait_for_event(&event);
cksum_err, timeout} event_type; if (event == frame_arrival) {
#include "protocol.h“ from_physical_layer(&r);
while (true) {
wait_for_event(&event); /* četiri mogućnosti */
switch(event) {
case network_layer_ready: /* mrežni sloj ima paket za slanje */
/* Prihvatanje, memorisanje i slanje novog okvira */
from_network_layer(&buffer[next_frame_to_send]); /* uzmi nov paket */
nbuffered = nbuffered + 1; /* proširi prozor pošiljaoca */
send_data(next_frame_to_send, frame_expected, buffer); /* pošalji okvir */
inc(next_frame_to_send); /* pomeri gornju granicu prozora pošiljaoca */
break;
case timeout: /* pošalji ponovo sve okvire za koje nije stigla potvrda */
next_frame_to_send = ack_expected; /* počni sa ponovnim slanjem odavde */
for (i = 1; i <= nbuffered; i++) {
send_data(next_frame_to_send, frame_expected, buffer);
inc(next_frame_to_send); /* pripremi se da pošalješ sledeći okvir */
}
}
enable_network_layer();
ack_expected = 0;
next_frame_to_send = 0;
frame_expected = 0;
too_far = NR_BUFS;
nbuffered = 0;
for (i = 0; i < NR_BUFS; i++) arrived[i] = false;
while (true) {
wait_for_event(&event);
switch(event) {
/* Mrežni sloj već dugo nema pakete za slanje, šaljemo potvrdu bez podataka */
case ack_timeout: send_frame(ack,0,frame_expected, out_buf);
}