- Introdução no CRC cálculos
- Livre CRC rotinas de cálculo para download
Introdução no CRC cálculos
Sempre que os dados digitais são armazenados ou interface, corrupção de dados pode ocorrer. Desde o início da ciência da computação, as pessoas têm pensado em maneiras de lidar com este tipo de problema., Para os dados seriais eles vieram com a solução para anexar um bit de paridade a cada byte enviado. Este mecanismo de detecção simples funciona se um número ímpar de bits em um byte muda, mas um número par de bits falsos em um byte não será detectado pela verificação de paridade. Para superar este problema, as pessoas procuraram por mecanismos de som matemáticos para detectar vários bits falsos. O cálculo CRC ou verificação de redundância cíclica foi o resultado disso. Hoje em dia, os cálculos CRC são usados em todos os tipos de comunicações. Todos os pacotes enviados por uma ligação de rede são verificados com um CRC., Também cada bloco de dados em seu disco rígido tem um valor CRC ligado a ele. O mundo moderno dos computadores não pode passar sem estes cálculos CRC. Então vamos ver por que eles são tão amplamente utilizados. A resposta é simples, eles são poderosos, detectar muitos tipos de erros e são extremamente rápidos para calcular especialmente quando chips de hardware dedicados são usados.
pode-se pensar que, usando um checksum pode substituir cálculos CRC adequados. É certamente mais fácil calcular um checksum, mas os checksums não encontram todos os erros. Vamos pegar um texto de exemplo e calcular um checksum de um byte., A cadeia de exemplo é “Lammert” que converte para os valores ASCII . O checksum de um byte deste array pode ser calculado adicionando todos os valores, do que dividindo-o por 256 e mantendo o restante. O checksum resultante é 210. Você pode usar a calculadora acima para verificar este resultado.
neste exemplo temos usado um checksum de um byte longo que nos dá 256 valores diferentes. Usando um checksum de dois bytes resultará em 65.536 possíveis valores de checksum diferentes e quando um valor de quatro bytes é usado há mais de quatro bilhões de valores possíveis., Podemos concluir que com um checksum De quatro bytes a chance de que acidentalmente não detectamos um erro é inferior a 1 a 4 bilhões. Parece bastante bom, mas isto é apenas teoria. Na prática, bits não mudam puramente aleatórios durante as comunicações. Muitas vezes falham em rajadas, ou devido a picos elétricos. Vamos assumir que em nossa matriz de exemplo o menor pedaço significativo do personagem ‘L’ é definido, e o menor pedaço significativo do personagem ‘a’ é perdido durante a comunicação. O receptor verá a matriz representando a string “m’ammert”., O checksum para esta nova string ainda é de 210, mas o resultado é obviamente errado, apenas depois de dois bits alterados. Mesmo que tivéssemos usado um checksum De quatro bytes de comprimento, não teríamos detectado este erro de transmissão. Assim, calcular um checksum pode ser um método simples para detectar erros, mas não dá muito mais proteção do que o bit de paridade, independente do comprimento do checksum.
a ideia por trás de um cálculo do valor de verificação é simples. Use uma função F (sval,sval) que introduz um byte de dados e um valor de verificação e produz um valor de verificação recalculado., De fato, cálculos de checksum como descrito acima podem ser definidos desta forma. Nosso exemplo de um byte checksum poderia ter sido calculado com a seguinte função (na linguagem C) que chamamos repetidamente para cada byte na string de entrada. O valor inicial para o cval é 0.
int F_chk_8( int bval, int cval ) { retun ( bval + cval ) % 256;}
A idéia por trás do cálculo de erros de CRC é olhar para os dados como um grande número binário. Este número é dividido por um determinado valor e o restante do cálculo é chamado de CRC., Dividindo no cálculo CRC no início olha para custar um monte de poder de computação, mas ele pode ser realizado muito rapidamente se nós usamos um método semelhante ao aprendido na escola. Nós vamos como exemplo calcular o restante para o caráter ‘m’—que é 1101101 em notação binária-dividindo-o por 19 ou 10011. Por favor, note que 19 é um número ímpar. Isto é necessário, como veremos mais adiante. Por favor, consulte seus livros escolares como o método de cálculo binário aqui não é muito diferente do método decimal que você aprendeu quando era jovem. Pode parecer um pouco estranho., Também as notações diferem de país para país, mas o método é semelhante.
1 0 1 = 5 -------------1 0 0 1 1 / 1 1 0 1 1 0 1 1 0 0 1 1 | | --------- | | 1 0 0 0 0 | 0 0 0 0 0 | --------- | 1 0 0 0 0 1 1 0 0 1 1 --------- 1 1 1 0 = 14 = remainder
Com decimais cálculos você pode verificar rapidamente se 109 divididos por 19 apresenta um quociente de 5 com 14 como o restante. Mas o que também vemos no esquema é que cada bit extra para verificar só custa uma comparação binária e em 50% dos casos uma subtração binária., Você pode facilmente aumentar o número de bits da cadeia de dados de teste—por exemplo, para 56 bits se usarmos o nosso valor de exemplo “Lammert”—e o resultado pode ser calculado com 56 comparações binárias e uma média de 28 subtrações Binárias. Isto pode ser implementado em hardware diretamente com apenas muito poucos transistores envolvidos. Também algoritmos de software podem ser muito eficientes.
para cálculos CRC, não é usada subtração normal, mas todos os cálculos são feitos modulo 2. Nessa situação você ignora carregar bits e, com efeito, a subtração será igual a uma exclusiva ou operação., Isto parece estranho, o restante resultante tem um valor diferente, mas de um ponto de vista algébrico a funcionalidade é igual. Uma discussão sobre isso necessitaria de conhecimento de nível universitário da teoria algébrica do campo e eu acho que a maioria dos leitores não estão interessados nisto. Por favor, veja o final deste documento para livros que discutam isso em detalhes.
Agora temos um método de cálculo CRC que é implementável em hardware e software e também tem um sentimento mais Aleatório do que calcular um checksum comum. Mas como funcionará na prática quando um ou mais bits estão errados?, Se escolhermos o divisor-19 no nosso exemplo-para ser um número ímpar, você não precisa de matemática de alto nível para ver que cada erro de bits será detectado. Isto é porque cada simples erro de bit permitirá que o dividendo mude com um poder de 2. Se, por exemplo, o bit n muda de 0 para 1, o valor do dividendo vai aumentar com 2n. Se, por outro lado bit n muda de 1 para 0, o valor do dividendo irá diminuir com 2n. Porque você não pode dividir qualquer potência de dois por um número ímpar, o restante do cálculo de erros de CRC vai mudar e que o erro não vai passar despercebida.,
A segunda situação que queremos detectar é quando dois bits simples mudam nos dados. Isto requer alguma matemática que pode ser lida no livro de Tanenbaum mencionado abaixo. Você precisa selecionar seu divisor com muito cuidado para ter certeza de que independente da distância entre os dois bits errados você sempre vai detectá-los. Sabe-se que os valores comumente usados 0x8005 e 0x1021 dos cálculos CRC16 e CRC-CCITT apresentam um desempenho muito bom nesta questão., Por favor, note que outros valores podem ou não, e você não pode calcular facilmente qual o valor divisor que é apropriado para detectar erros de dois bits e que não é. conte com uma extensa pesquisa matemática sobre este assunto feita há algumas décadas por matemáticos altamente qualificados e use os valores que essas pessoas obtiveram.
além disso, com o nosso cálculo CRC queremos detectar todos os erros onde um número ímpar de bits muda. Isto pode ser conseguido usando um divisor com um número par de bits. Usando a matemática modulo 2 você pode mostrar que todos os erros com um número ímpar de bits são detectados., Como já disse antes, na matemática modulo 2, a função de subtração é substituída pela função exclusiva. Há quatro possíveis operações XOR.
0 XOR 0 => 0 even => even0 XOR 1 => 1 odd => odd1 XOR 0 => 1 odd => odd1 XOR 1 => 0 even => even
Nós vemos que, para todas as combinações de valores de bit, a estranheza da expressão permanece o mesmo. Ao escolher um divisor com um número par de bits, a imparidade do restante é igual à imparidade do dividendo. Portanto, se a imparidade do dividendo muda porque um número ímpar de bits muda, o restante também irá mudar., Assim, todos os erros que alteram um número ímpar de bits serão detectados por um cálculo CRC que é realizado com tal divisor. Você pode ter visto que os valores de divisor comumente usados 0x8005 e 0x1021 na verdade têm um número ímpar de bits, e nem mesmo como indicado aqui. Isto é porque dentro do algoritmo existe um “hidden” extra bit 216 que faz com que o real valor divisor usado 0x18005 e 0x11021 dentro do algoritmo.,
Por último, mas não menos importante, queremos detectar todos os erros de ruptura com o nosso cálculo CRC com um comprimento máximo a ser detectado, e todos os erros de ruptura mais longo a ser detectado com uma alta probabilidade. Um erro de explosão é bastante comum nas comunicações. É o tipo de erro que ocorre por causa do relâmpago, troca de relés, etc. onde durante um pequeno período Todos os bits são configurados para um., Para realmente entender isso, você também precisa ter algum conhecimento do modulo 2 álgebra, então, aceitar que, com um 16 bits divisor você vai ser capaz de detectar todas as rajadas, com um comprimento máximo de 16 bits, e todas as rajadas mais com, pelo menos, 99.997% de certeza.
numa abordagem matemática pura, o cálculo de CRC é escrito como cálculos polinomiais. O valor divisor é muitas vezes não descrito como um número binário, mas um polinômio de certa ordem. Na vida normal alguns polinômios são usados mais frequentemente do que outros., Os três utilizados no cálculo do CRC on-line nesta página são o crc16 de 16 bits de largura e o CRC-CCITT e o CRC32 de 32 bits de largura. Este último é provavelmente o mais utilizado agora, porque, entre outros, é o gerador CRC para toda a verificação e validação do tráfego de rede.
para todos os três tipos de cálculos CRC eu tenho uma biblioteca de software livre disponível. O programa de teste pode ser usado diretamente para testar arquivos ou strings. Você também pode olhar para os códigos fonte e integrar essas rotinas CRC em seu próprio programa., Por favor, esteja ciente dos valores de inicialização do cálculo CRC e possível pós-processamento necessário, como bits de flipping. Se você não fizer isso você pode obter resultados diferentes do que outras implementações de CRC. Todo este pré e pós-processamento é feito no programa de exemplo para que não deve ser difícil fazer a sua própria implementação funcionar. Um teste usado comum é calcular o valor CRC para a cadeia ASCII “123456789”., Se o resultado de sua rotina corresponder ao resultado do programa de teste ou o resultado neste site, sua implementação está funcionando e compatível com a maioria das outras implementações.
apenas como referência as funções polinomiais para os cálculos CRC mais comuns. Por favor, lembre-se que o termo de ordem mais alta do polinômio (x16 ou x32) não está presente na representação dos números binários, mas implícito pelo algoritmo em si.,
Literatura | ||
2002 | Redes de computadores, descrevendo rede comum de sistemas e a teoria e algoritmos por trás de sua implementação. | Andrew S. Tanenbaum |
vários | a arte da Programação Informática é a principal referência para algoritmos semi-numéricos. Cálculos polinomiais são descritos em profundidade. Algum nível de matemática é necessário para entendê-lo completamente embora.Donald E. Knuth 3.,0, ou protocolo distribuído de rede é um protocolo de comunicação projetado para uso entre computadores de subestação, unidades de terminais remotos RTUs, dispositivos eletrônicos inteligentes IEDs e estações-mestre para a indústria de utilidades elétricas. Actualmente, é também utilizado em indústrias familiares como o tratamento de águas residuais, os transportes e a indústria do petróleo e do gás. | DNP Grupo de Usuário |
Deixe uma resposta