Po co Wykrywać Błędy? Przykład Transmisji
Podczas transmisji dane mogą zostać zmienione przez zakłócenia elektryczne, awarie sprzętu, błędy oprogramowania lub problemy na ścieżce sieciowej. Odbiorca potrzebuje więc sposobu wykrycia, że odebrane bity różnią się od bitów wysłanych. Sam fakt odebrania pakietu nie potwierdza poprawności jego zawartości.
Dane podróżujące przez internet przechodzą przez kable, routery i przełączniki. Jednostka danych, czyli , przemierza tę trasę jako uporządkowany nagłówek i dane użytkowe. Po drodze pojedynczy bit może zmienić wartość z 0 na 1 lub z 1 na 0. Nazywa się to uszkodzeniem danych (ang. data corruption).
Jeden odwrócony bit może zmienić liczbę w transakcji finansowej, uszkodzić instrukcję aktualizacji oprogramowania lub wywołać zakłócenie w strumieniu wideo. Protokoły potrzebują więc mechanizmu sprawdzającego, czy odebrane dane zgadzają się z danymi wysłanymi. Internetowa suma kontrolna TCP/IP jest prostą i szybką metodą używaną między innymi przez TCP, UDP oraz IPv4 do podstawowej kontroli integralności. IPv6 nie ma sumy w podstawowym nagłówku, lecz protokoły wyższych warstw nadal mogą stosować własne sumy kontrolne.
Podstawowa Koncepcja: Arytmetyka Dopełnień do Jedności
Algorytm sumy kontrolnej internetowej opiera się na specyficznym rodzaju matematyki binarnej, zwanej arytmetyką dopełnień do jedności. Aby ją zrozumieć, musimy omówić dwie proste operacje. We wszystkich przykładach założymy, że pracujemy na 16-bitowych liczbach, ponieważ jest to standardowy rozmiar dla sumy kontrolnej.
1. Dopełnienie do Jedności (Inwersja Bitowa)
Dopełnienie do jedności liczby binarnej jest jej bitową inwersją. Bierzemy liczbę i odwracamy każdy bit: każde 0 staje się 1, a każde 1 staje się 0. Jest to ostatni krok w obliczaniu wartości sumy kontrolnej.
Przykład:
Oryginalna liczba 16-bitowa:
Dopełnienie do jedności (odwrócona):
2. Dodawanie w Kodzie Dopełnień do Jedności z Przeniesieniem Okrężnym
Obliczenie przypomina standardowe dodawanie binarne, lecz ma jedną dodatkową zasadę dotyczącą bitu przeniesienia.
- Wykonaj Dodawanie Binarne: Dodaj dwie 16-bitowe liczby tak, jak w normalnej arytmetyce binarnej.
- Obsłuż Bit Przeniesienia (Specjalna Zasada): Jeśli suma 16-bitowych liczb jest większa niż to, co 16 bitów może pomieścić, generowany jest 17. bit, zwany . W wielu rodzajach arytmetyki ten bit jest odrzucany. Jednak w dodawaniu w kodzie dopełnień do jedności ten bit przeniesienia jest zawijany i dodawany z powrotem do najmniej znaczącego bitu (bitu po prawej stronie) wyniku. Nazywa się to przeniesieniem okrężnym (ang. end-around carry).
Przykład Przeniesienia Okrężnego:
Jak Obliczana Jest Suma Kontrolna (Po Stronie Nadawcy)
Nadawca pakietu wykonuje prosty czteroetapowy proces w celu wygenerowania sumy kontrolnej.
Krok 1: Przygotuj Dane
Nadawca bierze dane do zabezpieczenia, na przykład nagłówek TCP oraz dane aplikacji. Tymczasowo ustawia pole sumy kontrolnej w nagłówku na same zera (), ponieważ to pole należy do obszaru sumowania i musi rozpoczynać obliczenie od znanej wartości.
W TCP i UDP do obliczenia dołącza się także pseudo-nagłówek zawierający adresy IP, numer protokołu oraz długość. Pseudo-nagłówek służy do weryfikacji właściwego kontekstu datagramu lub segmentu i nie jest przesyłany jako jego osobna część.
W IPv4 zerowa suma UDP oznacza pominięcie tej kontroli. W zwykłym ruchu IPv6 suma UDP jest wymagana. Przesłana wartość zero jest więc niepoprawna i odbiorca ją odrzuca, z wyjątkiem trybów tunelowych IPv6 określonych w standardach, które zezwalają na sumę zerową.
W IPv4 osobno oblicza się sumę kontrolną nagłówka IP, a router może ją przeliczać po zmianie pól takich jak TTL. IPv6 nie zawiera pola sumy kontrolnej w podstawowym nagłówku.
Jeśli łączna długość bajtów objętych obliczeniem jest nieparzysta, na końcu dodawany jest tymczasowy bajt wypełniający składający się z samych zer. Pozwala to podzielić objęty obliczeniem obszar na 16-bitowe słowa. Ten bajt wypełniający nie jest przesyłany z pakietem.
Krok 2: Zsumuj Dane
Dane są dzielone na 16-bitowe słowa. Następnie nadawca dodaje wszystkie te słowa, używając dodawania w kodzie dopełnień do jedności, upewniając się, że zawija wszystkie bity przeniesienia, jak opisano wcześniej. Ten proces trwa, dopóki wszystkie 16-bitowe słowa nie zostaną zsumowane w jedną 16-bitową sumę.
Krok 3: Odwróć Sumę
Końcowa 16-bitowa suma z Kroku 2 jest odwracana poprzez wzięcie jej dopełnienia do jedności (odwrócenie wszystkich bitów). Otrzymana liczba to suma kontrolna internetowa.
Krok 4: Wstaw Sumę Kontrolną
Nadawca umieszcza tę obliczoną wartość sumy kontrolnej z powrotem w teraz pustym polu sumy kontrolnej w nagłówku pakietu. Pakiet jest gotowy do transmisji przez sieć.
Jak Weryfikowana Jest Suma Kontrolna (Po Stronie Odbiorcy)
Weryfikacja sumy kontrolnej w dopełnieniu do jedności jest bezpośrednia. Odbiorca nie musi odtwarzać osobnej wartości referencyjnej. Wykonuje obliczenie na całym otrzymanym obszarze, razem z polem sumy kontrolnej.
Krok 1: Odbierz Pakiet
Odbiorca otrzymuje pakiet z sieci. Pakiet zawiera dane oraz sumę kontrolną obliczoną przez nadawcę, która jest przechowywana w polu nagłówka sumy kontrolnej.
Krok 2: Zsumuj Wszystko
Odbiorca wykonuje ten sam proces co nadawca: dzieli otrzymane dane (włączając nagłówek z sumą kontrolną nadawcy) na 16-bitowe słowa i dodaje je, używając dodawania w kodzie dopełnień do jedności z przeniesieniem okrężnym.
Krok 3: Sprawdź Wynik
Po zsumowaniu wszystkich części odbiorca sprawdza końcową 16-bitową sumę. Właściwości arytmetyki dopełnień do jedności oznaczają, że:
Jeśli podczas transmisji nie było błędów, końcowa suma po stronie odbiorcy będzie 16-bitowym słowem składającym się z samych jedynek (11111111 11111111, lub 0xFFFF w systemie szesnastkowym).
Jeśli końcowa suma to wartość inna niż same jedynki, odbiorca wykrywa prawdopodobne uszkodzenie pakietu i reaguje zgodnie z zasadami danego protokołu. TCP może uruchomić retransmisję brakujących danych, natomiast UDP pozostawia obsługę błędu aplikacji.
Przykład Obliczeń na Słowach 4-bitowych
Rozważmy uproszczony przykład z trzema 4-bitowymi słowami: , i .
Po Stronie Nadawcy
- Nadawca dodaje słowa danych używając dodawania w dopełnieniu do jedności:
- Końcowa suma to .
- Nadawca oblicza sumę kontrolną przez odwrócenie końcowej sumy: .
- Nadawca przesyła oryginalne dane, po których następuje suma kontrolna: .
Po Stronie Odbiorcy (Bez Błędów)
- Odbiorca otrzymuje cztery słowa () i dodaje je wszystkie razem:
- Wynik końcowy to (same jedynki). Odbiorca stwierdza, że pakiet jest wolny od błędów i akceptuje go.
Po Stronie Odbiorcy (Z Błędem)
- Pierwsze słowo zostało uszkodzone podczas transmisji i stało się .
- Odbiorca teraz dodaje: .
- Wynik końcowy to , co nie jest samymi jedynkami. Odbiorca wykrywa błąd i odrzuca pakiet.
Ważne Ograniczenia Sumy Kontrolnej Internetowej
Suma kontrolna internetowa jest projektowana pod kątem szybkiego obliczania. Prosty algorytm można wydajnie zaimplementować w oprogramowaniu, co miało znaczenie we wczesnych sieciach, gdy czas procesora był ograniczony. Ta prostota wiąże się jednak z ograniczeniami.
Suma kontrolna nie jest kryptograficznie bezpieczną funkcją skrótu. Może nie wykryć kilku typowych rodzajów błędów:
- Jeśli dwa 16-bitowe słowa zostaną zamienione miejscami, końcowa suma pozostanie taka sama.
- Jeśli bit w jednym słowie zostanie odwrócony z 0 na 1, a odpowiadający mu bit w innym słowie zostanie odwrócony z 1 na 0, błędy mogą się wzajemnie znieść, a suma kontrolna nadal będzie poprawna.
- Wstawianie lub usuwanie słów zawierających same zera również może pozostać niewykryte.
Ograniczenia są akceptowalne w roli dodatkowej kontroli. Silniejsze mechanizmy wykrywania błędów, takie jak , są już stosowane na Warstwie Łącza Danych (np. przez Ethernet). Suma kontrolna internetowa zapewnia dodatkową, lekką warstwę ochrony przed błędami, które mogłyby zostać wprowadzone wewnątrz routerów, gdzie nagłówek warstwy łącza (i jego CRC) jest zdejmowany i ponownie składany dla następnego skoku. Jest to szybki test wystarczający dla tej roli w stosie sieciowym.