Prévia do material em texto
Quarta edição F727c Forouzan, Behrouz A. Comunicação de dados e redes de computadores [recurso eletrônico] / Behrouz A. Forouzan com a colaboração de Sophia Chung Fegan ; tradução: Ariovaldo Griesi ; revisão técnica: Jonas Santiago de Oliveira. – 4. ed. – Dados eletrônicos. – Porto Alegre : AMGH, 2010. Editado também como livro impresso em 2008. ISBN 978-85-63308-47-4 1. Comunicação entre computadores. 2. Redes de computadores. I. Fegan, Sophia Chung. II. Título. CDU 004.7 Catalogação na publicação: Ana Paula M. Magnus – CRB-10/Prov-009/10 267 CAPÍTULO 10 Detecção e Correção de Erros As redes de computadores devem ser capazes de transferir dados de um dispositivo a outro com precisão. Para a maior parte das aplicações, uma rede deve garantir que os dados recebidos sejam idênticos àqueles enviados. Em qualquer instante, dados transmitidos de um nó ao nó se- guinte, podem ser corrompidos no caminho. Diversos fatores podem alterar um ou mais bits de uma mensagem. Algumas aplicações exigem mecanismos eficientes para a detecção e correção de erros. Os dados podem ser corrompidos durante uma transmissão. Algumas aplicações exigem que os erros sejam detectados e corrigidos. Algumas aplicações são capazes de tolerar certo nível reduzido de erros. Por exemplo, erros aleatórios em transmissões de áudio e vídeo podem ser toleráveis, mas, quando transferimos texto, esperamos alto grau de precisão. 10.1 INTRODUÇÃO Iremos discutir, inicialmente, as questões relacionadas, direta ou indiretamente, à detecção e à correção de erros. Tipos de erros Toda vez que uma cadeia de bits flui de um ponto a outro de uma rede de computadores, eles es- tão sujeitos a alterações imprevisíveis por causa das interferências. Essas interferências podem modificar as características do sinal. Em um erro de bit, um 0 passa a ser 1 e um 1 passa a ser 0. Em um erro em rajada, vários bits são corrompidos. Por exemplo, uma rajada de 1/100 s de ruídos impulsivos em uma transmissão com uma taxa de dados de 1.200 bps poderia alterar todos os 12 bits de informação ou parte deles. Erro de Bit O termo erro de bit significa que apenas 1 bit de determinada unidade de dados (por exemplo, um byte, caractere ou pacote) foi alterado de 1 para 0 ou de 0 para 1. Identificação interna do documento 268 CAPÍTULO 10 DETECÇÃO E CORREÇÃO DE ERROS Em um erro de bit, apenas 1 bit na unidade de dados é alterado. A Figura 10.1 mostra o efeito do erro de bit sobre uma unidade de dados. Para compreender o impacto desse problema, imagine que cada grupo de 8 bits seja um caractere ASCII com um bit 0 adicionado à esquerda. Na Figura 10.1, o caractere 00000010 (ASCII STX) foi enviado, significan- do início de texto (start of text), mas, foi recebido 00001010 (ASCII LF), significando avanço de linha (line feed). (Para mais informações sobre o código ASCII, ver o Apêndice A.) Figura 10.1 Erro de bit 0 0 0 0 1 0 1 00 0 0 0 0 0 1 0 Enviado Recebido 0 foi alterado para 1 Os erros de bit são o tipo de erro de menor probabilidade de ocorrência em uma transmissão de dados serial. Para compreender isso, imagine que dados são enviados a 1 Mbps. Isso significa que a duração de cada bit é de apenas 1/1.000.000 s, ou seja, 1 µs. Para que ocorra um erro em um único bit, o ruído deve ter uma duração de 1 µs, o que é muito raro na prática; normalmente os ruídos duram muito mais que isso. Erros em Rajada O termo erros em rajada significa que 2 ou mais bits na unidade de dados foram corrompidos. Um erro em rajada significa que 2 ou mais bits na unidade de dados foram corrompidos. A Figura 10.2 ilustra o efeito de um erro em rajada sobre uma unidade de dados. Nesse caso, foi enviado 0100010001000011, mas o recebido foi, na realidade, 0101110101100011. Observe que um erro em rajada não significa, necessariamente, que os erros ocorrem em bits consecuti- vos. O comprimento da rajada é medido do primeiro bit corrompido até o último. Pode ser que alguns bits entre estes não tenham sido corrompidos. Figura 10.2 Erro em rajada de comprimento 8 Enviado 0 1 0 1 1 1 0 1 0 1 1 0 0 0 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 Recebido Bits corrompidos Comprimento do erro em rajada (8 bits) É mais provável a ocorrência de erros em rajada que a ocorrência do erro de bit. Normal- mente, a duração do ruído é maior que a duração de 1 bit, o que significa que quando o ruído afeta os dados, ele afeta um conjunto de bits. O número de bits afetados depende da taxa de Identificação interna do documento transmissão de dados e da duração do ruído. Por exemplo, se estivermos enviando dados a 1 kbps, um ruído de 1/100 s pode afetar 10 bits; se estivermos enviando dados a 1 Mbps, o mes- mo ruído pode afetar 10.000 bits. Redundância O conceito mais importante na detecção e correção de erros é a redundância. Para sermos ca- pazes de detectar ou corrigir erros, precisamos enviar alguns bits extras redundantes junto com os dados. Esses bits redundantes são acrescentados pelo emissor e posteriormente retirados pelo receptor. Sua presença possibilita que o receptor detecte ou corrija bits corrompidos. Para detectar ou corrigir erros, precisamos enviar bits extras (redundantes) juntos com os dados. Detecção versus Correção Corrigir erros em uma transmissão de dados é muito mais difícil que a detecção. Na detecção de erros, estamos apenas verificando se ocorreu algum erro. A resposta é um simples sim ou não. Nem mesmo estamos interessados na quantidade. Para nós, o erro em um único bit provoca o mesmo efeito que um erro em um bloco de bits, ou seja, a mensagem está corrompida. Na correção de erros, precisamos saber o número exato de bits que foram corrompidos e, mais importante, sua localização na mensagem. O número de erros e o tamanho da mensagem são fatores essenciais. Se precisarmos corrigir um único erro em uma unidade de dados de 8 bits, podemos considerar oito localizações possíveis de erro; se precisarmos corrigir dois erros em uma unidade de dados de mesmo tamanho, teremos de considerar 28 possibilidades. Pode-se ima- ginar a dificuldade do receptor para corrigir dez erros em uma unidade de dados de 1.000 bits. Correção Antecipada de Erros versus Retransmissão Existem dois métodos principais de correção de erros. Na correção antecipada de erros (Forward Error Correction), o receptor tenta adivinhar a mensagem pelo uso de bits redundantes. Isso é possível, como veremos mais tarde, se a quantidade de erros for pequena. Na correção de erros por retransmissão o receptor detecta a ocorrência de um erro e solicita ao emissor para reenviar a mensagem. O reenvio é repetido até a mensagem chegar no receptor livre de erros (normal- mente, nem todos os erros podem ser detectados). Códigos de Erros A redundância pode ser implementada por meio de vários métodos de codificação. O emissor adiciona bits redundantes por meio de um processo que crie uma relação entre os bits redun- dantes e os bits de dados reais. O receptor verifica essas relações entre os dois conjuntos de bits para detectar ou corrigir os erros. A razão entre os bits redundantes e os bits de dados reais, bem como a eficiência do processo, são fatores determinantes em qualquer esquema de codificação. A Figura 10.3 mostra o conceito geral de codificação. Podemos dividir os códigos de erros em duas categorias amplas: códigos de blocos e có- digos convolucionais. Neste livro, iremos nos concentrar apenas nos códigos de bloco, pois os códigos convolucionais são mais complexos e estão fora do escopo deste livro. SEÇÃO 10.1 INTRODUÇÃO 269 Identificação interna do documento 270 CAPÍTULO 10 DETECÇÃO E CORREÇÃO DE ERROS Figura 10.3 A estrutura de um codificador e decodificador Transmissão não confiável Gerador Mensagem Mensagem e redundância Emissor Codificador Decodificador Receptor Mensagem Corrigir ou descartar Informações recebidas Verificador Neste livro, nos concentraremosnos códigos de blocos; deixaremos os códigos convolucionais para textos mais avançados. Aritmética Modular Antes de encerrarmos essa seção, vamos discutir brevemente um conceito básico da computação e essencial para a correção e detecção de erros: a aritmética modular. Nosso intento aqui não é o de nos aprofundarmos na matemática deste tópico; apresentaremos apenas as informações necessárias para dar uma base aos materiais que serão discutidos neste capítulo. Na aritmética modular, utilizamos apenas um intervalo limitado de inteiros. Definimos um limite superior, denominado módulo N. Em seguida, usamos somente os inteiros de 0 a N – 1, inclusive. Esse é o módulo aritmético N. Por exemplo, se o módulo for 12, usamos só os inteiros de 0 a 11, inclusive. Um exemplo de módulo aritmético é nosso sistema horário (relógio). Ele se baseia no módulo aritmético 12, substituindo o número 12 por 0. Em um sistema de módulo N, quando um número for maior que N, ele é dividido por N e o resto é o resultado. Se ele for negativo, são acrescentados tantos Ns quanto necessários para torná-lo positivo. Consideremos novamente o sistema horário (relógio). Se iniciarmos um trabalho às 11 horas da manhã e ele le- var cinco horas, podemos dizer que o trabalho deve ser encerrado às 16 horas ou podemos dizer que ele será finalizado às 4 horas da tarde (a diferença entre 16 e 12 é 4). No módulo aritmético N, usamos apenas os inteiros no intervalo 0 a N – 1, inclusive. A adição e a subtração no módulo aritmético são simples. Não existe o vai um quando adi- cionamos dois dígitos em uma coluna. Também não existe o vem um quando subtraímos um dígito de outro em uma coluna. Módulo Aritmético 2 De nosso particular interesse é o módulo aritmético 2. Nessa aritmética, o módulo N é igual a 2. Podemos usar apenas 0 e 1. As operações nessa aritmética são muito simples. O quadro a seguir mostra como podemos somar ou subtrair 2 bits. Soma: 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 0 Subtração: 0 – 0 = 0 0 – 1 = 1 1 – 0 = 1 1 – 1= 0 Identificação interna do documento Observe, no exemplo anterior, que a adição e a subtração produzem os mesmos resultados. Nessa aritmética, usamos a operação XOR (OU exclusivo) tanto para a adição como para a sub- tração. O resultado de uma operação XOR é 0 se ambos os bits forem iguais; o resultado é 1 se os dois bits forem diferentes. A Figura 10.4 ilustra esta operação. Figura 10.4 Operação XOR em dois bits simples e em duas palavras a. Os dois bits são iguais; portanto, o resultado é 0. b. Os dois bits são diferentes; logo, o resultado é 1. c. Resultado da aplicação da operação XOR. 0 1 = 1 1 0 = 1 0 0 = 0 1 1 = 0+ + + 0 011 0 01 11 1 00 10 1+ + Outro Módulo Aritmético Também usaremos o módulo aritmético N ao longo do livro. O princípio é o mesmo; utilizamos números entre 0 e N – 1. Se o módulo não for 2, a adição e a subtração são distintas. Se obtiver- mos um resultado negativo, adicionamos múltiplos de N suficientes para torná-lo positivo. 10.2 CÓDIGOS DE BLOCOS Nos códigos de blocos, uma mensagem é dividida em blocos, cada um deles com k bits, deno- minados palavras de dados (datawords). Adicionamos r bits redundantes a cada bloco para obter o comprimento n = k + r. Os blocos resultantes de n bits são chamados palavras de código (codewords). Como os r bits extras são escolhidos ou calculados é algo que discutiremos mais adiante. Por enquanto, o importante é saber que temos um conjunto de palavras de dados, cada um dos quais com tamanho k e um conjunto de palavras de código, cada um dos quais de tama- nho n. Com k bits, podemos criar uma combinação de 2k palavras de dados; com n bits, podemos criar uma combinação de 2n palavras de código. Já que n > k, o número de palavras de código possíveis é maior que o número de palavras de dados. O processo de codificação de blocos é uma relação de um-para-um; a mesma palavra de dados é sempre codificada como a mesma palavra de código. Isso significa que temos 2n – 2k palavras de código não usadas. Chamamos tais pala- vras inválidas ou ilegais. A Figura 10.5 mostra a situação. Figura 10.5 Palavras de dados e palavras de código no código de blocos 2k palavras de dados, cada uma das quais de k bits 2n palavras de código, cada uma das quais de n bits (apenas 2 delas são válidas) k bits k bits k bits n bits n bits n bits • • • • • • k SEÇÃO 10.2 CÓDIGOS DE BLOCOS 271 Identificação interna do documento 272 CAPÍTULO 10 DETECÇÃO E CORREÇÃO DE ERROS Exemplo 10.1 A codificação de blocos 4B/5B discutida no Capítulo 4 é um bom exemplo de codificação. Na codifica- ção 4B/5B, k = 4 e n = 5. Conforme já visto, temos 2k = 16 palavras de dados e 2n = 32 palavras de có- digo. Vimos que 16 das 32 palavras de código são usadas para a transmissão de mensagens e o restante, para outros fins ou então não são usadas. Detecção de Erros Como os erros podem ser detectados usando-se os códigos de blocos? Se as duas condições a seguir forem atendidas, o receptor poderá detectar uma mudança na palavra de código original. 1. O receptor tem (ou pode encontrar) uma lista de palavras de código válida. 2. A palavra de código original mudou para uma palavra inválida. A Figura 10.6 ilustra o papel dos códigos de blocos na detecção de erros. Figura 10.6 Processo de detecção de erros na codificação de blocos Extrair Decodificador k bits n bits Palavra de dados Palavra de código Verificador Receptor Transmissão não confiável Codificador k bits n bits Palavra de dados Palavra de código Gerador Emissor Descartar O emissor cria palavras de código a partir das palavras de dados usando um gerador que apli- ca as regras e os procedimentos de codificação (a ser discutido posteriormente). Cada palavra de código transmitida ao receptor pode, eventualmente, ser corrompida durante a transmissão. Se a palavra de código for a mesma que uma das palavras de código válidas, a palavra é aceita; a palavra de dados correspondente será extraída para uso. Se ela não for válida, é descartada. Entretanto, se a palavra de código for corrompida durante a transmissão, mas a palavra recebida ainda coincidir com uma palavra de código válida, o erro permanece sem ser detectado. Esse tipo de codificação é capaz de detectar apenas erros únicos. Dois ou mais erros podem ficar sem serem detectados. Exemplo 10.2 Supondo que k = 2 e n = 3. A Tabela 10.1 apresenta uma lista de palavras de dados e palavras de código. Posteriormente, veremos como derivar uma palavra de código a partir de uma palavra de dados. Tabela 10.1 Exemplo de codificação para detecção de erros (Exemplo 10.2) Palavras de dados Palavras de código 00 000 01 011 10 101 11 110 Identificação interna do documento Supondo que o emissor codifique a palavra de dados 01 como 011 e a envie ao receptor. Considere os seguintes casos: 1. O receptor recebe 011. Trata-se de uma palavra de código válida. O receptor extrai então a palavra de dados 01 dela. 2. A palavra de código é corrompida durante a transmissão e é recebido 111 (o bit mais à esquerda foi corrompido). Esta não é uma palavra de código válida, portanto a palavra de dados será descartada. 3. A palavra de código é corrompida durante a transmissão e 000 é recebido (os dois bits da direita estão corrompidos). Esta é uma palavra de código válida. O receptor extrai incorretamente a pala- vra de dados 00. Os dois bits corrompidos tornaram o erro indetectável. Um código de detecção de erros é capaz de detectar apenas os tipos de erros para os quais ele foi projetado; outros tipos de erros podem permanecer indetectáveis. Correção de Erros Conforme dito anteriormente, a correção de erros é muito mais difícil que a detecção de erros. Na detecção de erros, o receptor precisa saber apenas se a palavra de código recebida é correta ou inválida; na correção de erros, o receptor precisa encontrar (ou adivinhar) a palavra de código quefoi originalmente transmitida. Podemos dizer que precisamos de mais bits redundantes para a correção de erros que para a detecção de erros. A Figura 10.7 mostra o papel da codificação de blocos na correção de erros. Podemos ver que a idéia é a mesma que para a detecção de erros, mas as funções de verificação são muito mais complexas. Figura 10.7 Estrutura do codificador e decodificador na correção de erros Corrigir Decodificador k bits n bits Palavra de dados Palavra de código Verificador Receptor Transmissão não confiável Codificador k bits n bits Palavra de dados Palavra de código Gerador Emissor Exemplo 10.3 Acrescentemos mais bits redundantes ao Exemplo 10.2 para ver se o receptor consegue corrigir um erro sem saber o que realmente foi enviado. Adicionamos 3 bits redundantes à palavra de dados de 2 bits para formar palavras de código de 5 bits. Repetindo, posteriormente, mostraremos como escolher os bits redundantes. Por enquanto, concentremo-nos no conceito de correção de erros. A Tabela 10.2 mostra as palavras de dados e palavras de código. Suponha que a palavra de dados seja 01. O emissor consulta a tabela (ou usa um algoritmo) para criar a palavra de código 01011. A palavra de código é corrompida durante a transmissão síncrona e é recebido 01001 (erro no segundo bit da direita para a esquerda). Primeiro, o receptor descobre que a palavra de código recebida não existe na tabela. Isso significa que ocorreu um erro. (A detecção deve vir antes da correção). O receptor, supondo que haja apenas 1 bit corrompido, usa a seguinte estratégia para adivinhar a palavra de dados correta. SEÇÃO 10.2 CÓDIGOS DE BLOCOS 273 Identificação interna do documento 274 CAPÍTULO 10 DETECÇÃO E CORREÇÃO DE ERROS Tabela 10.2 Código de correção de erros (Exemplo 10.3) Palavra de dados Palavra de código 00 00000 01 01011 10 10101 11 11110 1. Comparando a palavra de código recebida com a primeira palavra de código da tabela (01001 versus 00000), o receptor decide que a primeira palavra de código não é aquela que foi enviada, pois há dois bits diferentes. 2. Pela mesma razão, a palavra de código original não pode ser a terceira ou quarta na tabela. 3. A palavra de código original tem de ser a segunda da tabela, porque esta é a única que difere da palavra de código recebida em 1 bit. O receptor substitui 01001 por 01011 e consulta a tabela para encontrar a palavra de dados 01. Distância de Hamming Um dos mais importantes conceitos associados à codificação para controle de erros é a idéia da distância de Hamming. A distância de Hamming entre duas palavras (do mesmo tamanho) é o número de diferenças entre os bits alinhados correspondentes. A distância de Hamming entre duas palavras x e y será descrita como d(x, y). A distância de Hamming pode ser facilmente encontrada se aplicarmos a operação XOR (⊕) entre duas palavras e contarmos o número de 1s do resultado. Note que a distância de Hamming é um valor maior que zero. A distância de Hamming entre duas palavras é o número de diferenças entre bits correspondentes. Exemplo 10.4 Encontremos a distância de Hamming entre dois pares de palavras. 1. A distância de Hamming d(000, 011) é 2, pois 000 ⊕ 011 é 011 (dois 1s). 2. A distância de Hamming d(10101, 11110) é 3, porque 10101 ⊕ 11110 é 01011 (três 1s). Distância de Hamming Mínima Embora o conceito de distância de Hamming seja o ponto central ao lidarmos com detecção de erros e códigos de correção, a medida que é usada para o projeto de um algoritmo de correção e detecção de erros é a distância de Hamming mínima. Em um conjunto de palavras, a distân- cia de Hamming mínima é a menor distância de Hamming entre todos os pares possíveis. Usamos dmín para definir a distância de Hamming mínima em um esquema de codificação. Para encontrar esse valor, encontramos a distância de Hamming entre todas as palavras e se- lecionamos a menor delas. A distância de Hamming mínima é a menor distância de Hamming entre todos os pares possíveis em um conjunto de palavras. Identificação interna do documento Exemplo 10.5 Encontre a distância de Hamming mínima para o esquema de codificação apresentado na Tabela 10.1. Solução Primeiro, encontramos todas as distâncias de Hamming. d(000, 011) = 2 d(000, 101) = 2 d(000, 110) = 2 d (011, 101) = 2 d(011, 110) = 2 d(101, 110) = 2 A dmín, neste caso, é 2. Exemplo 10.6 Encontre a distância de Hamming mínima para o esquema de codificação apresentado na Tabela 10.2. Solução Inicialmente encontramos todas as distâncias de Hamming. d(00000, 01011) = 3 d(00000, 10101) = 3 d(00000, 11110) = 4 d(01011, 10101) = 4 d(01011, 11110) = 3 d(10101, 11110) = 3 A dmín, nesse caso, é 3. Três Parâmetros Antes de continuarmos nossa discussão, precisamos mencionar que qualquer esquema de co- dificação precisa definir pelo menos três parâmetros: o tamanho n da palavra de código, o tamanho k da palavra de dados e a distância de Hamming mínima dmín. Um esquema de codifi- cação C é escrito na forma C(n, k) com uma expressão distinta para dmín. Por exemplo, podemos denominar nosso primeiro esquema de codificação C(3, 2) com dmín = 2 e nosso segundo esquema de codificação C(5, 2) com dmín = 3. Distância de Hamming e Erro Antes de explorarmos os critérios para detecção e correção de erros, vejamos a relação entre a dis- tância de Hamming e erros que ocorrem durante uma transmissão. Quando uma palavra de código é corrompida durante a transmissão, a distância de Hamming entre as palavras de código enviadas e recebidas é o número de bits afetados pelo erro. Em outras palavras, a distância de Hamming entre a palavra de código recebida e a transmitida é o número de bits que são corrompidos durante a transmissão. Por exemplo, se a palavra de código transmitida for 00000 e o outro lado receber 01101, 3 bits estão incorretos e a distância de Hamming entre os dois é d(00000, 01101) = 3. Distância Mínima para Detecção de Erros Precisamos encontrar agora a distância de Hamming em um código que nos permita estar aptos a detectar até s erros. Se ocorrerem s erros durante uma transmissão, a distância de Hamming en- tre as palavras de código transmitida e a recebida é s. Se nosso código tem por objetivo detectar até s erros, então a distância mínima entre os códigos válidos deve ser s + 1, de modo que a pala- vra de código recebida não vá coincidir com uma palavra de código válida. Em outras palavras, se a distância mínima entre todas as palavras de código for s + 1, a palavra de código recebida não poderá ser confundida erroneamente com outra palavra de código válida. As distâncias não são suficientes (s + 1) para o receptor aceitá-la como válido. O erro será detectado. Precisamos esclarecer uma questão aqui. Embora um código com dmín = s + 1 talvez seja capaz de detectar SEÇÃO 10.2 CÓDIGOS DE BLOCOS 275 Identificação interna do documento 276 CAPÍTULO 10 DETECÇÃO E CORREÇÃO DE ERROS mais de um erro em alguns casos especiais, apenas s ou menos erros podem ser detectados de forma garantida. Para garantir a correção de até s erros em todos os casos, a distância de Hamming mínima em um código de blocos deve ser dmín = s + 1. Exemplo 10.7 A distância de Hamming mínima para nosso primeiro esquema de codificação (Tabela 10.1) é 2. Esse código garante a detecção de apenas um único erro. Se, por exemplo, a terceira palavra de código (101) for enviada e ocorrer um erro, a palavra de código recebida não vai coincidir com nenhuma palavra de código válida. Se, entretanto, ocorrerem dois erros, a palavra de código recebida talvez possa coincidir com uma palavra de código válida e os erros não serão detectados. Exemplo 10.8 Nosso segundo esquema de codificação de blocos (Tabela 10.2) tem dmín = 3. Esse código é capaz de detectar até dois erros. Repetindo, observamos que quando qualquer uma das palavras de código váli- das for transmitida, dois erros criam uma palavra de código que não se encontra na tabela de palavrasde código válidas. O receptor não pode ser enganado. Contudo, algumas combinações de três erros podem corromper uma palavra de código válida gerando uma outra palavra de código também válida. O receptor vai aceitar a palavra de código recebida e os erros não serão detectados. Podemos analisar geometricamente. Suponhamos que a palavra de código transmitida s se encontre no centro de um círculo de raio s. Todas as palavras de código recebidas que são cria- das por 1 a s erros são pontos dentro do círculo ou no perímetro do círculo. Todas as demais palavras de código válidas devem estar fora do círculo, conforme mostrado na Figura 10.8. Figura 10.8 Conceito geométrico de encontrar dmín na detecção de erros Raio s x y dmín > s Qualquer palavra de código válida Legenda Qualquer palavra de código corrompida com 1 a s erros Na Figura 10.8, dmín tem de ser um inteiro maior que s; isto é, dmín = s + 1. Distância Mínima para Correção de Erros A correção de erros é mais complexa que a detecção de erros; ela envolve uma decisão. Quando uma palavra de código recebida não for igual a uma palavra de código válida, o receptor precisa decidir qual palavra de código válida foi realmente transmitida. A decisão se baseia no conceito de território, uma área exclusiva que circunvizinha a palavra de código. Cada palavra de código válida possui seu próprio território. Usamos uma abordagem geométrica para definir cada território. Partimos do pressuposto de que cada palavra de código válida tenha um território circular de raio t e que a palavra de Identificação interna do documento código válida se encontre no centro. Suponha, por exemplo, que uma palavra de código x com t bits corrompidos ou menos. Então, essa palavra de código corrompida se localiza dentro do perímetro desse círculo ou sobre ele. Se o receptor receber uma palavra de código que pertença a esse território, ele decide que a palavra de código original é aquela no centro. Observe que havíamos suposto a ocorrência de até t erros apenas; caso contrário, a decisão pode ser incorreta. A Figura 10.9 ilustra essa interpretação geométrica. Alguns textos usam uma esfera para mostrar a distância entre todos os códigos de blocos válidos. Figura 10.9 Conceito geométrico para encontrar dmín na correção de erros Território de yTerritório de x Raio t Raio t dmín > 2t Qualquer palavra de código válida Legenda Qualquer palavra de código corrompida com 1 a s erros x y Na Figura 10.9, dmín > 2t; já que o próximo incremento inteiro é 1, podemos dizer que dmín = 2t + 1. Para garantir a correção de até t erros para todos os casos, a distância de Hamming mínima em um código de blocos deve ser dmín = 2t + 1. Exemplo 10.9 Um esquema de codificação tem uma distância de Hamming dmín = 4. Qual é a capacidade de detecção e de correção de erros desse esquema? Solução Esse código garante a detecção de até três erros (s = 3), mas é capaz de corrigir apenas 1 erro. Em outras palavras, se esse código for usado para correção de erros, parte de sua capacidade é desperdiçada. Os códigos de correção de erros devem ter uma distância mínima ímpar (3, 5, 7, . . .). 10.3 CÓDIGOS DE BLOCOS LINEARES Quase todos os códigos de blocos usados hoje em dia pertencem a um subconjunto denominado códigos de blocos lineares. O uso de códigos de blocos não-lineares para detecção e correção de erros não é tão difundido, pois sua estrutura torna complicada a análise teórica e a implemen- tação. Iremos, portanto, nos concentrar em códigos de blocos lineares. A definição formal de códigos de blocos lineares requer o conhecimento de álgebra abstrata (particularmente, campos de Galois), que está fora do escopo deste livro. Portanto, iremos dar uma definição informal ao conceito. Para nossos fins, um código de blocos linear é um código no qual a operação OU exclusiva (soma de módulo 2) de duas palavras de código válidas cria outra palavra de código válida. SEÇÃO 10.3 CÓDIGOS DE BLOCOS LINEARES 277 Identificação interna do documento 278 CAPÍTULO 10 DETECÇÃO E CORREÇÃO DE ERROS Em um código de blocos linear, a aplicação da operação OU exclusivo (XOR) em quaisquer duas palavras de código válidas cria outra palavra de código válida. Exemplo 10.10 Vejamos se os dois códigos que definimos nas Tabelas 10.1 e 10.2 pertencem à classe de códigos de blocos lineares. 1. O esquema de codificação da Tabela 10.1 é um código de bloco linear, pois o resultado da aplicação da operação XOR entre duas palavras de código válidas quaisquer cria outra palavra de código vá- lida. Por exemplo, a aplicação da operação XOR entre a segunda e a terceira palavras de código cria uma quarta. 2. O esquema de codificação da Tabela 10.2 também é um código de blocos linear. Podemos criar to- das as quatro palavras de código aplicando a operação XOR entre duas outras palavras de código. Distância Mínima para Códigos de Blocos Lineares É fácil encontrar a distância de Hamming mínima para um código de blocos linear. A distância de Hamming mínima é o número de bits 1s na palavra de código válida não-zero com o menor número de 1s. Exemplo 10.11 Em nosso primeiro código (Tabela 10.1), o número de bits 1s nas palavras de código não-zero são 2, 2 e 2. Portanto, a distância de Hamming mínima é dmín = 2. Em nosso segundo código (Tabela 10.2), os números de 1s nas palavras de código não-zero são 3, 3 e 4. Portanto, nesse código, temos dmín = 3. Alguns Códigos de Blocos Lineares Mostraremos, a seguir, alguns códigos de blocos lineares. Esses códigos são triviais, pois podemos encontrar facilmente os algoritmos de codificação e de decodificação e verificar seus desempenhos. Código de Verificação de Paridade Simples Talvez o código de detecção de erros mais popular seja o código de verificação de paridade simples. Nesse código, uma palavra de dados de k bits é transformada em uma palavra de código de n bits, em que n = k + 1. O bit extra, denominado bit de paridade, é selecionado para tornar par o número total de bits 1s na palavra de código. Embora algumas implementações especifiquem um número ímpar de bits 1s, discutiremos o caso par. A distância de Hamming mínima para esta categoria é dmín = 2, o que significa que este é um código de detecção de erros de bit (um só bit); ele não é capaz de corrigir erros. O código de verificação de paridade simples é um código de detecção de erros de bit no qual n = k + 1 com dmín = 2. Nosso primeiro código (Tabela 10.1) é um código de verificação de paridade, em que k = 2 e n = 3. O código na Tabela 10.3 também é um código de verificação de paridade, em que k = 4 e n = 5. A Figura 10.10 mostra a estrutura de um codificador (no emissor) e um decodificador (no receptor). Identificação interna do documento O codificador usa um gerador que pega uma cópia de uma palavra de dados de 4 bits (a0, a1, a2 e a3) e gera um bit de paridade r0. Os bits da palavra de dados e o bit de paridade criam uma palavra de código de 5 bits. O bit de paridade que é adicionado torna par o número de bits 1s na palavra de código. Tabela 10.3 Código de verificação de paridade simples C(5,4) Palavras de dados Palavras de código Palavras de dados Palavras de código 0000 00000 1000 10001 0001 00011 1001 10010 0010 00101 1010 10100 0011 00110 1011 10111 0100 01001 1100 11000 0101 01010 1101 11011 0110 01100 1110 11101 0111 01111 1111 11110 Figura 10.10 Codificador e decodificador para um código de verificação de paridade simples VerificadorGerador Palavra de código Transmissão não confiável Codificador Palavra de dados Palavra de dados a3 a2 a1 a0a3 a2 a1 a0 b3 b2 b1 b0 q0 Emissor Receptor Decodificador Palavra de código D es ca rt ar Aceitar Síndrome Bit de paridade Lógica de decisão s0 a3 a2 a1 a0 r0 Isso é feito normalmente adicionando-se os 4 bits da palavra de dados (módulo 2); o resultado é o bit de paridade. Em outras palavras, r0 = a3 + a2 + a1 + a0 (módulo 2) Se o número de 1s for par, o resultadoserá 0; se o número de 1s for ímpar, o resultado será 1. Em ambos os casos, o número total de 1s na palavra de códigos é par. O emissor envia a palavra de código, que pode ser corrompida durante a transmissão. O re- ceptor recebe uma palavra de 5 bits. O verificador no receptor faz a mesma coisa que o gerador no emissor, com uma exceção: a adição é feita em todos os 5 bits. O resultado, que é denomi- nado síndrome, é de apenas 1 bit. A síndrome é 0 quando o número de 1s na palavra de código recebida for par; caso contrário, ela é 1. s0 = b3 + b2 + b1 + b0 + q0 (módulo 2) SEÇÃO 10.3 CÓDIGOS DE BLOCOS LINEARES 279 Identificação interna do documento 280 CAPÍTULO 10 DETECÇÃO E CORREÇÃO DE ERROS A síndrome é passada para o analisador de lógica de decisão. Se a síndrome for 0, não exis- tem erros na palavra de código recebida; a parte de dados da palavra de código recebida é aceita como uma palavra de dados válida; se a síndrome for 1, a parte de dados da palavra de código recebida é descartada. A palavra de dados não é criada. Exemplo 10.12 Analisemos alguns cenários de transmissão. Suponha que o emissor envie a palavra de dados 1011. A palavra de código criada a partir dessa palavra de dados é 10111, que é enviada ao receptor. Vamos examinar cinco casos: 1. Não há ocorrência de erro; a palavra de código recebida é 10111. A síndrome é 0. É criada a palavra de dados 1011. 2. Um erro de bit altera a1. A palavra de código recebida será 10011. A síndrome é 1. Não é criada nenhuma palavra de dados. 3. Um erro de bit altera r0. A palavra de código recebida é 10110. A síndrome é 1. Não é criada ne- nhuma palavra de dados. Observe que, embora nenhum dos bits da palavra de dados esteja corrom- pido, não é criada nenhuma palavra de dados, pois o código não é suficientemente sofisticado para indicar a posição do bit corrompido. 4. Um erro altera r0 e um segundo erro altera a3. A palavra de código recebida é 00110. A síndrome é 0. A palavra de dados 0011 é criada no receptor. Note que aqui a palavra de dados é criada de forma incorreta devido ao valor da síndrome. O decodificador de verificação de paridade simples não é capaz de detectar um número par de erros. Os erros se cancelam entre si e dão à síndrome um valor 0. 5. Três bits a3, a2 e a1 são modificados por erros. A palavra de código recebida é 01011. A sín- drome é 1. A palavra de dados não é criada. Isso mostra que a verificação de paridade simples, que garante a detecção de erros de bit, também pode encontrar qualquer número ímpar de erros. O código de verificação de paridade simples é capaz de detectar um número ímpar de erros. Um método mais eficiente é a verificação de paridade bidimensional. Nesse método, a palavra de dados é organizada em uma tabela (linhas e colunas). Na Figura 10.11, os dados a serem enviados, 5 bytes de 7 bits, são colocados em linhas separadas. Para cada linha e cada coluna, é calculado 1 bit de verificação de paridade. A tabela toda é, então, enviada ao receptor, que encontra a síndrome para cada linha e cada coluna. Conforme demonstra a Figura 10.11, a verificação de paridade bidimensional pode detectar até três erros ocorridos em qualquer ponto da tabela (as setas apontam para as posições de síndromes não-zero criadas). Entre- tanto, erros que afetam 4 bits talvez não sejam detectados. Códigos de Hamming Discutiremos agora uma categoria de códigos de correção de erros denominada códigos de Hamming. Esses códigos foram desenvolvidos originalmente com dmín = 3, o que significa que podem detectar até dois erros ou corrigir um único erro. Embora existam alguns códigos de Hamming capazes de corrigir mais de um erro, nossa discussão se limitará ao código de corre- ção de erros de bit. Encontremos, inicialmente, a relação entre n e k em um código de Hamming. Precisamos es- colher um inteiro m > = 3. Os valores de n e k são, então, calculados a partir de m como n = 2m – 1 e k = n – m. O número de bits de verificação é r = m. Todos os códigos de Hamming discutidos neste livro têm dmín = 3. A relação entre m e n nesses códigos é n = 2m – 1. Identificação interna do documento Por exemplo, se m = 3, então n = 7 e k = 4. Este é um código de Hamming C(7, 4) com dmín = 3. A Tabela 10.4 mostra as palavras de dados e as palavras de código para esse código. Figura 10.11 Código de verificação de paridade bidimensional d. Três erros afetam quatro paridades 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 b. Um erro afeta duas paridades 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 e. Não é possível detectar quatro erros 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 c. Dois erros afetam duas paridades a. Matriz de paridades de linhas e colunas 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 Pa ri da de d as li nh as Paridade das colunas Tabela 10.4 Código de Hamming C(7, 4) Palavras de dados Palavras de código Palavras de dados Palavras de código 0000 0000000 1000 1000110 0001 0001101 1001 1001011 0010 0010111 1010 101001 0011 0011010 1011 1011100 0100 0100011 1100 1100101 0101 0101110 1101 1101000 0110 0110100 1110 1110010 0111 0111001 1111 1111111 SEÇÃO 10.3 CÓDIGOS DE BLOCOS LINEARES 281 Identificação interna do documento 282 CAPÍTULO 10 DETECÇÃO E CORREÇÃO DE ERROS A Figura 10.12 mostra a estrutura do codificador e do decodificador para esse exemplo. Figura 10.12 Estrutura do codificador e do decodificador para um código de Hamming VerificadorGerador Palavra de código Transmissão não confiável Codificador Palavra de dados Palavra de dados a3 a2 a1 a0a3 a2 a1 a0 q2 q1 q0b3 b2 b1 b0 Emissor Receptor Decodificador Palavra de código Síndrome Lógica de correção s0s1s2 a3 a2 a1 a0 r2 r1 r0 No emissor, uma cópia de uma palavra de dados de 4 bits alimenta o gerador que, por sua vez, cria três bits de verificação de paridade: r0, r1 e r2, conforme mostrado a seguir: r0 = a2 + a1 + a0 (módulo 2) r1 = a3 + a2 + a1 (módulo 2) r2 = a1 + a0 + a3 (módulo 2) Em outras palavras, cada um dos bits de paridade faz a verificação de 3 dos 4 bits da palavra de dados. O número total de 1s em cada combinação de 4 bits (3 bits de palavra de dados e 1 bit de paridade) tem de ser par. Não estamos dizendo que essas três equações são únicas; quaisquer três equações que envolvam 3 dos 4 bits na palavra de dados e criem equações independentes são válidas (uma combinação de dois não é capaz de criar o terceiro). O verificador no decodificador cria uma síndrome de 3 bits (s2s1s0) no qual cada bit repre- senta a verificação de paridade em 4 dos 7 bits da palavra de código recebida: s0 = b2 + b1 + b0 + q0 (módulo 2) s1 = b3 + b2 + b1 + q1 (módulo 2) s2 = b1 + b0 + b3 + q2 (módulo 2) As equações usadas pelo verificador são as mesmas utilizadas pelo gerador com os bits de paridade adicionados do lado direito da equação.A síndrome de 3 bits cria oito padrões de bits diferentes (000 a 111) que pode representar oito condições diferentes. Essas condições definem desde a ausência de erros até um erro em 1 dos 7 bits da palavra de código recebida, conforme mostrado na Tabela 10.5. Identificação interna do documento Tabela 10.5 Decisão lógica feita pelo analisador de lógica de correção do decodificador Síndrome 000 001 010 011 100 101 110 111 Erro Nenhum q0 q1 b2 q2 b0 b3 b1 Perceba que o gerador não está preocupado com os quatro casos com fundo cinza indicados na Tabela 10.5, pois não existem erros ou então há apenas um erro no bit de paridade. Nos outros quatro casos, 1 dos bits deve ser invertido (de 0 para 1 ou de 1 para 0) para encontrar a palavra de dados correta. Os valores de síndrome da Tabela 10.5 se baseiam no cálculo de bits de síndrome. Por exem- plo, se q0 estiver com erro, s0 é o único bit afetado; conseqüentemente, a síndrome é 001. Se b2 estiver com erro, s0 e s1 são os bits afetados; portanto, a síndrome é 011. De modo similar, se b1 apresentar erro, todos os 3 bits de síndrome são afetados e a síndrome é 111. Precisamos enfatizar duas questões aqui. Em primeiro lugar, se ocorrerem dois erros durante a transmissão, a palavra de dados criada talvez não seja a correta. Em segundo, se quisermos usar o código anterior para a detecção de erros, precisamos de um projeto diferente. Exemplo 10.13 Tracemos o trajeto de três palavras de dados desde a origem até seu destino: 1. A palavra de dados 0100 se torna a palavra de código 0100011. A palavra de código 0100011 é recebida. A síndrome calculada é 000 (nenhum erro), a palavra de dados final é 0100. 2. A palavra de dados 0111 se torna a palavra de código 0111001. A palavra de código 0011001 é recebida. A síndrome é 011. De acordo com a Tabela 10.5, b2 apresenta erro. Após inverter b2 (de 1 para 0), a palavra de dados final fica 0111. 3. A palavra de dados 1101 se torna a palavra de código 1101000. A palavra de código 0001000 é recebida (dois erros). A síndrome é 101, o que significa que b0 apresenta erro. Após inverter b0, obtemos 0000, a palavra de dados incorreta. Isto mostra que nosso código não é capaz de corrigir dois erros. Exemplo 10.14 Precisamos de uma palavra de dados de pelo menos 7 bits. Calcule os valores de k e n que satisfaçam essa exigência. Solução Precisamos fazer que k = n – m seja maior ou igual a 7 ou 2m – 1 – m ≥ 7. 1. Se configurarmos m = 3, o resultado é n = 23 – 1 e k = 7 – 3, ou 4, o que não é aceitável. 2. Se configurarmos m = 4, então n = 24 – 1 = 15 e k = 15 – 4 = 11, que satisfaz a condição. Portanto, o código é C(15, 11). Existem métodos para tornar a palavra de dados de um tamanho específico, mas sua discussão e implementação estão fora do escopo deste livro. Desempenho Um código de Hamming é capaz de corrigir um erro de bit ou detectar dois erros. Entretanto, existe uma maneira de fazê-lo detectar um erro em rajada, conforme mostrado na Figura 10.13. O segredo é dividir um erro em rajada em várias palavras de código, atribuindo um erro para cada uma. Em comunicação de dados, normalmente enviamos um pacote ou um frame de dados. Para fazer que o código de Hamming responda a um erro em rajada de tamanho N, preci- samos criar N palavras de código a partir de nosso frame. Em seguida, em vez de enviar uma palavra de código por vez, dispomos as palavras de código em uma tabela e enviamos os bits da SEÇÃO 10.3 CÓDIGOS DE BLOCOS LINEARES 283 Identificação interna do documento 284 CAPÍTULO 10 DETECÇÃO E CORREÇÃO DE ERROS tabela uma coluna por vez. A Figura 10.13 mostra que, quando um erro em rajada de tamanho 4 corrompe o frame, apenas 1 bit de cada palavra de código é corrompido. O bit corrompido em cada palavra de código pode ser facilmente corrigido no receptor. 10.4 CÓDIGOS CÍCLICOS Códigos cíclicos são códigos de blocos lineares especiais com uma propriedade extra. Em um código cíclico, se uma palavra de código for deslocada ciclicamente (em rotação), o resultado é outra palavra de código. Por exemplo, se 1011000 for uma palavra de código válida, ao exe- cutarmos um deslocamento cíclico para a esquerda, então 0110001 também será uma palavra de código válida. Nesse caso, se chamarmos os bits na primeira palavra de a0 até a6 e os bits na segunda palavra b0 a b6, poderemos deslocar os bits pela seguinte equação: b1 = a0 b2 = a1 b3 = a2 b4 = a3 b5 = a4 b6 = a5 b0 = a6 Na equação mais à direita, o último bit da primeira palavra é deslocado ciclicamente e se torna o primeiro bit da segunda palavra. CRC — Cyclic Redundant Check Podemos criar códigos cíclicos para a correção de erros. Entretanto, o conhecimento teórico ne- cessário está fora do escopo de nosso livro. Na presente seção, discutiremos apenas a categoria de códigos cíclicos, denominada CRC (Cyclic Redundant Check), que é amplamente usada em redes LANs e WANs. Figura 10.13 Correção de erros em rajada utilizando o código de Hamming Bits corrompidos Erros em rajada Transmissor Unidade de dados em trânsito Palavra de código 11111111 0110001 0010110 1011000 Palavra de código 4 Palavra de código 3 Palavra de código 2 1111 0 10 0 1 0 001 00 01 10 00 01 1 0 111 Receptor Palavra de código 1 1110111 0111001 0000110 1001000Palavra de código 4 Palavra de código 3 Palavra de código 2 Identificação interna do documento A Tabela 10.6 apresenta um exemplo de código CRC. Podemos observar tanto as propriedades lineares quanto cíclicas desse código. Tabela 10.6 Código CRC de C(7, 4) Palavras de dados Palavras de código Palavras de dados Palavras de código 0000 0000000 1000 1000101 0001 0001011 1001 1001110 0010 0010110 1010 1010011 0011 0011101 1011 1011000 0100 0100111 1100 1100010 0101 0101100 1101 1101001 0110 0110001 1110 1110100 0111 0111010 1111 1111111 A Figura 10.14 mostra um projeto possível para o codificador e decodificador. Figura 10.14 Codificador e decodificador CRC Aceitar VerificadorGerador Palavra de código Codificador Palavra de dados Palavra de dados a3 a2 a1 a0a3 a2 a1 a0 q2 q1 q0b3 b2 b1 b0 Emissor 0 0 0 Receptor Decodificador Palavra de código D es ca rt ar Síndrome Lógica de decisão s0s1s2 a3 a2 a1 a0 r2 r1 r0 Divisor R es to d1d3 d2 d0 Transmissão não confiável No codificador, a palavra de dados tem k bits (4, neste caso) e a palavra de código tem n bits (7, nesse caso). O tamanho da palavra de dados é aumentado adicionando-se n – k (3, nesse caso) 0s ao lado direito da palavra. O resultado de n bits alimenta o gerador. O gerador usa um divisor de tamanho n – k + 1 (4, nesse caso), predefinido e estabelecido por ambas as partes. O gerador divide a palavra de dados aumentada pelo divisor (divisão de módulo 2). O quociente da divisão é descartado; o resto (r2r1r0) é anexado à palavra de dados para criar a palavra de código. O decodificador recebe a palavra de código possivelmente corrompida. Uma cópia de todos os n bits é alimentada no verificador, que é uma réplica do gerador. O resto produzido pelo SEÇÃO 10.4 CÓDIGOS CÍCLICOS 285 Identificação interna do documento 286 CAPÍTULO 10 DETECÇÃO E CORREÇÃO DE ERROS verificador é uma síndrome de n – k (3, nesse caso) bits que alimenta o analisador lógico de decisão. O analisador tem uma função simples. Se os bits de síndrome forem todos 0s, os 4 bits mais à esquerda da palavra de código são aceitos como palavras de dados (interpretado como não sendo um erro); caso contrário, os 4 bits são descartados (erro). Codificador Examinemos com mais cuidado o codificador. O codificador pega a palavra de dados e a incre- menta com um número n – k de bits 0s. Em seguida, ele divide a palavra de dados resultante pelo divisor, conforme mostrado na Figura 10.15. Figura 10.15 Divisão no codificador CRC Divisão 1 10 1 1 10 1 1 10 1 0 01 0 0 00 0 1 00 1 01 1 0 01 1 0 00 0 1 00 0 Divisor Quociente Dividendo: palavra de dados aumentada Palavra de código1 10 0 1 1 0 Palavra de dados Resto 1 10 0Palavra de dados Resto Bit 0 mais à esquerda: Use o divisor 0000 Bit 0 mais à esquerda: Use o divisor 0000 1 10 0 0 0 0 O processo de divisão binária de módulo 2 é similar ao processo de divisão de números de- cimais. Entretanto, conforme mencionado no início do capítulo, a adição e a subtração utilizam a operação XOR. Como na divisão decimal, o processo é realizado passo a passo. Em cada etapa, aplica-se a operação XOR entre uma cópia do divisor e os 4 bits do dividendo. O resultado da operação XOR, de 3 bits (nesse caso), é reutilizada na etapa seguinte após ser baixado 1 bit extra para torná-lo com um comprimento de 4 bits. Há uma questão importante a ser realçada nesse tipo de divisão. Se o bit mais à esquerda do dividendo (ou a parte usada em cada etapa) for 0, a etapa não poderá usar o divisor normal; precisamos usar um divisor alternativo formado por todos os bits iguais a 0s. Quando todos os bits remanescentes terminam de ser baixados, temos o resultado. O resto de 3 bits forma os bits de verificação (r2, r1 e r0). Eles são anexados à palavra de dados para criar a palavra de código. Identificação interna do documento Decodificador A palavra de código pode ser corrompida durante sua transmissão. O decodificador realiza o mesmo processo de divisões sucessivas do codificador. O resto da divisão é a síndrome. Se a síndrome for formada completamente por 0s, não existem erros; a palavra de dados é separada da palavra de código recebida e aceita. Caso contrário, tudo é descartado. A Figura 10.16 expõe os dois casos: a figura da esquerda exibe o valor da síndrome quando não há ocorrência de erro; a síndrome é 000. A parte direita da figura mostra o caso no qual ocorre um único erro. A sín- drome não é formada completamente por 0s (ela é 011). Figura 10.16 Divisões sucessivas no decodificador CRC para dois casos Divisão Divisão 1 10 0 1 1 0 1 10 0 1 1 0 1 10 1 1 10 1 1 10 1 0 11 0 0 00 0 1 00 1 00 0 0 00 0 0 00 0 1 10 1 Palavra de código 1 10 0 Palavra de dados aceita Síndrome Palavra de código 1 00 0 1 1 0 1 00 0 1 1 0 1 10 1 1 10 1 1 10 1 0 11 1 1 10 1 1 00 1 10 1 1 00 0 0 00 0 1 11 1 Palavra de código Palavra de dados descartada Síndrome Palavra de código Divisor Você pode estar imaginando por que foi escolhido o divisor 1011. Posteriormente, ainda neste capítulo, apresentaremos alguns critérios, em geral, porém, ele envolve uma certa dose de álge- bra abstrata. Implementação no Hardware Uma das vantagens de um código cíclico é que o codificador e o decodificador podem ser imple- mentados em um hardware específico por meio de dispositivos eletrônicos. Uma implementação de hardware aumenta a velocidade do processo de cálculo dos bits de síndrome e de verificação. Na seção a seguir, iremos mostrar, passo a passo, o processo. A seção é, entretanto, opcional e não afeta a compreensão do restante do capítulo. Divisor Consideremos, primeiro, o divisor. Precisamos notar os seguintes pontos: 1. São aplicadas, repetidamente, operações XOR entre o divisor e parte do dividendo. SEÇÃO 10.4 CÓDIGOS CÍCLICOS 287 Identificação interna do documento 288 CAPÍTULO 10 DETECÇÃO E CORREÇÃO DE ERROS 2. O divisor tem n – k + 1 bits que são predefinidos ou, então, é formado completamente por 0s. Em outras palavras, os bits não mudam de uma palavra de dados para outra. Em nosso exemplo anterior, os bits do divisor eram 1011 ou então 0000. A escolha se baseava no bit mais à esquerda dos bits de dados aumentados que faziam parte da operação XOR. 3. Um exame mais cuidadoso mostra que são necessários apenas n – k bits do divisor na opera- ção XOR. O bit mais à esquerda não é necessário, pois o resultado da operação é sempre 0; não interessa o valor desse bit. A razão para tal é que as entradas para a operação XOR são ambas 0s ou ambas 1s. No exemplo anterior apenas 3 bits, e não 4, são realmente usados na operação XOR. Usando esses pontos, é possível construir um divisor fixo (hardwired) que pode ser usado para um código cíclico, caso saibamos o padrão da divisão. A Figura 10.17 mostra um projeto desses para nosso exemplo anterior. Também mostramos os dispositivos XOR usados para a operação. Figura 10.17 Projeto de hardware de um divisor de CRC Bit mais à esquerda da parte do dividendo envolvido na operação XOR XOR XOR d2 d1 d0 Linha interrompida: Esse bit é sempre 0 ++ + XOR Observe que, se o bit mais à esquerda da parte do dividendo a ser usada nessa etapa for 1, os bits do divisor (d2d1d0) serão 011; se o bit mais à esquerda for 0, os bits do divisor serão 000. O projeto oferece a escolha adequada tomando como base o bit mais à esquerda. Palavra de Dados Aumentada Em nosso processo de divisão manual da Figura 10.15, mostramos que a palavra de dados au- mentada permanecia fixa em uma posição, com os bits do divisor se deslocando para a direita, 1 bit em cada etapa. Os bits do divisor são alinhados com parte da palavra de dados aumentada. Agora que nosso divisor é fixo, precisamos, em vez de deslocar para a esquerda os bits da pala- vra de dados aumentada (direção oposta), alinhar os bits do divisor com a parte apropriada. Não há necessidade de armazenar os bits da palavra de dados aumentada. Resto Em nosso exemplo anterior, o resto tem um comprimento de 3 bits (n – k bits em termos ge- néricos). Podemos usar três registradores (dispositivos de armazenamento de um único bit) para armazenar esses bits. Para encontrar o resto final da divisão, precisamos modificar nosso processo de divisão. A seguir, apresentamos um processo passo a passo que pode ser usado para simular o procedimento de divisão sucessiva em hardware (ou até mesmo em software): 1. Partimos do pressuposto de que o resto é originalmente composto apenas por 0s (000, em nosso exemplo). Identificação interna do documento 2. A cada pulso de clock (chegada de 1 bit de uma palavra de dados aumentada), repetimos as duas ações a seguir: a. Usamos o bit mais à esquerda para tomar a decisão sobre o padrão do divisor (011 ou 000). b. Aplica-se uma operação XOR entre os outros 2 bits do resto e o bit seguinte da palavra de dados aumentada (total de 3 bits) com o divisor de 3 bits para criar o próximo resto. A Figura 10.18 mostra esse simulador. Note, porém, note que este não é o projeto final, ha- verá melhorias e simplificações adicionais. Figura 10.18 Simulação da divisão no codificador CRC 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 1 0 1 Palavra de dados aumentada Resto final Instante: 2 Instante: 4 Instante: 5 Instante: 6 Instante: 7 Instante: 1 0 0 00 0 + 0 + + 0 10 00 + 0 + + Instante: 3 1 00 00 + 0 + + 0 01 10 + 1 + + 1 00 00 + 0 + + 0 01 10 + 1 + + 1 10 00 + 0 + + A cada pulso de clock, mostrado como instantes diferentes, um dos bits da palavra de dados aumentada é usado no processo de cálculo XOR. Se examinarmos cuidadosamente o projeto, temos um total de sete etapas, ao passo que, no método manual tradicional, tínhamos quatro etapas. As três primeiras etapas foram adicionadas para tornar cada etapa igual e para tornar o projeto de cada etapa também igual. As etapas 1, 2 e 3 empurram os 3 primeiros bits para os registradores de resto; as etapas 4, 5, 6 e 7 são iguais ao projeto manual. Note que os valo- res no registrador de resto nas etapas 4 a 7 coincidem exatamente com os valores do projeto manual. O resto final também é o mesmo. O objetivo do projeto anterior é apenas para fins de demonstração. Na prática, ele necessita de simplificação. Primeiro, não precisamos preservar os valores intermediários dos bits do resto; necessitamos apenas dos bits finais. Portanto, somente de três registradores em vez de 24. Após as operações XOR, não precisamos dos valores dos bits do resto anterior. Da mesma forma, não SEÇÃO 10.4 CÓDIGOS CÍCLICOS 289 Identificação interna do documento 290 CAPÍTULO10 DETECÇÃO E CORREÇÃO DE ERROS são necessários 21 dispositivos XOR; dois são suficientes, pois a saída de uma operação XOR, na qual um dos bits é 0, simplesmente é o valor do outro bit. Esse outro bit pode ser usado como saída. Com essas modificações, o projeto se torna mais simples e muito mais barato, conforme mostrado na Figura 10.19. Figura 10.19 O projeto de um codificador CRC empregando registradores de deslocamento 1 0 0 1 0 0 00 0 0 Palavra de dados aumentada + + Precisamos, porém, fazer que os registradores sejam registradores de deslocamento. Um registrador de deslocamento de 1 bit armazena um bit pela duração de um período de clock. A cada novo pulso de clock, o registrador de deslocamento aceita o bit em sua porta de entrada, armazena o novo bit e o exibe na porta de saída. O conteúdo e a saída permanecem os mesmos até chegar um novo pulso de clock. Quando conectamos em cascata diversos registradores de deslocamento de 1 bit o efeito é como se o conteúdo do registrador estivesse se deslocando. Projeto Geral O projeto geral de um codificador e decodificador CRC é mostrado na Figura 10.20. Figura 10.20 Projeto geral do codificador e decodificador de um código CRC Palavra de dados A linha do divisor e o XOR são omitidos caso o bit correspondente no divisor for 0. Nota: rn-k-1 r1 r0 dn-k-1 d1 d0 Palavra de código recebida a. Codificador b. Decodificador sn-k-1 s1 s0 dn-k-1 d1 d0 + + + + + + • • • • • • Note que temos n – k registradores de deslocamento de 1 bit tanto no codificador como no decodificador. Temos até n – k dispositivos XOR, mas os divisores normalmente possuem vários 0s em seus padrões, o que reduz o número de dispositivos. Observe também que, em vez de pala- vras de dados aumentadas, mostramos a própria palavra de dados como entrada, pois após todos os bits da palavra de dados serem alimentados no codificador, os bits extras, que são todos 0s, não têm efeito algum sobre o XOR mais à direita. O processo precisa passar por outras n – k etapas antes de os bits de verificação estarem prontos. Esse fato é um dos pontos fracos desse projeto. Foram desenvolvidos esquemas alternativos que permitem eliminar esse tempo de espera (os bits Identificação interna do documento de verificação prontos após k etapas); no entanto, deixamos este como um tópico de pesquisa para o leitor. No decodificador, entretanto, toda a palavra de código tem de alimentar o decodi- ficador antes da síndrome estar pronta. Polinômios A maneira correta de compreender códigos cíclicos é representá-los na forma de polinômios. Repetindo, esta seção é opcional. Um padrão de bits 0s e 1s pode ser representado na forma de um polinômio com coeficien- tes 0 e 1. A potência de cada termo mostra a posição do bit; o coeficiente mostra o valor do bit. A Figura 10.21 apresenta um padrão binário e sua representação polinomial. Na Figura 10.21a, mostramos como transformar um padrão binário em um polinômio; na Figura 10.21b, mostramos como um polinômio pode ser reduzido eliminando-se todos os termos com coefi- cientes zero e substituindo x1 por x e x0 por 1. Figura 10.21 Um polinômio para representar uma palavra binária a. Padrão binário e polinômio b. Forma reduzida x6 + + x 1 1 1 0 0 0 0 1 1x6 0x4 0x5 0x3 + + + + 0x2 1x1 1x0 + + 1 a6 0 a5 0 a4 0 a3 0 a2 1 a1 1 a0 A Figura 10.21 apresenta um benefício imediato; um padrão de 7 bits pode ser substituído por três termos. O benefício é ainda maior quando temos um polinômio como x23 + x3 + 1. Nes- se caso, o padrão termos polinomiais é de 24 bits de comprimento (três 1s e vinte e um 0s), ao passo que no polinômio temos apenas três termos. Grau do Polinômio O grau de um polinômio é definido pelo grau da maior potência contida no polinômio. Por exemplo, o grau do polinômio x6 + x + 1 é 6. Note que o grau de um polinômio é 1 menos o número de bits do padrão. O padrão de bits, nesse caso, tem 7 bits. Adição e Subtração de Polinômios A adição e a subtração de polinômios em matemática são feitas adicionando-se ou subtraindo- se os coeficientes dos termos de mesma potência. Em nosso caso, os coeficientes são apenas 0s e 1s e a adição será realizada no módulo 2. Isso tem duas conseqüências. Primeiro, a adição e a subtração são realizadas da mesma forma. Segundo, a adição e a subtração são realizadas combinando-se termos e eliminando-se pares de termos idênticos. Por exemplo, somar x5 + x4 + x2 e x6 + x4 + x2 dá simplesmente x6 + x5. Os termos x4 e x2 são eliminados. Note, porém, que se somarmos, por exemplo, três polinômios e obtivermos x2 três vezes, eliminamos dois deles e preservamos o terceiro. SEÇÃO 10.4 CÓDIGOS CÍCLICOS 291 Identificação interna do documento 292 CAPÍTULO 10 DETECÇÃO E CORREÇÃO DE ERROS Multiplicação e Divisão de Termos Nessa aritmética, multiplicar um termo por outro é muito simples; basta adicionarmos potências. Por exemplo, x3 3 x4 é igual a x7. Para dividir, simplesmente subtraímos a potência do segundo termo da potência do primeiro termo. Por exemplo, x5/x2 é igual a x3. Multiplicação entre Dois Polinômios Multiplicar um polinômio por outro é feito termo a termo. Cada termo do primeiro polinômio deve ser multiplicado por todos os termos do segundo polinômio. O resultado, obviamente, é então simplificado, e pares de termos iguais são eliminados. Eis um exemplo: (x5 + x3 + x2 + x)(x2 + x + 1) = x7 + x6 + x5 + x5 + x4 + x3 + x4 + x3 + x2 + x3 + x2 + x = x7 + x6 + x3 + x Divisão entre Dois Polinômios A divisão de polinômios é, conceitualmente, o mesmo que a divisão binária vista para um co- dificador. Dividimos o primeiro termo do dividendo pelo primeiro termo do divisor para obter o primeiro termo do quociente. Multiplicamos o termo do quociente pelo divisor e subtraí- mos o resultado do dividendo. Repetimos o processo até que o grau do dividendo seja menor que o grau do divisor. Posteriormente, ainda neste capítulo, mostraremos um exemplo de divisão. Deslocamento Um padrão binário pode ser normalmente deslocado de certo número de bits para a esquerda ou para a direita. Deslocar para a esquerda significa acrescentar 0s extras como bits mais à direita; deslocar para a direita significa eliminar alguns bits mais à direita. O deslocamento para a es- querda é obtido multiplicando-se cada termo do polinômio por xm, em que m é o número de bits deslocados; o deslocamento para a direita é obtido dividindo-se cada termo do polinômio por xm. A seguir, é apresentado um exemplo de deslocamento para a esquerda e para a direita. Note que não temos potências negativas na representação polinomial. Deslocamento de 3 bits para a esquerda: 10011 fica 10011000 x4 + x + 1 fica x7 + x4 + x3 Deslocamento de 3 bits para a direita: 10011 fica 10 x4 + x + 1 fica x Quando aumentamos a palavra de dados no codificador da Figura 10.15, na realidade, estamos deslocando os bits para a esquerda. Note também que, quando encadeamos dois padrões de bits, deslocamos o primeiro polinômio para a esquerda, em seguida, adicionamos o segundo polinômio. Codificador de Código Cíclico Usando Polinômios Agora que discutimos as operações polinomiais, mostraremos a criação de uma palavra-código a partir de uma palavra de dados. A Figura 10.22 apresenta uma versão polinomial da Figura 10.15. Podemos ver que o processo é mais curto. A palavra de dados 1001 é representada por x3 + 1. O divisor 1011 é representado por x3 + x + 1. Para encontrar a palavra de dados aumenta- da, deslocamos para a esquerda a palavra de dados de 3 bits (multiplicando por x3). O resultado é x6 + x3. A divisão é simples. Dividimos o primeiro termo do dividendo, x6, pelo primeiro termo Identificação interna do documento do divisor, x3. O primeiro termo do quociente é então x6/x3, ou x3. Em seguida, multiplicamos x3 pelo divisor e subtraímos (de acordo com nossa definição anterior de subtração) o resultado do dividendo. O resultado é x4, com grau maior que o grau do divisor; continuamosa dividir até que o grau do resto seja menor que o grau do divisor. Figura 10.22 Divisão CRC usando polinômios Dividendo: palavra de dados aumentada Divisão Palavra de código Palavra de dados Resto x6 x4 x3 + + x4 x2 x+ + x2 x + x4 x6 x3 + Palavra de dados Resto x2 x + x6 x3 + x3 x + x3 x + + 1 x3 + 1 Nota-se, nesse caso, que uma representação polinomial pode simplificar muito a operação de divisão, pois não são necessárias as duas etapas envolvendo divisores contendo apenas 0s (Obviamente, é possível argumentar que a etapa de divisão contendo apenas 0s também poderia ser eliminada na divisão binária). Em uma representação polinomial, normalmente o divisor é conhecido como polinômio gerador t(x). O divisor em um código cíclico é denominado polinômio gerador ou simplesmente gerador. Análise de Códigos Cíclicos Podemos analisar um código cíclico para encontrar suas capacidades usando polinômios. Defi- nimos os seguintes polinômios, em que f(x) é um polinômio com coeficientes binários. Palavra de dados: d(x) Palavra de código: c(x) Gerador: g(x) Síndrome: s(x) Erro: e(x) Se s(x) não for zero, então um ou mais bits estão corrompidos. Entretanto, se s(x) for zero, não existem bits corrompidos ou o decodificador falhou na detecção de erros. Em um código cíclico, 1. Se s(x) ≠ 0, um ou mais bits estão corrompidos. 2. Se s(x) = 0, a. Nenhum bit foi corrompido ou, então, b. Alguns bits estão corrompidos, mas o decodificador falhou na detecção de erros. SEÇÃO 10.4 CÓDIGOS CÍCLICOS 293 Identificação interna do documento 294 CAPÍTULO 10 DETECÇÃO E CORREÇÃO DE ERROS Em nossa análise, queremos encontrar os critérios que devem estar associados ao polinômio gerador g(x) para detectar os tipos de erros que queremos que sejam detectados. Encontremos uma relação entre a palavra de código transmitida, o erro, a palavra de código recebida e o poli- nômio gerador. Podemos dizer Palavra de código recebida = c(x) + e(x) Resumindo, a palavra de código recebida é a soma da palavra de código transmitida mais o erro. O receptor divide a palavra de código recebida por g(x) para obter a síndrome. Podemos escrever isso como Palavra de c digo recebidaó g x c x g x e x g x( ) ( ) ( ) ( ) ( ) = + O primeiro termo do lado direito da igualdade tem resto igual a zero (de acordo com a de- finição de palavra de código). Portanto, a síndrome é, na verdade, o resto do segundo termo da equação do lado direito. Se esse termo tiver resto igual a zero (síndrome = 0), e(x) é 0 ou e(x) é divisível por g(x). Não precisamos nos preocupar com o primeiro caso (não há erro); o segundo caso é mais importante. Erros que são divisíveis por g(x) não são detectados. Em um código cíclico, erros e(x) que são divisíveis por g(x) não são detectados. Mostremos alguns erros específicos e vejamos como eles podem ser detectados por um po- linômio g(x) bem projetado. Erro de Bit Qual deve ser a estrutura de g(x) para garantir a detecção de erros de um único bit? Um erro de bit pode ser definido como e(x) = xi, em que i é a posição do bit. Se for detectado um erro em um único bit, então xi não será divisível por g(x) (note que ao dizermos não divisível, queremos dizer que existirá um resto). Se g(x) tiver pelo menos dois termos (que normalmente é o caso) e o coeficiente de x0 não for zero (o bit mais à direita é 1), então e(x) não pode ser dividido por g(x). Se o polinômio gerador tiver mais de um termo e o coeficiente de x0 for 1, todos os erros de bit poderão ser detectados. Exemplo 10.15 Qual dos seguintes valores de g(x) garante que um erro de bit será detectado? Para cada caso, qual é o erro que não pode ser detectado? a. x + 1 b. x3 c. 1 Solução a. Nenhum xi pode ser divisível por x + 1. Em outras palavras, xi/(x + 1) sempre tem um resto. Portan- to, a síndrome não é zero. Qualquer erro de bit pode ser detectado. Identificação interna do documento b. Se i for igual ou maior que 3, xi é divisível por g(x). O resto de xi/x3 é zero e o receptor é levado erroneamente a acreditar que não existem erros, embora possa existir algum. Observe que, nesse caso, o bit corrompido deve se encontrar na posição 4 ou superior. Todos os erros de um único bit nas posições de 1 a 3 são detectados. c. Todos os valores de i tornam xi divisível por g(x). Nenhum erro de bit pode ser capturado. Além disso, g(x) é inútil, pois significa que a palavra de código é apenas a palavra de dados expandida com n – k zeros. Dois Erros Isolados de um Único Bit Agora, imagine que haja dois erros isolados de um único bit. Sob quais condições esse tipo de erro pode ser detectado? Podemos defini-lo como e(x) = xj + xi. Os valores de i e j definem as posições dos erros e a diferença j – i estabelece a distância entre os dois erros, como mostra a Figura 10.23. Figura 10.23 Representação de dois erros isolados de um único bit usando polinômios 0 x0xix jxn−1 1 0 1 1 1 0 1 0 1 0 0 0 0 1 Diferença: j − i 1 Podemos escrever e(x) = xi (xj-i + 1). Se g(x) tiver mais de um termo e um deles for x0, ele não será capaz de dividir xi, conforme visto na seção anterior. Portanto, se g(x) deve dividir e(x), ele deve dividir xj-i + 1. Em outras palavras, g(x) não é capaz de dividir xt + 1, em que t se encontra entre 0 e n – 1. Entretanto, t = 0 é insignificante e t = 1 é necessário, conforme veremos mais adiante. Isso significa que t deve estar entre 2 e n – 1. Se um polinômio gerador não for capaz de dividir xt + 1 (t entre 0 e n – 1), então todos os erros duplos isolados poderão ser detectados. Exemplo 10.16 Encontre a eficiência dos polinômios geradores a seguir com relação à capacidade de detecção de dois erros isolados de um único bit. a. x + 1 b. x4 + 1 c. x7 + x6 + 1 d. x15 + x14 + 1 Solução a. Essa é uma péssima escolha para um gerador. Quaisquer dois erros próximos entre si não poderão ser detectados. b. Esse gerador não é capaz de detectar dois erros que estejam distantes quatro posições entre si. Os dois erros podem estar em qualquer posição, mas se a distância entre eles for 4, não serão detecta- dos. c. Essa é uma boa opção para esse fim. d. Esse polinômio não é capaz de dividir um erro do tipo xt + 1 se t for menor que 32.768. Isso sig- nifica que uma palavra de código com dois erros isolados que estiverem próximos entre si ou até 32.768 bits de distância poderá ser detectada por esse gerador. SEÇÃO 10.4 CÓDIGOS CÍCLICOS 295 Identificação interna do documento Encerra aqui o trecho do livro disponibilizado para esta Unidade de Aprendizagem. Na Biblioteca Virtual da Instituição, você encontra a obra na íntegra. Página em branco