Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

SIECI KOMPUTEROWE WYKŁAD 4. WARSTWA ŁĄCZA DANYCH PROF. CZESŁAW SMUTNICKI p.216 C-3

Podobne prezentacje


Prezentacja na temat: "SIECI KOMPUTEROWE WYKŁAD 4. WARSTWA ŁĄCZA DANYCH PROF. CZESŁAW SMUTNICKI p.216 C-3"— Zapis prezentacji:

1 SIECI KOMPUTEROWE WYKŁAD 4. WARSTWA ŁĄCZA DANYCH PROF. CZESŁAW SMUTNICKI p.216 C-3 POLITECHNIKA WROCŁAWSKA INSTYTUT INFORMATYKI, AUTOMATYKI I ROBOTYKI

2 RAMKOWANIE Podział strumienia bitów na ramki, przerwy czasowe pomiędzy ramkami, błedne ramki, uszkodzenia ramek. METODY SEPARACJI RAMEK Zliczanie znakówZliczanie znaków Bajty znacznikowe z napełnianiem bajtamiBajty znacznikowe z napełnianiem bajtami Znaczniki początku i końca z napełnianiem bitamiZnaczniki początku i końca z napełnianiem bitami Zmiany kodowania w warstwie fizycznejZmiany kodowania w warstwie fizycznej ZLICZANIE ZNAKÓW

3 RAMKOWANIE C.D. FNŁADUNEKSF BAJTY ZNACZNIKOWE Z NAPEŁNIANIEM BAJTAMI AFBAEFB AEBAEEB AEFBAEEEFB AEEBAEEEEB Ciąg we Napełnianie bajtami (byte stuffing) N – nagłówek S – stopka F – flaga E - Esc

4 RAMKOWANIE C.D. FNŁADUNEKSF ZNACZNIKI POCZĄTKU I KOŃCA Z NAPEŁNIANIEM BITAMI F = Gdy warstwa łącza danych napotyka w danych pięć jedynek wstawia zawsze dodatkowo zero; sześć jedynek ma jedynie znacznik

5 KONTROLA BŁĘDÓW Potwierdzenie (ACK, NAK, na barana, piggybacking)Potwierdzenie (ACK, NAK, na barana, piggybacking) Zaginięcie (utracenie) ramkiZaginięcie (utracenie) ramki CzasomierzeCzasomierze Numery sekwencyjne ramekNumery sekwencyjne ramek Kody korekcyjne i detekcyjne (bit parzystości, CRC, Cyclic Redundancy Check, kod wielomianowy…)Kody korekcyjne i detekcyjne (bit parzystości, CRC, Cyclic Redundancy Check, kod wielomianowy…) Zdarzenia (timeout, frame_arrival, checksum_error, ack, nak,…)Zdarzenia (timeout, frame_arrival, checksum_error, ack, nak,…) STEROWANIE PRZEPŁYWEM Na podstawie informacji zwrotnychNa podstawie informacji zwrotnych Na podstawie szybkości transmisjiNa podstawie szybkości transmisji

6 PROTOKOŁY ŁĄCZA DANYCH PROTOKOŁY SIMPLEKSOWE Nieograniczony protokół simpleksowy Simpleksowy protokół stop-and-wait Protokół simpleksowy dla kanału z zakłóceniami PROTOKOŁY Z OKNEM PRZESUWNYM (akceptowane są ramki o nr mieszczących się w oknie przesuwnym; wysyłane są ramki o nr z okna przesuwnego) Z jednobitowym oknem przesuwnym Wróć do n (go back to n): odrzucenia kolejnych ramek po błędnej Powtórzeń selektywnych: błędna ramka odrzucona, kolejne buforowane

7 PROTOKOŁY ŁĄCZA DANYCH C.D. typedef enum {frame_arrival} event type; // zdarzenia #define MAX_PKT 1024 // wielkosc pakietu w bajtach typedef enum {false,true} boolean; // boolean typ typedef unsigned int seq_nr; // numer sekwencyjny lub ack typedef struct {unsigned char data[MAX_PKT];} packet; // pakiet typedef enum {data, ack, nak} frame_kind; // ramka typedef struct { frame_kind kind; // rodzaj ramki seq_nr seq; // nr ramki seq_nr ack; // nr potwierdzenia // pakiet packet info; } frame;

