Zamiarowa Redundancja
Kod Hamming dodaje starannie rozmieszczone bity pomocnicze – bity parzystości – do bloku bitów danych, tak aby pojedynczo odwrócony bit nie tylko mógł zostać wykryty, ale także zlokalizowany i skorygowany bez ponownego wysyłania danych. Richard Hamming opracował tę metodę w 1950 roku w Bell Labs po frustracji związanej z tym, że wczesny komputer relajnowy przerywał cały wielodniowy proces z powodu pojedynczego błędu, który mógł wykryć, ale nie skorygować. Klasyczny kod Hamming (7,4) wykorzystuje 4 bity danych i dodaje 3 bity parzystości, aby utworzyć 7-bitową sekwencję bitów, kosztem zapłacenia za redundancję i uzyskania automatycznej korekcji.
Umieszczanie bitów parzystości w potęgach o dwóch
Kluczem jest to, gdzie umieszcza się bity parzystości. W słowie 7-bitowym numerowanym od 1 do 7, pozycje 1, 2 i 4 – czyli potęgi o dwóch – zawierają bity parzystości; pozycje 3, 5, 6 i 7 zawierają dane. Każdy bit parzystości obejmuje określony, nakładający się podzbiór pozycji, zdeterminowany przez jego własne bit w binarnym reprezentacji numeru pozycji: bit parzystości na pozycji 1 sprawdza każdą pozycję, której reprezentacja binarna ma bit 0 ustawiony (1, 3, 5, 7), bit parzystości na pozycji 2 sprawdza pozycje z bitem 1 ustawionym (2, 3, 6, 7), a bit parzystości na pozycji 4 sprawdza pozycje z bitem 2 ustawionym (4, 5, 6, 7).
pozycja: 1 2 3 4 5 6 7 zawartość: p1 p2 d1 p4 d2 d3 d4 p1 sprawdza pozycje 1,3,5,7 (bit 0 pozycji ustawiony) p2 sprawdza pozycje 2,3,6,7 (bit 1 pozycji ustawiony) p4 sprawdza pozycje 4,5,6,7 (bit 2 pozycji ustawiony) każdy pi jest ustawiany tak, aby parzystość (XOR) w pokrytych przez niego pozycjach była równa zero. Ten nakładający się projekt to cała sztuczka: każdy bit danych jest objęty unikalną kombinacją bitów parzystości, więc błąd w tym jednym bicie danych zakłóca unikalny, identyfikowalny podzbiór kontroli parzystości.
position: 1 2 3 4 5 6 7 content: p1 p2 d1 p4 d2 d3 d4 p1 checks positions 1,3,5,7 (bit 0 of position set) p2 checks positions 2,3,6,7 (bit 1 of position set) p4 checks positions 4,5,6,7 (bit 2 of position set) each pi is set so the parity (XOR) of its covered positions is even
Syndrom: trzy sprawdzanie, które wskazują pozycję
Na końcu odbioru ponownie oblicz trzy kontrolne sumy nad otrzymanym słowem. Jeśli dana suma jest równa zero, jej bitowy wynik wynosi 0; jeśli jest nieparzysta, to 1. Zastosuj te wyniki do p4's bit jako najbardziej znaczący: uzyskane 3-bitowe wyrażenie – syndrom – będzie albo zerem (brak błędu) albo dokładnie określa pozycję odwróconego bitu, ponieważ zestawy pokrycia zostały zbudowane bezpośrednio z binarnych cyfr każdej pozycji.
syndrom = (check_p4 << 2) | (check_p2 << 1) | check_p1 syndrom == 0 → nie wykryto błędu syndrom == k → bit na pozycji k jest błędny – odwróć go i masz gotowe Brak tabeli wyszukiwania, brak ponownego przesyłania – obliczanie syndromu jest samo w sobie adresem usterki. To właśnie oznacza się pojedynczą korekcją błędu: kod automatycznie koryguje dokładnie jeden odwrócony bit na słowo kodowe.
syndrome = (check_p4 << 2) | (check_p2 << 1) | check_p1 syndrome == 0 → no error detected syndrome == k → bit at position k is wrong — flip it and you're done
SECDED: dodawanie czwartego bitu do podwójnej detekcji błędów
Prosta (7,4) kod Hamminga ma ślepy punkt: jeśli dwa bity ulegają zmianie jednocześnie, syndrom nadal wskazuje z pewnością na jakąś pozycję – błędną – i dekoder koryguje bit, który nigdy nie był złej, bezgłośnie pogarszając błąd. Naprawa, używana w zasadzie we wszystkich rzeczywistych implementacjach, to SECDED (korekcja pojedynczego błędu, podwójna detekcja błędów): dodaj jeden dodatkowy bit ogólny obejmujący całe słowo wraz z innymi bitami parzystości. Pojedynczy błąd powoduje zmianę ogólnej parzystości i daje niezerowy syndrom – korygowany jak wcześniej. Podwójny błąd daje niezerowy syndrom (fałszując wskazanie gdzieś) ale pozostawia niezmienioną ogólną parzystość, a ta niespójność między 'syndrom mówi o błędzie' i 'ogólna parzystość mówi o braku błędów' jest jednoznaczny sygnałem niekorygowanego podwójnego błędu, więc dekoder go sygnalizuje zamiast mylnie korygować.
Gdzie faktycznie działa
Kody Secded Hamming chronią ECC RAM w serwerach i stacjach roboczych przed błędem bitów spowodowanym przez promieniowanie kosmiczne i cząstki alfa, a także w linkach telemetrycznych satelitarnych i z przestrzeni głębokiej, gdzie koszt ponownego wysłania danych może wynieść kilka minut opóźnionego czasu podróży światła. Ochronę zapewniają również kontrolery pamięci NAND flash.
Schemat ten uogólnia się poza (7,4): kod Hamming z r bitami parzystości chroni 2^r − 1 bitów w sumie (2^r − r − 1 bitów danych), więc kody (15,11), (31,26) i (63,57) handlują mniejszym relatywnym nakładem na to samo gwarantowanie korekty pojedynczego błędu, gdy bloki stają się większe – kosztem większego zasięgu uderzeniowego, jeśli w tym samym powiększonym bloku przypadkowo wystąpi kolejny błąd.
Frequently asked questions
Jak trzy bity parzystości mogą zidentyfikować pozycję błędu wśród 7 bitów?
Bity parzystości umieszczone są na pozycjach 1, 2 i 4, a każdy z nich sprawdza zbiór pozycji, których reprezentacja binarna ma ustawiony dany bit. Złożenie trzech wyników parzystości/nieparzystości jako liczby binarnej rekonstruuje dokładną pozycję odwróconego bitu – syndrom dosłownie wskazuje adres błędu w postaci binarnie.
Co się dzieje, gdy dwa bity odwracają się zamiast jednego w prostym kodzie Hamminga?
Podstawowy (7,4) kod Hamminga nie jest w stanie rozróżnić pojedynczego błędu od dwóch – syndrom będzie niezerowy i wskazuje na jakąś pozycję, ale dekoder z pewnością 'skoryguje' błędną bit, zamieniając 2-bitowy błąd na 3-bitowe uszkodzone słowo. Dlatego w rzeczywistych systemach dodaje się dodatkowy bit parzystości SECDED do wykrywania (nie korygującego) podwójnych błędów zamiast ich nieprawidłowego skorygowania.
Dlaczego pamięć ECC oparta jest na kodach Hamminga, a nie tylko na ponownym przesyłaniu danych zła?
Pamięć nie jest kanałem komunikacyjnym z nadajnikiem, który mógłby ponownie poprosić o dane – odwrócenie bitu w pamięci, często spowodowane promieniowaniem kosmicznym, musi być naprawione na miejscu za pomocą jedynie redundancji przechowywanej obok danych. Kod SECDED Hamminga pozwala kontrolerowi pamięci wykrywać i cicho korygować pojedyncze błędy przy każdym odczycie, bez możliwości lub potrzeby ponownego przesyłania.
Wypróbuj na żywo
Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Hamming Codes i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.
▶ Otwórz symulację Hamming Codes