2. Warstwa Łącza Danych

2.3. Kontrola błędów i przepływu danych

Warstwa łącza danych dodaje do każdej ramki pole CRC (Cyclic Redundancy Check) – cztero- lub zwłaszcza w HDLC krótsze – które obliczane jest na podstawie zawartości adresów, typu i danych. Odbiornik oblicza CRC niezależnie i porównuje z tym załączonym. Jeśli wartości się różnią, ramka jest odrzucana. W środowisku Ethernet brak retransmisji sprawia, że to warstwy wyższe, jak TCP, są odpowiedzialne za uzupełnienie braków. W protokołach takich jak HDLC, PPP czy Wi‑Fi możliwe jest automatyczne powtórne wysyłanie ramki przez warstwę MAC, co zwiększa niezawodność. W Wi‑Fi stosuje się potwierdzenia ACK – po wysłaniu ramki nadawca czeka na ACK, a jeśli ten nie nadejdzie, ramka jest retransmitowana.

W otoczeniu bezprzewodowym, warstwa MAC realizuje również usługę kontroli dostępu do medium, wykorzystując mechanizmy CSMA/CA i backoff. Jeśli po wysłaniu ramki nie nadejdzie ACK, urządzenie zakłada wystąpienie błędu i ponawia transmisję po losowym opóźnieniu, co zapobiega nadmiernej kolizji. W TX/RX przerzutach w sieciach przemysłowych pojawiają się mechanizmy deterministyczne, gdzie ramka jest planowana i nadawana tylko w przewidzianym czasie przez wyznaczony węzeł, co minimalizuje straty i opóźnienia.

Kontrola przepływu (flow control) realizowana jest, gdy nadawca i odbiorca współpracują w celu nieprzepełnienia buforów. W środowisku Ethernet często używany jest mechanizm Flow Control (IEEE 802.3x) – odbiorca wysyła ramkę PAUSE, która blokuje nadawcę na określony czas. W wielu implementacjach konteneryzacja przesyłu jest prosta – bez restrykcji. W protokołach takich jak HDLC stosowany jest windowing – nadawca może wysłać maksymalnie określoną liczbę ramek przed otrzymaniem potwierdzenia. Windowing umożliwia płynną transmisję bez zatorów. Rysunek przedstawia mechanizm okna: nadawca wysyła N ramek, czeka na ACK, przesuwa okno.

Rysunek: okno przesuwne

W TCP mechanizm kontrolowany jest przez dynamiczne okno, które jest dostosowywane według warunków sieci, reagując na straty i opóźnienia w celu zapewnienia równowagi między niezawodnością a wydajnością. Jeśli przesył danych jest szybszy niż odbiorca jest w stanie przetworzyć, odbiorca zmniejszy okno, ograniczając tempo. Jeśli nie ma strat i przesył działa sprawnie, okno będzie się powiększać, aż osiągnie próg lub limit adresu bufora.

Niezawodność transmisji zależy też od reakcji na utratę ramek. W protokołach warstwy łącza danych, które wspierają retransmisję, odbiorca potwierdza odebranie ramki numerowanym ACK lub NAK, a nadawca powtarza, jeśli nie otrzyma potwierdzenia w określonym czasie. Algorytmy takie jak ARQ (Automatic Repeat reQuest) zapewniają, że dane dotrą kompletnie i w odpowiedniej kolejności. W ARQ stosuje się różne schematy: stop-and-wait – nadawca wysyła jedną ramkę i czeka na ACK, co jest proste, ale nieefektywne przy większych odległościach; go-back-n – nadawca może mieć wiele ramek na etapie nierepotwierdzonym, ale w razie błędu wraca do eseń po błędnej; selective repeat – retransmituje tylko brakujące ramki. 

Protokoły sieciowe często implementują adaptacyjne przystosowanie tempa transmisji do warunków sieci. W algorytmach TCP używa się AIMD – additive increase, multiplicative decrease – co oznacza, że po każdym potwierdzeniu okienko zwiększa się liniowo, a po wykryciu straty zmniejsza się gwałtownie. W ten sposób unika się przeciążeń sieci, reagując na sygnały utraty pakietów. Najpierw stosuje się slow start – okno rośnie wykładniczo do momentu dotarcia do wartości progowej, potem linowo w Congestion Avoidance. W razie straty następuje fast retransmit i fast recovery, które pozwalają kontynuować transmisję bez powrotu do początku slow startu.