8 PROTOKOŁY ŁĄCZA DANYCH C.D. // czekaj na zdarzenie, zwroc jego typ void wait_for_event(event_type *event); // pobierz z warstwy sieciowej pakiet do przeslania kanalem void from_network_layer(packet *p); // doręcz informacje z przychodzącej ramki do warstwy sieciowej void to_network_layer(packet *p); // pobierz z warstwy fizycznej ramke i skopiuj do r void from_physical_layer(frame *r); // przekaz ramke do warstwy fizycznej w celu transmisji void to_physical_layer(frame *s); // uruchom zegar i aktywuj zdarzenie timeout void start_timer(seq_nr k); // zatrzymaj zegar i dezaktywuj zdarzenie timeout void stop_timer(seq_nr k); // uruchom czasomierz pomocniczy i aktywuj zdarzenie ack_timeout void start_ack_timer(); // zatrzymaj czasomierz pomocniczy i dezaktywuj zdarzenie ack_timeout void stop_ack_timer(); // pozwol warstwie sieciowej powodowac zdarzenie network_layer_ready void enable_network_layer(); // zabron warstwie sieciowej powodowac zdarzenie network_layer_ready void disable_network_layer(); #define inc(k) if (k

9 PROTOKOŁY ŁĄCZA DANYCH C.D. // NIEOGRANICZONY PROTOKOL SIMPLEKSOWY // KANAL IDEALNY (BEZ BLEDOW) // ODBIORNIK NIESKONCZENIE SZYBKI typedef enum {frame_arrival} event_type; void sender() { frame s; // bufor dla ramki frame s; // bufor dla ramki packet buffer; // bufor dla pakietu packet buffer; // bufor dla pakietu while(true) { while(true) { from_network_layer(&buffer); // pobierz cos do wyslania from_network_layer(&buffer); // pobierz cos do wyslania s.info=buffer; // skopiuj do s w celu transmisji s.info=buffer; // skopiuj do s w celu transmisji to_physical_layer(&s); // wyslij ramke to_physical_layer(&s); // wyslij ramke }} void reciver() { frame r; frame r; event_type event; event_type event; while (true) { while (true) { wait_for_event(&event); // zdarzy sie tylko frame_arrival wait_for_event(&event); // zdarzy sie tylko frame_arrival from_physical_layer(&r); // pobierz przychodzaca ramke from_physical_layer(&r); // pobierz przychodzaca ramke to_network_layer(&r.info); // przekaz do warstwy sieciowej to_network_layer(&r.info); // przekaz do warstwy sieciowej }}

10 PROTOKOŁY ŁĄCZA DANYCH C.D. // SIMPLEKSOWY PROTOKOL STOP-AND-WAIT // KANAL IDEALNY (BEZ BLEDOW) // ODBIORNIK O SKONCZONEJ SZYBKOSCI PRZETWARZANIA typedef enum {frame_arrival} event_type; void sender() { frame s; // bufor dla ramki frame s; // bufor dla ramki packet buffer; // bufor dla pakietu packet buffer; // bufor dla pakietu event_type event; // zdarzy sie tylko frame_arrival event_type event; // zdarzy sie tylko frame_arrival while(true) { while(true) { from_network_layer(&buffer); // pobierz cos do wyslania from_network_layer(&buffer); // pobierz cos do wyslania s.info=buffer; // skopiuj do s w celu transmisji s.info=buffer; // skopiuj do s w celu transmisji to_physical_layer(&s); // wyslij ramke to_physical_layer(&s); // wyslij ramke wait_for_event(&event); // czekaj na pozwolenie wait_for_event(&event); // czekaj na pozwolenie }} void reciver() { frame r,s; frame r,s; event_type event; event_type event; while (true) { while (true) { wait_for_event(&event); // zdarzy sie tylko frame_arrival wait_for_event(&event); // zdarzy sie tylko frame_arrival from_physical_layer(&r); // pobierz przychodzaca ramke from_physical_layer(&r); // pobierz przychodzaca ramke to_network_layer(&r.info); // przekaz do warstwy sieciowej to_network_layer(&r.info); // przekaz do warstwy sieciowej to_physical_layer(&s); // obudz nadajnik to_physical_layer(&s); // obudz nadajnik }}

