Podręcznik
Warstwa łącza danych to druga warstwa modelu OSI, odpowiedzialna za niezawodne przesyłanie ramek danych między bezpośrednio połączonymi urządzeniami sieciowymi. Jej główną rolą jest organizacja surowych bitów warstwy fizycznej w logiczne jednostki – ramki – oraz zapewnienie ich poprawnej transmisji przez medium komunikacyjne. Warstwa ta realizuje funkcje takie jak adresowanie fizyczne (MAC), wykrywanie i korekcję błędów, kontrolę przepływu oraz zarządzanie dostępem do wspólnego medium transmisyjnego. W tym celu stosuje różne protokoły dostępu do medium, takie jak CSMA/CD w Ethernet czy HDLC i LCP w PPP. Technologie takie jak Ethernet, PPP i Frame Relay są przykładami różnych sposobów implementacji tej warstwy, przystosowanych do pracy w sieciach lokalnych, punkt-punkt oraz rozległych. Poprawne działanie warstwy łącza danych ma kluczowe znaczenie dla efektywnej pracy całego stosu protokołów sieciowych i minimalizacji strat w transmisji.
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.