Niezależnie od warstwy transportowej, WBPD (window-based flow control with packet drop) w warstwie MAC powoduje, że węzeł odbierający informuje nadawcę o braku bufora – nadawca wstrzymuje wysyłkę, ale nie zeruje sesji. Ramka PAUSE w Ethernet służy temu samemu. W CAN i innych sieciach magistralowych kontrola przepływu wynika z arbitrażu – jeśli magistrala jest zajęta, alternatywny węzeł oczekuje, co powoduje naturalne ograniczenie.

Kontrola błędów może objąć również ochronę przed duplikacją ramek. W sieciach, które wspierają ARQ, odbiorca ignoruje duplikaty na podstawie numeru sekwencyjnego – nadawca numeruje ramki modulo okna, a odbiorca odbiera tylko ramki o oczekiwanym numerze, duplikaty odrzuca. Nadawca z kolei powtarza zaznaczone brakujące. Numeracja i sekwencjonowanie są więc elementem zarówno integralności jak i kontroli przepływu.

W sieciach przewodowych IEEE 802.5 (Token Ring) używa się starych MAC-owych potwierdzeń i kontroli ramkowej – ramka ze statusem "recognized" zostaje oznaczona bitowo. Kontrola przepływu odbywa się poprzez ograniczenie liczby ramek, które stacja może przesłać bezpośrednio po tokenie, co zapobiega monopolizacji medium.

W technologii HDLC liczby sekwencji roboczych (N(S), N(R)) używane są odpowiednio przez nadawcę i odbiorcę. Ramka I (informacyjna) ma N(S), potwierdzenie zawiera N(R). Window Receiver określa ile ramek może przetworzyć naraz. W razie wykrycia błędu przesyła ramkę rej (reject) lub srej (selective reject), co powoduje powtórkę.

Z punktu widzenia programisty, mechanizmy te wymagają utrzymywania buforów wysyłki i odbioru, struktur sekwencyjnych, liczników czasowych (timeout dla retransmisji) oraz procedur obsługi błędów. W zaawansowanych systemach telemetrycznych, gdzie stosowane są połączenia satelitarne, implementuje się hybrydowe protokoły FEC + ARQ, które minimalizują opóźnienia i maksymalizują skuteczność retransmisji. Dane są kodowane redundancją (FEC), a brakujące fragmenty uzupełniane poprzez ARQ.

W sieciach IoT, w technologii LoRaWAN czy NB-IoT, kontrola przepływu jest kluczowa przy limitach transmisji energetycznych i czasowych. LoRaWAN używa adaptive data rate (ADR) – każda ramka przesyłana jest z dostosowaną mocą i szybkością, a odbiorca wysyła MAC-command request/ack, co stanowi formę kontroli przepływu i błędów.

Mechanizm stop-and-wait jest często stosowany w prostych mikrokontrolerowych systemach – nadawca wysyła ramkę i czeka na potwierdzenie, co minimalizuje buforowanie, ale ogranicza przepustowość. Dla bardziej wymagających sieci stosuje się selective repeat lub sliding window – co pozwala zwiększyć efektywność.

Wychodząc poza czystą warstwę łącza danych, warto zauważyć, że algorytmy kontroli przepływu i błędów są stosowane również w warstwie aplikacji – np. w HTTP2 czy QUIC, które mają własny mechanizm window-based flow control. Również protokoły P2P implementują ARQ na poziomie warstwy aplikacji, co pozwala zbierać części plików z różnych źródeł i rekonstruować je z pominięciem utraconych fragmentów.

Kontrola błędów i przepływu danych to dwa wspierające się mechanizmy: pierwszy dba, by dane nie uszkodzono, drugi – by nie zalać odbiornika. Obie strategie są silnie powiązane w warstwach MAC, ale wymagają koordynacji między nadawcą, odbiorcą i często warstwą transportową, by sieć działała efektywnie, niezawodnie i stabilnie. Jeśli chcesz, mogę teraz stworzyć analogiczny materiał z rysunkami dotyczącymi algorytmów AIMD czy selective repeat w TCP.