Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska BSS Integralność Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska
BSS - Integralność Proces transmisji może w prowadzać błędy do przesyłanych wiadomości – błędy pojedyncze lub grupowe Detekcja: Wymaga uznania, że niektóre wiadomości są nieważne Wymaga dodatkowych bitów (nadmiarowość) Kod (n,k) zawiera słowa kodowe n-bitowe z k-bitami danych i r=(n-k) bitami nadmiarowymi Korekcja Korekcja błędów: wiele słów kodowych jest zmapowanych do tego samego słowa danych Detekcja i retransmisja 01-2014 Zygmunt Kubiak
Odległość Hamminga BSS - Integralność Odległość Hamminga dwóch słów bitowych = liczba pozycji na których różnią się te słowa Jeśli słowa kodowe mają minimalną odległość Hamminga D, wtedy można wykryć D-1 błędów bitowych Jeśli dostępne słowa kodowe mają minimalną odległość Hamminga D, wtedy można skorygować [(D-1)/2] błędów bitowych 1 HD=2 01-2014 Zygmunt Kubiak
BSS - Integralność Kod 01-2014 Zygmunt Kubiak
BSS - Integralność Błąd detekcji 01-2014 Zygmunt Kubiak
BSS - Integralność Błąd niewykryty 01-2014 Zygmunt Kubiak
BSS - Integralność Detekcja błędów 01-2014 Zygmunt Kubiak
BSS - Integralność Korekcja błędów 01-2014 Zygmunt Kubiak
Kodowanie parzystości: BSS - Integralność Parzystość 1-bit zabezpieczenia - detekcja Każde słowo kodowe zawiera parzystą liczbę jedynek 010 110 100 000 011 111 101 001 Kodowanie parzystości: Biały – błąd 01 11 10 00 Dostępne słowa danych 01-2014 Zygmunt Kubiak
Niebieski – korekcja na 0 BSS - Integralność Głosowanie 1-bitowa korekcja z głosowaniem Każde słowo jest n-razy powtarzane 1 Dostępne słowa danych 010 110 100 000 011 111 101 001 Głosowanie: Biały – korekcja na 1 Niebieski – korekcja na 0 01-2014 Zygmunt Kubiak
Kodowanie parzystości: Niebieski – korekcja na 0 BSS - Integralność Przykłady Parzystość Głosowanie 010 110 100 000 011 111 101 001 Kodowanie parzystości: Biały – błąd 01 11 10 00 Dostępne słowa 010 110 100 000 011 111 101 001 Głosowanie: Biały – korekcja na 1 Niebieski – korekcja na 0 1 Dostępne słowa 01-2014 Zygmunt Kubiak
Techniki cyfrowej detekcji błędów BSS - Integralność Techniki cyfrowej detekcji błędów Dwuwymiarowa parzystość Wykrywa do 3 błędnych bitów Dobre rozwiązanie dla paczek błędów Słowo kontrolne IP Proste dodawanie Prosta realizacja programowa Słowo kontrolne CRC Skuteczne rozwiązanie matematyczne (Galois Fields) Uproszczenia w realizacji programowej Proste w realizacji sprzętowej Powszechnie stosowane w protokołach transmisji 01-2014 Zygmunt Kubiak
Parzystość dwuwymiarowa BSS - Integralność Parzystość dwuwymiarowa Wykorzystana parzystość 1- wymiarowa Dodany drugi wymiar Dodano dodatkowy bajt Komentarz Wykrywa wszystkie błędy 1-, 2- i 3- bitów oraz dużo błędów 4-bitowych 1 1111011 Parzystość bitów Bajt Parzystości 0101001 1101001 1011110 0001110 0110100 1011111 Dane 01-2014 Zygmunt Kubiak
Słowo kontrolne IP BSS - Integralność Idea Słowo kontrolne IP Dodać wszystkie słowa Wysłać wszystkie słowa Słowo kontrolne IP Wykorzystanie uzupełnienia 1-kowego dla 16-bitowych słów kodowych Przykład Słowo kodowane: 5 3 = 8 Postać binarna 0101 0011 = 1000 Suma komplementarna 0111 Prosta implementacja 01-2014 Zygmunt Kubiak
Słowo kontrolne IP BSS - Integralność u_short cksum(u_short *buf, int count) { register u_long sum = 0; while (count--) sum += *buf++; if (sum & 0xFFFF0000) // gdy przeniesienie to je usunąć sum &= 0xFFFF; sum++; } return ~(sum & 0xFFFF); 01-2014 Zygmunt Kubiak
Modbus – LRC (ang. Longitudinal Redundancy Check) BSS - Integralność Modbus – LRC (ang. Longitudinal Redundancy Check) Krok 1 - dodać wszystkie wymagane bajty Krok 2 - zanegować wynik (uzupełnienie jedynkowe) Krok 3 - dodać 1 (uzupełnienie dwójkowe) LRC Przykładowy kod Funkcja przedstawia sposób wyznaczenia bajta LRC w języku C BYTE LRC (BYTE *nData, WORD wLength) { BYTE nLRC = 0 ; // LRC char initialized for (int i = 0; i < wLength; i++) nLRC += *nData++; return (BYTE)(-nLRC); } // End: LRC Zygmunt Kubiak
Modbus – LRC (ang. Longitudinal Redundancy Check) BSS - Integralność Modbus – LRC (ang. Longitudinal Redundancy Check) Procedura z dokumentacji Modbus LRC Generation Function static unsigned char LRC(auchMsg, usDataLen) //the function returns the LRC unsigned char *auchMsg; // message to calculate LRC upon unsigned short usDataLen; //quantity of bytes in message { unsigned char uchLRC = 0; //LRC char initialized while (usDataLen––) //pass through message buffer uchLRC += *auchMsg++; //add buffer byte without carry return ((unsigned char)(–((char)uchLRC))); // return twos complement } Operacje równoważne a = -b; a = ~b + 1; Zygmunt Kubiak
Słowo kontrolne CRC (ang. Cyclic Redundancy Check) BSS - Integralność Słowo kontrolne CRC (ang. Cyclic Redundancy Check) Cel Maksymalizacja zabezpieczenia, minimalizacja ekstra bitów Idea Dodanie k bitów nadmiarowych do n-bitowej wiadomości N-bitowy komunikat może być przedstawiony jako n-bitowy wielomian, w którym każdy bit odpowiada współczynnikowi wielomianu Przykład Wiadomość = 10011010 Wielomian = 1 x7 0 x6 0 x5 1 x4 1 x3 0 x2 1 x 0 = x7 x4 x3 x 01-2014 Zygmunt Kubiak
Przykład kodowania BSS - Integralność Słowo kontrolne CRC (ang. Cyclic Redundancy Check) Przykład kodowania 1001 1101 1000 1011 1100 101 Nadmiar m mod c 10011010000 Komunikat plus k zer Wynik: Transmisja komunikatu z dodanym nadmiarem: 10011010101 G(x) = x3 x2 1 = 1101 Generator M(x) = x7 x4 x3 x = 10011010 Komunikat 1101 01-2014 Zygmunt Kubiak
Odebrany komunikat bez błędów BSS - Integralność Słowo kontrolne CRC (ang. Cyclic Redundancy Check) Przykład dekodowania – brak błędów 1001 1101 1000 1011 1100 Nadmiar m mod c 10011010101 Odebrany komunikat bez błędów Wynik: Poprawny test CRC G(x) = x3 x2 1 = 1101 Generator P(x) = x10 x7 x6 x4 x2 1 = 10011010101 Odebrany komunikat 1101 01-2014 Zygmunt Kubiak
Realizacja sprzętowa – analog wielomianu G(x) BSS - Integralność CRC (ang. Cyclic Redundancy Check) Realizacja sprzętowa – analog wielomianu G(x) G(x) = x4 x 1 01-2014 Zygmunt Kubiak
Realizacja sprzętowa - kodowanie BSS - Integralność CRC (ang. Cyclic Redundancy Check) Realizacja sprzętowa - kodowanie G(x) = x4 x 1 01-2014 Zygmunt Kubiak
Realizacja sprzętowa – dekodowanie BSS - Integralność CRC (ang. Cyclic Redundancy Check) Realizacja sprzętowa – dekodowanie G(x) = x4 x 1 01-2014 Zygmunt Kubiak
CRC (ang. Cyclic Redundancy Check) BSS - Integralność CRC (ang. Cyclic Redundancy Check) 01-2014 Zygmunt Kubiak
CRC (ang. Cyclic Redundancy Check) BSS - Integralność CRC (ang. Cyclic Redundancy Check) G(x) = x3 x 1 01-2014 Zygmunt Kubiak
CRC (ang. Cyclic Redundancy Check) BSS - Integralność CRC (ang. Cyclic Redundancy Check) 01-2014 Zygmunt Kubiak G(x) = x3 x 1
CRC (ang. Cyclic Redundancy Check) – dwie realizacje G(x) BSS - Integralność CRC (ang. Cyclic Redundancy Check) – dwie realizacje G(x) Realizacja sprzętowa układu dzielącego G(x) = x3 x 1 Wada – dane przy kodowaniu trzeba uzupełnić o r bitów (same zera) Zmodyfikowana, sprzętowa realizacja układu wyznaczającego CRC dla G(x) = x3 x 1 01-2014 Zygmunt Kubiak
BSS - Integralność CRC (ang. Cyclic Redundancy Check) Realizacja sprzętowa – kodowanie – inna realizacja – szybsza operacja kodowania + Wejście danych x3 SQ 2 1 x0 x2 G(x) = x3 x2 1 01-2014 Zygmunt Kubiak
Realizacja sprzętowa – dekodowanie inna realizacja BSS - Integralność CRC (ang. Cyclic Redundancy Check) Realizacja sprzętowa – dekodowanie inna realizacja + Wejście danych x3 SQ 2 1 x0 x2 01-2014 Zygmunt Kubiak
Generator pseudolosowy BSS - Integralność CRC (ang. Cyclic Redundancy Check) Generator pseudolosowy G(x) = x4 x 1 01-2014 Zygmunt Kubiak
Wielomiany generujące BSS - Integralność CRC (ang. Cyclic Redundancy Check) Wielomiany generujące CRC C(x) CRC-8 x8 x2 x1 1 (0x107 => 0x07) CRC-10 x10 x9 x5 x4 x1 1 (0x633) CRC-12 x12 x11 x3 x2 x1 1 (0x180F) CRC-16 x16 x15 x2 1 (0x18005 => 0x8005) CRC-CCITT x16 x12 x5 1 (0x11021 => 0x1021) CRC-32 x32 x26 x23 x22 x16 x12 x11 x10 x8 x7 x5 x4 x2 x1 1 (0x104C11DB7 => 0x04C11DB7) 01-2014 Zygmunt Kubiak
Przykłady BSS - Integralność CRC (ang. Cyclic Redundancy Check) Podstawowy algorytm CRC-32 01-2014 Zygmunt Kubiak
Przykłady BSS - Integralność CRC (ang. Cyclic Redundancy Check) Modyfikacja algorytmu CRC-32 01-2014 Zygmunt Kubiak
CRC (ang. Cyclic Redundancy Check) BSS - Integralność CRC (ang. Cyclic Redundancy Check) Przykład - tablicowy algorytm CRC-32 Wygenerowanie tablicy cd 01-2014 Zygmunt Kubiak
CRC (ang. Cyclic Redundancy Check) BSS - Integralność CRC (ang. Cyclic Redundancy Check) Przykład - tablicowy algorytm CRC-32 Wyznaczenie CRC-32 z wykorzystaniem tablicy cd 01-2014 Zygmunt Kubiak
BSS - Integralność Algorytm Modbus – wyznaczanie CRC Załadowanie FFFFh do 16-bitowego rejestru CRC. Pobranie bajta z bloku danych i wykonanie operacji XOR. z młodszym bajtem rejestru CRC (CRCL0) – wynik do rej. CRC. Przesunięcie zawartości rejestru CRC w prawo o jeden bit (na pozycje MSB zostaje wpisane 0). Sprawdzenie bitu LSB w rejestrze CRC. Jeżeli jego stan jest 0, to następuje powrót do pkt. 3, jeżeli 1, to wykonywana jest operacja XOR rejestru CRC ze stałą A001h Powtórzenie operacji 2, 3, 4, 5 dla kolejnego bajta wiadomości. Krok 6 jest wykonywany dla wszystkich bajtów wiadomości. Zawartość rejestru CRC po wykonaniu wszystkich powyższych operacji jest poszukiwaną wartością CRC Uwaga, dla Modbus wielomianem generującym jest G(x) = x16 + x15 + x2 + 1 01-2014 Zygmunt Kubiak
BSS - Integralność Modbus – wyznaczanie CRC G(x) = x16 + x15 + x2 + 1 LSB == 1 G(x) = x16 + x15 + x2 + 1 01-2014 Zygmunt Kubiak
BSS - Integralność Modbus – wyznaczanie CRC void main() { unsigned char data[NUMDATA+2]; // Bufor wiadomości unsigned char Crc_HByte, Crc_LByte; unsigned int Crc; .... Crc=0xFFFF; for (i=0; i<NUMDATA; i++) Crc = CRC16 (Crc, data[i] ); } Crc_LByte = (Crc & 0x00FF); // Low byte calculation Crc_HByte = (Crc & 0xFF00) / 256; // High byte calculation 01-2014 Zygmunt Kubiak
BSS - Integralność Modbus – wyznaczanie CRC // CRC16 calculation // ---------------- unsigned int CRC16(unsigned int crc, unsigned int data) { const unsigned int Poly16=0xA001; unsigned int LSB, i; crc = ((crc^data) | 0xFF00) & (crc | 0x00FF); for (i=0; i<8; i++) LSB=(crc & 0x0001); crc=crc/2; if (LSB) crc=crc^Poly16; } return(crc); 01-2014 Zygmunt Kubiak
Dziękuję Zygmunt Kubiak 09-2006