11 PROTOKOŁY ŁĄCZA DANYCH C.D. // PROTOKOL POTWIERDZEN POZYTYWNYCH Z RETRANSMISJA // KANAL Z BLEDAMI #define MAX_SEQ 1 typedef enum {frame_arrival, checksum_err, timeout} event_type; void sender() { seq_nr next_frame_to_send; // nr następnej ramki wy seq_nr next_frame_to_send; // nr następnej ramki wy frame s; // bufor dla ramki frame s; // bufor dla ramki packet buffer; // bufor dla pakietu packet buffer; // bufor dla pakietu event_type event; // tylko frame_arrival event_type event; // tylko frame_arrival next_frame_to_send=0; // inicjuj nr seq wy next_frame_to_send=0; // inicjuj nr seq wy from_network_layer(&buffer); // pobierz pierwszy pakiet from_network_layer(&buffer); // pobierz pierwszy pakiet while(true) { while(true) { s.info=buffer; // skopiuj do s do transmisji s.info=buffer; // skopiuj do s do transmisji s.seq=next_frame_to_send; // wstaw nr seq do ramki s.seq=next_frame_to_send; // wstaw nr seq do ramki to_physical_layer(&s); // wyslij ramke to_physical_layer(&s); // wyslij ramke start_timer(s.seq); // nie czekaj zbyt dlugo start_timer(s.seq); // nie czekaj zbyt dlugo wait_for_event(&event); // czekaj na zdarzenie wait_for_event(&event); // czekaj na zdarzenie if (event==frame_arrival) { if (event==frame_arrival) { from_physical_layer(&s); // pobierz potwierdzenie from_physical_layer(&s); // pobierz potwierdzenie if (s.ack==next_frame_to_send) { if (s.ack==next_frame_to_send) { stop_timer(s.ack); // wylacz czasomierz stop_timer(s.ack); // wylacz czasomierz from_network_layer(&buffer); // pobierz nastepny from_network_layer(&buffer); // pobierz nastepny inc(next_frame_to_send); inc(next_frame_to_send); } } }} void reciver() { seq_nr frame_expected; seq_nr frame_expected; frame r,s; frame r,s; event_type event; event_type event; frame_expected=0; frame_expected=0; while (true) { while (true) { wait_for_event(&event); // czekaj na zdarzenie wait_for_event(&event); // czekaj na zdarzenie if (event==frame_arrival) { // dotarla ramka OK if (event==frame_arrival) { // dotarla ramka OK from_physical_layer(&r); // pobierz ramke from_physical_layer(&r); // pobierz ramke if (r.seq==frame_expected) { if (r.seq==frame_expected) { to_network_layer(&r.info); // do warstwy sieciowej to_network_layer(&r.info); // do warstwy sieciowej inc(frame_expected); // nastepny nr seq inc(frame_expected); // nastepny nr seq } s.ack=1-frame_expected; // nr ramki potwierdz. s.ack=1-frame_expected; // nr ramki potwierdz. to_physical_layer(&s); // wyslij potwierdzenie to_physical_layer(&s); // wyslij potwierdzenie }}

12 PROTOKOŁY ŁĄCZA DANYCH C.D. // DWUKIERUNKOWY PROTOKOL Z JEDNOBITOWYM OKNEM PRZESUWNYM #define MAX_SEQ 1 typedef enum {frame_arrival, checksum_err, timeout} event_type; void protocol() { seq_nr next_frame_to_send; // nr następnej ramki wy seq_nr next_frame_to_send; // nr następnej ramki wy seq_nr frame_expected; // nr ramki oczekiwanej seq_nr frame_expected; // nr ramki oczekiwanej frame r,s; // bufory dla ramki frame r,s; // bufory dla ramki packet buffer; // bufor dla pakietu packet buffer; // bufor dla pakietu event_type event; // zdarzenia event_type event; // zdarzenia next_frame_to_send=0; // inicjuj nr seq wy next_frame_to_send=0; // inicjuj nr seq wy frame_expected=0; // oczekiwana ramka frame_expected=0; // oczekiwana ramka from_network_layer(&buffer); // pobierz pakiet from_network_layer(&buffer); // pobierz pakiet s.info=buffer; // pierwsza ramki s.info=buffer; // pierwsza ramki s.seq=next_frame_to_send; // wstaw nr seq do ramki s.seq=next_frame_to_send; // wstaw nr seq do ramki s.ack=1-frame_expected; // ack na barana s.ack=1-frame_expected; // ack na barana to_physical_layer(&s); // wyslij ramke to_physical_layer(&s); // wyslij ramke start_timer(s.seq); // nie czekaj zbyt dlugo start_timer(s.seq); // nie czekaj zbyt dlugo while(true) { wait_for_event(&event); // czekaj na zdarzenie wait_for_event(&event); // czekaj na zdarzenie if (event==frame_arrival) { // przyszla ramka if (event==frame_arrival) { // przyszla ramka from_physical_layer(&r); // pobierz ja from_physical_layer(&r); // pobierz ja if (r.seq==frame_expected) { if (r.seq==frame_expected) { to_network_layer(&r.info); //do w. sieciowej to_network_layer(&r.info); //do w. sieciowej inc(frame_expected); inc(frame_expected); } if (s.ack==next_frame_to_send) { if (s.ack==next_frame_to_send) { stop_timer(r.ack); // wylacz czasomierz stop_timer(r.ack); // wylacz czasomierz from_network_layer(&buffer); // pobierz nastepny from_network_layer(&buffer); // pobierz nastepny inc(next_frame_to_send); inc(next_frame_to_send); } } s.info=buffer; // zbuduj ramke wy s.info=buffer; // zbuduj ramke wy s.seq=next_frame_to_send; // nr seq do ramki s.seq=next_frame_to_send; // nr seq do ramki s.ack=1-frame_expected; // ack na barana s.ack=1-frame_expected; // ack na barana to_physical_layer(&s); // wyslij ramke to_physical_layer(&s); // wyslij ramke start_timer(s.seq); // nie czekaj zbyt dlugo start_timer(s.seq); // nie czekaj zbyt dlugo }}

