TecnicasdeDetecodeErros PDF
TecnicasdeDetecodeErros PDF
TecnicasdeDetecodeErros PDF
Pelotas
Outubro de 2002
1 Introdução
A transmissão de informação através de sistemas de comunicação pressupõe a
passagem de sinais através dos meios físicos de comunicação que compõem as redes.
Nesse contexto, diversos fenômenos podem motivar a ocorrência de erros, tais como:
ruídos eletromagnéticos, falhas de sincronização entre transmissor e receptor, indução
devido à proximidade da linha de dados a fios de alta tensão, defeitos em componentes
eletrônicos envolvidos na transmissão/recepção e etc. Na impossibilidade de eliminar
totalmente esses fenômenos, sistemas de comunicação devem ser projetados de forma a
permitir a recuperação da informação perdida ou defeituosa.
O primeiro passo para qualquer esquema de tratamento de erros é a sua detecção.
Reconhecer que um quadro 1 foi recebido com erro irá permitir que se tome as
providências necessárias, que poderão variar de acordo com as necessidades das
aplicações e com as características dos dados transmitidos.
Quando um erro é detectado, existem duas estratégias básicas a se adotar (Figura 1).
Numa, o receptor pode tentar corrigir o erro. Na outra, o receptor simplesmente pede a
retransmissão dos dados. Estas estratégias são conhecidas respectivamente por:
? Códigos de Correção de Erros: Em cada bloco de dados enviado, são
incluídas informações redundantes suficientes para que o receptor possa
deduzir qual a informação correta transmitida;
? Códigos de Detecção de Erros: São incluídas informações suficientes
para o receptor deduzir que houve um erro, mas sem identificar qual, e
solicitar uma nova transmissão.
Nesse trabalho, enfocaremos os códigos de detecção de erros.
1
Quadro é a denominação dada a uma quantidade x de bits que é enviada de um transmissor para um
receptor.
2
2 Códigos de Detecção de Erros
A grande maioria dos métodos de detecção de erros é baseada na inserção de bits
extras na informação transmitida. Esses bits consistem em informação redundante, isto
é, que pode ser obtida através da informação original e o seu conjunto é conhecido por
CheckSum. O CheckSum é computado pelo transmissor através de algum algoritmo que
tem como entrada os bits originais a serem transmitidos. Após computar esses bits, o
transmissor os acrescenta aos bits de informação propriamente dita, para então
prosseguir com a transmissão do quadro. Quando o quadro é recebido, o receptor,
conhecendo o algoritmo utilizado pelo transmissor, pode recomputar os bits de
redundância e compará-los com os respectivos bits recebidos no quadro. Se eles forem
diferentes, detectou-se a presença de um erro.
Para ilustrar melhor o mecanismo de detecção de erros consideremos um
algoritmo para o cálculo do CheckSum que simplesmente soma algebricamente todos os
bits de uma palavra. Então, para a palavra 11001100, o processo seria descrito pelo
esquema abaixo.
2.1 Ecoplexing
3
Caractere transmitido
Receptor
Transmissor
Caractere recebido
2.2 Paridade
Caso haja um número par de bits com erro, a técnica não consegue detectar, pois
a verificação de bits 1s do caractere recebido permanecerá par ou ímpar. Devido a esta
situação esse método é ineficiente quando existem picos de ruído na linha, que
freqüentemente induzem erros em vários bits consecutivos.
Existem mecanismos melhorados que utilizam a paridade e permitem diminuir
significativamente a probabilidade de um erro não ser detectado.
O LRC (“Longitudinal Redundancy Check”) realiza a mesma operação
longitudinalmente para os caracteres transmitidos num bloco de informação. No final do
bloco é acrescentado um caractere de paridade. Cada bit desse caractere está associado
aos mesmos bits dos caracteres transmitidos. A tabela seguinte exemplifica este
mecanismo para um bloco de 10 caracteres de 8 bits cada:
4
Paridade
Caractere 1º 2º 3º 4º 5º 6º 7º 8º 9º 10º
(LRC)
bit 0 1 1 0 1 0 1 1 0 1 0 0
bit 1 0 1 0 1 0 1 1 0 1 0 1
bit 2 1 0 0 1 0 0 1 0 0 1 0
bit 3 1 0 0 1 1 0 0 0 0 1 0
bit 4 1 0 1 1 1 1 0 0 0 1 0
bit 5 1 0 1 0 0 1 0 0 1 1 1
bit 6 0 0 0 0 1 1 1 0 1 1 1
bit 7 0 0 0 1 0 0 1 0 1 1 0
Nesse esquema além, além da paridade de caracter, instala-se uma paridade para
o bloco de caracteres, permitindo-se a detecção e recuperação de 1 erro por caracter , a
detecção de dois erros por caracter, e havendo falha de detecção no caso de erros
quádruplos.
A paridade vertical (VRC), consiste em acrescentar um bit de paridade para cada
caracter transmitido. Enquanto que a paridade longitudinal (LRC), consiste em
acrescentar um bit de paridade para cada nível de bit dentro do byte de um bloco,
inclusive para o bit de paridade vertical. À utilização desses dois métodos (VRC +
LRC) em conjunto, dá-se o nome de Paridade Combinada.
A paridade combinada possibilita a formação do bloco de checagem do caracter
(BCC), obtido de todos os bits formados pelo VRC e LRC. Quando a mensagem chegar
ao destino, o equipamento receptor calcula um novo BCC a partir dos bits recebidos e
compara-o com o BCC recebido ao final da mensagem (que foi calculado pelo
equipamento transmissor).
Ocorrendo igualdade entre esses BCCs, a mensagem recebida será considerada
correta, sendo aceita e processada. Caso contrário, a mensagem será considerada
incorreta, pedindo-se assim uma retransmissão.
Paridade
Caractere 1º 2º 3º 4º 5º 6º 7º 8º 9º 10º
(LRC)
bit 0 1 1 0 1 0 1 1 0 1 0 0
bit 1 0 1 0 1 0 1 1 0 1 0 1
bit 2 1 0 0 1 0 0 1 0 0 1 0
bit 3 1 0 0 1 1 0 0 0 0 1 0
bit 4 1 0 1 1 1 1 0 0 0 1 0
bit 5 1 0 1 0 0 1 0 0 1 1 1
bit 6 0 0 0 0 1 1 1 0 1 1 1
bit 7 0 0 0 1 0 0 1 0 1 1 0
Paridade
1 0 0 0 1 1 1 0 1 0
(VCR)
5
2.3 Cyclic Redundancy Check (CRC)
No início deste capítulo, mostramos como uma mensagem corrompida pode ser
detectada através de uma fórmula simples para o cálculo do checksum. Apesar de
funcionar para alguns casos, a fórmula utilizada (soma algébrica dos bits) não é bastante
genérica e pode acontecer de quadros inválidos serem aceitos como válidos
freqüentemente. Por exemplo, a mensagem 11001100 poderia ser corrompida e ser
transformada em 11011000, embora incorreta, a mensagem recebida seria aceita porque
ambas geram 100 como checksum. Esse problema pode ser resolvido usando algum
algoritmo mais sofisticado para o cálculo do checksum.
O método de detecção de erros mais utilizado atualmente é o Código CRC
(cyclic redundancy check), também conhecido código polinomial. A idéia básica dos
algoritmos CRC é dividir a cadeia de bits por uma outra cadeia de bits e utilizar o resto
dessa divisão como checksum. O termo “polinomial” é devido ao fato de os códigos
CRC tratarem as cadeias de bits como polinômios de coeficientes 0 e 1 apenas. Um
quadro de k bits é considerado como o conjunto de coeficientes de um polinômio de k
termos e ordem k-1. Por exemplo, 110001 tem 6 bits e, portanto, representa um
polinômio de 6 termos com os coeficientes 1, 1, 0, 0, 0 e 1: x5 +x4 +x0 .
A aritmética polinomial é feita na base 2, de acordo com as regras da teoria
algébrica. Não há transportes para a adição nem empréstimos para a subtração. Tanto a
adição quanto a subtração são idênticas à operação OU EXCLUSIVO.
0+0=0 0–0=0
0+1=1 0 – 1 = 1 (sem empréstimo)
1+0=1 1–0=1
1 + 1 = 1 (sem transporte) 1–1=1
Assim:
1101
x 1011
1101
1101
0000
1101
1111111
A divisão longa é feita da mesma maneira que em código binário, exceto pelo
fato de na subtração não haver empréstimos, como mostrado anteriormente. Diz-se que
um divisor “vai para” o dividendo caso o dividendo tenha tantos bits quanto o divisor.
Para efetuar o cálculo CRC precisamos de um divisor, esse divisor é chamado de
polinômio gerador. Qualquer polinômio pode ser escolhido, porém uns são melhores
6
do que os outros. A magnitude ou ordem do polinômio é muito importante. Ela é a
posição real do bit de maior significância. Assim, o polinômio 11001 tem magnitude m
igual 4 (e não 5) pois será representado pelo polinômio x4 +x3 +x0 .
Escolhido um polinômio gerador, podemos passar ao cálculo CRC. Este é uma
divisão simples dos dados originais pelo polinômio gerador usando a aritmética CRC. O
único truque é que m bits 0, correspondentes à ordem do polinômio gerador, são
concatenados com a mensagem original. Temos:
1100001010
10011 11010110110000
10011
10011
10011
00001
00000
00010
00000
00101
00000
01011
00000
10110
10011
01010
00000
10100
10011
01110
00000
Resto - - ? 1110
7
Dessa divisão sai um quociente e um resto. O resto é o nosso checksum.
Usualmente o checksum é concatenado à mensagem original e transmitido. Mas, para
entrar em acordo com a base matemática, que será vista adiante, consideraremos que o
resto da divisão (checksum) será subtraído do polinômio aumentado. No nosso caso, o
quadro transmitido será: 11010110111110.
Ao receber o quadro, o receptor pode fazer duas coisas:
1. Separar a mensagem original do checksum. Calcular o checksum para a
mensagem (depois de concatenar m zeros) e comparar os dois checksums.
2. Calcular o checksum para todo o quadro recebido, se houver algum resto
é porque aconteceu um erro.
As duas opções são equivalentes, porém a segunda é matematicamente mais
limpa. A base matemática para a opção 2 é a seguinte: O quadro recebido deverá ser
divisível (em módulo 2) pelo polinômio gerador. Em qualquer problema de divisão, se
diminuirmos o dividendo pelo resto, o resultado é divisível pelo divisor. Por exemplo,
na base 10, se você dividir 210278 por 10941, o resto será 2399. Quando você subtrai
2399 de 210278, o resto (207879) é divisível por 10941. Por isso, consideramos acima
que o checksum é subtraído do polinômio aumentado.
Para o método do código polinomial ser empregado, o transmissor e o receptor
devem concordar em relação ao polinômio gerador.
8
até o maior tamanho do quadro). São conhecidos polinômios simples, de grau baixo que
protegem quadros longos. Por exemplo, x15 +x14 +1 não dividirá xk +1 para qualquer valor
de k abaixo de 32768.
Se houver um nº ímpar de bits com erros, E(x) conterá um nº ímpar de termos. O
mais interessante é que não há um polinômio com número ímpar de termos que tenha
x+1 como fator no sistema de módulo 2. Ao tornar x+1 um fator de G(x), podemos
detectar todos os erros que consistem em um nº ímpar de bits invertidos.
Para confirmar que nenhum polinômio com um número ímpar de termos será
divisível por x+1, suponha que E(x) tem um nº ímpar de termos e é divisível por x+1.
Fatore E(x) em (x+1)Q(x). Agora avalie E(1)=(1+1)Q(1). Como 1+1=0 (em módulo 2),
E(1) deve ser igual a zero. Se E(x) tiver um nº ímpar de termos, a utilização de 1 no
lugar de x sempre produzirá 1 como resultado. Portanto, nenhum polinômio com um nº
ímpar de termos será divisível por x+1.
Por último, e mais importante, um código polinomial com r bits de verificação
detectará todos os erros em rajada que tiverem um tamanho £r. Um erro em rajada de
tamanho k pode ser representado por xi(xk-1+...1), onde i denota a distância entre a
rajada e a extremidade direita do quadro recebido. Se contiver um termo x0 , G(x) não
terá xi como fator, portanto, se o grau da expressão entre parênteses for menor do que o
grau de G(x), o resto nunca poderá ser igual a zero.
Se o tamanho da rajada for r+1, o restante da divisão por G(x) só será igual a
zero se a rajada for idêntica a G(x). Por definição, o primeiro e o último bits de uma
rajada devem ser iguais a 1; portanto a correspondência entre os valores dependerá do r-
1 bits intermediários. Se todas as combinações forem consideradas como igualmente
prováveis, a probabilidade desse quadro ser aceito como correto é de 1/2r-1.
Também pode acontecer de uma rajada ser maior que r+1 bits, a probabilidade
de um quadro defeituoso passar sem ser percebido é de 1/2r, pressupondo que todas as
seqüências de bits sejam igualmente prováveis. O mesmo acontece com várias rajadas
curtas.
9
O CRC-32 foi o escolhido pelo comitê IEEE-8022 para ser utilizado em redes
locais, gerando um cheksum de 32 bits.
2.3.3 Implementações
Uma estrutura típica de quadro ethernet é mostrada na Figura 2.1. A parte que
nos interessa é apenas os 4 últimos bytes que é a soma de verificação. Essa, trata-se
efetivamente do checksum, ou seja, é o código de verificação de 32 bits calcula a partir
do polinômio CRC-32 apresentado anteriormente.
2
IEEE 802 é um projeto que têm por objetivo elaborar padrões para redes locais de computadores. Foi
instituído pela IEEE Computer Society em fevereiro de 1980
10
3 Bibliografia
[ALV 94] ALVES, Luiz. Comunicação de Dados, Makron Books, São Paulo. 1994.
[SOA 95] SOARES, Luiz Fernando G & LEMOS, Guido & Colcher, Sérgio. Das Lans,
Mans, e Wans às Redes ATM, Editora Campus. Rio de Janeiro. 1995
11