13 PROTOKOŁY ŁĄCZA DANYCH C.D EDDDDDD 234 Interwał oczekiwania ACK 0 ACK 1 ACK 2 ACK 3 BŁĄD E 8910 ACK 0 ACK 1 ACK 8 ACK 9 BŁĄD NAK 2 ACK 1 ACK 5 ACK 6 ACK 7 Ramki buforowane Ramki odrzucane TECHNIKA WRÓĆ DO N TECHNIKA POWTÓRZEŃ SELEKTYWNYCH

14 PROTOKOŁY ŁĄCZA DANYCH C.D. // PROTOKOL Z OKNEM PRZESUWNYM MAX_SEQ I TECHNIKA WROC DO N #define MAX_SEQ 7 typedef enum {frame_arrival, checksum_err, timeout, network_layer_ready} event_type; static boolean between(seq_nr a, seq_nr b, seq_nr c) { if (((a<=b)&&(b

15 PROTOKOŁY ŁĄCZA DANYCH C.D. // PROTOKOL Z OKNEM PRZESUWNYM MAX_SEQ I TECHNIKA WROC DO N, c.d. void protocol() { seq_nr next_frame_to_send; // nr następnej ramki wy seq_nr next_frame_to_send; // nr następnej ramki wy seq_nr ack_expected; // najstarsza niepotwierdzona ramka seq_nr ack_expected; // najstarsza niepotwierdzona ramka seq_nr frame_expected; // nr ramki oczekiwanej seq_nr frame_expected; // nr ramki oczekiwanej frame r; // bufor dla ramki frame r; // bufor dla ramki packet buffer[MAX_SEQ+1]; // bufory strumienia wy pakietow packet buffer[MAX_SEQ+1]; // bufory strumienia wy pakietow seq_nr nbuffered; // liczba aktualnie uzywanych buforow seq_nr nbuffered; // liczba aktualnie uzywanych buforow seq_nr i; // indeks buforow seq_nr i; // indeks buforow event_type event; // zdarzenia event_type event; // zdarzenia enable_network_layer(; // zezwol na network_layer_ready enable_network_layer(; // zezwol na network_layer_ready ack_expected=0; ack_expected=0; next_frame_to_send=0; // inicjuj nr seq wy next_frame_to_send=0; // inicjuj nr seq wy frame_expected=0; // oczekiwana ramka frame_expected=0; // oczekiwana ramka nbuffered=0; nbuffered=0; while(true) { while(true) { wait_for_event(&event); // czekaj na zdarzenie wait_for_event(&event); // czekaj na zdarzenie switch (event) { switch (event) { case network_layer_ready: case network_layer_ready: from_network_layer(&buffer[next_frame_to_send]); // pobierz nastepny from_network_layer(&buffer[next_frame_to_send]); // pobierz nastepny nbuffered++; nbuffered++; send_data(next_frame_to_send,frame_expected,buffer); send_data(next_frame_to_send,frame_expected,buffer); inc(next_frame_to_send); inc(next_frame_to_send); break; break;

16 PROTOKOŁY ŁĄCZA DANYCH C.D. // PROTOKOL Z OKNEM PRZESUWNYM MAX_SEQ I TECHNIKA WROC DO N, c.d. case frame_arrival: from_physical_layer(&r); // pobierz nastepny from_physical_layer(&r); // pobierz nastepny if (r.seq==frame_expected) { if (r.seq==frame_expected) { to_network_layer(&r.info); // przekaz do warstwy sieciowej to_network_layer(&r.info); // przekaz do warstwy sieciowej inc(frame_expected); inc(frame_expected); } while(between(ack_expected,r.ack,next_frame_to_send)) { while(between(ack_expected,r.ack,next_frame_to_send)) { nbuffered--; nbuffered--; stop_timer(ack_expected); // wylacz czasomierz stop_timer(ack_expected); // wylacz czasomierz inc(ack_expected); inc(ack_expected); } break; break; case checksum_err: break; case checksum_err: break; case timeout: case timeout: next_frame_to_send=ack_expected; next_frame_to_send=ack_expected; for (i=1;i<=nbuffered;i++) { for (i=1;i<=nbuffered;i++) { send_data(next_frame_to_send,frame_expected,buffer); send_data(next_frame_to_send,frame_expected,buffer); inc(next_frame_to_send); inc(next_frame_to_send); } } if (nbuffered


Pobierz ppt "SIECI KOMPUTEROWE WYKŁAD 4. WARSTWA ŁĄCZA DANYCH PROF. CZESŁAW SMUTNICKI p.216 C-3"

Podobne prezentacje


Reklamy Google