terça-feira, 16 de agosto de 2011

Dicas de implementação de IPv6 em microcontroladores.

O artigo abaixo se encontra no site do EETimes, e é muito importante em nossos dias, onde a mudança de padrões para a internet começa a ser testada. A implementação do IPv6 em sistemas embarcados poderá ser muito importante nesta mudança.


IPv6 em um microcontrolador

Robert Muchsel
Uma das forças motrizes da mudança do PIv4 para o IPv6 tem sido dispositivos embarcados de baixo custo, que estão se conectando a um passo acelerado. Mas espremer toda a suíte de protocolos IPv6 em um pequeno microcontrolador 8-bits é um esporte radical de primeira ordem. Aqui estão algumas dicas de alguém que fez isto com sucesso.

O espaço de endereços para a Internet está ficando pequeno. Enquanto alguns endereços IPv4 ainda estão por ser alocados, e hacks como o IP masqueradinge aluguel de endereços temporários atrasaram o momento, nós todavia acabaremos ficando sem endereços nos próximos anos. Para garantir que futuros dispositivos conectados à Internet tenham endereços únicos, a próxima geração do Internet Protocol, IPv6, estende o espaço de endereçamento bem acima da imaginação humana: 2128, que é cerca de 6.67 x 1023 endereços por metro quadrado de nosso planeta; em outras palavras, bastante.
Tendo endereços suficientes elimina a necessidade de Network Address Translation (NAT) (também conhecido como mascaramento de IP), aluguel temporário de endereço, e outras correções necessárias para conservar os bem racionados endereços IPv4. A indústria espera um grande número de dispositivos de rede clássicos como computadores desktop e servidores, mas um tremendo número de pequenos dispositivos - incluindo dispositivos sem fio e móveis "sempre conectados", como celulares e PDAs, e sensores instalados em qualquer coisa desde carros até medidores de água de refrigeradores - irá mudar a natureza do tráfego de Internet como conhecemos hoje.
Claro, o IPv6 faz mais do que simplesmente estender o espaçamento de endereço. Este upgrade do IPv4 (não há IPv5 - o ID de protocolo 5 foi usado para o Internet Stream Protocol, RFC 1819) torna a configuração de nó fácil e automática - outro ponto favorável para aplicações embarcadas. Isto também faz a rede como um todo ser mais robusta e extensível, e adiciona características de segurança e suporte para qualidade de serviço não disponíveis anteriormente. Mais importante, o IPv6 também ajuda na velocidade e simplificação de roteamento, que se tornaram um gargalo à medida que o uso da Internet aumentou.
O reestruturado e melhor IPv6 já é distribuído amplamente e configurado para gradualmente substituir o IPv4. Muitos, se não todos os roteadores já estão atualizados. Tendo progredido além do estágio de protótipo, agora forma uma parte padrão da maioria dos sistemas operacionais desktop, incluindo Windows XP, Mac OS X, Solaris e Linux. Enquanto isto stacks IPv4/IPv6 duais permitem ambientes mistos e uma migração gradual para o IPv6. (Onde o IPv6 não é suportado ainda, nós podem ainda se comunicar através de "túneis" sobre intermediários IPv4).
Este artigo introduz algumas das mudanças no IPv6 e sugere dicas práticas para adicionar rede IPv6 a dispositivos baseados em pequenos microcontroladores como o 8051. Assume-se que o leitor possua conhecimento básico de redes e uma razoável experiência com IPv4.

Visão geral do IPv6
Um aspecto importante da capacidade de auto-configuração do IPv6 é a forma que os endereços são usados. Um endereço de 128 bits IPv6 é tipicamente dividido em um prefixo de 64 bits (chamado de net bits, que define a sub-rede) e 64 bits de host. O prefixo, que também mostra o escopo de um endereço, pode ser atribuído pelo provedor de rede e enviado por broadcast por roteadores, ou ele pode ser local ao site. Geralmente, os primeiros 48 dos bits de rede são atribuídos pelo ISP; os outros 16 estão dentro dos cuidados do proprietário do site.
Na Ethernet, os 64 bits de host podem ser derivados do endereço físico único de 48 bits, também conhecidos como endereço (veja barra lateral sobre endereços EUI-64) media access control (MAC). Em outras palavras, ao contrário do IPv4 onde os endereços IP e os endereços MAC são distintos, cada nó IPv6 combina todos endereços em um só e possui um endereço IP válido assim que ele se conecta. Novamente, ao contrário do IPv4 (que requer ajuda de um servidor BOOTP/DHCP), todos os nós IPv6 podem ser auto-configuráveis, mesmo na falta de um servidor. Para comunicar globalmente, o nó deve solicitar ou escutar os broadcasts do roteador contendo o prefixo e então combinar o prefixo com o EUI-64.
Endereços EUI-64
O identificador único extendido de 64 bits, ou EUI-64, foi definido em antecipação à possível sobrecarga do espaço de endereçamento único de 48 bits (EUI-48). Tanto o EUI-48 quanto o EUI-64 definem os primeiros 24 bits como o Company_ID, que é administrado pela IEEE Registration Authority Committee (http://standards.ieee.org/regauth). A organização proprietária do respectivo Company_ID atribui e administra os bits restantes.
A RFC 2373 descreve como inserir um par de valores de 8 bits (FF e FE) depois do terceiro octeto no meio do MAC de 48 bits para derivar o EUI-64.
Por exemplo, se 00-60-35 é o Company_ID e o endereço MAC de 48 bits de um nó é 00-60-35-23-45-67, o EUI-64 deste nó será 00-60-35-FF-FE-23-45-67.
Para gerar um endereço IPv6 que especifique aquele nó suficientemente para a rede local, o prefixo FE80:0000:0000:0000 é inserido e, seguindo as regras da RFC 2373, o bit 1 no primeiro octeto do EUI-64 é setado: FE80:0000:0000:0000:0260:35FF:FE23:4567.
Endereços IPv6 são escritos em notação hexadecimal e em grupos de 16 bits. Por exemplo:

3FFE:AAAA:BBBB:CCCC:0260:35FF:FE8D:6EE9

é um endereço de escopo global. A mesma máquina teria o endereço de "link local" FE80::0260:35FF:FE8D:6EE9, onde o FE80::/64 é o prefixo para endereços de link local, (o número depois da barra mostra o comprimento do prefixo, neste caso 64, e :: representa zeros). O host de loopback (127.0.0.1 na linguagem IPv4) é simplesmente ::1. Endereços locais de site possuem um prefixo de FEC0::/10, mas já que não há equivalente direto de endereços locais de site no IPv4, estes endereços são raramente usados hoje.
Já que longos endereços hexadecimais de 128 bits são difíceis para humanos entenderem, eles são normalmente escondidos por trás de nomes domain name system (DNS) como www.embedded.com. Um servidor DNS capaz de usar IPv6 (por exemplo, BIND9) é necessário para servir endereços de IPv6. A tradução de endereços IPv6 não incorpora fundamentalmente novos conceitos, então uma entrada de endereço IPv6 no DNS seria criada, por exemplo, como:

IN AAAA 3FFE:AAAA:BBBB:CCCC:0260:35FF:FE8D:6EE9

ao invés do similarmente formatado registro IN A usado no IPv4. O uso do DNS é fortemente encorajado, já que se espera mudanças mais frequentes nos prefixos de IPv6 do que de endereços IPv4. Renumeração de rede é muito mais fácil com o IPv6 e pode até mesmo ser automatizado.
O IPv6 inclui tanto endereços de unicast quanto multicast. Além disto, ele define um novo destino de anycast. Um pacote endereçado para um IP de anycast é entregue ao mais próximo ou melhor de vários hosts disponíveis. O anycast ajuda a balancear cargas através do roteamento e é um avanço considerável sobre o round-robin DNS (usado no IPv4), que não leva em conta detalhes de roteamento.

Camadas superiores
O IPv6 mantém as camadas superiores de protocolo, UDP e TCP, sem mudanças. Contudo, o cabeçalho de pacote IP é modificado para acomodar os endereços maiores. O cabeçalho de pacote IP é também limpo e simplificado para ser alinhado em 64 bits, para o benefício de roteadores, para que sempre tenham um comprimento fixo.
O checksum do cabeçalho IP não é mais usado porque o UDP e TCP possuem checksums que incluem partes daquele cabeçalho. Roteadores podem rotear pacotes mais rapidamente se eles não tiverem que primeiro recalcular o checksum do cabeçalho em cada pacote. Para compensar a potencial corrupção de cabeçalho de pacote IP, o checksum de camada mais alta é feito mandatório no UDP. Era opcional em sistemas IPv4, apesar de muitos hosts usarem ele.
Uma modificação interessante é a substituição do Address Resolution Protocol (ARP) do IPv4 com o novo Neighbor Discovery Protocol (NDP), que é parte do Internet Control Message Protocol versão 6 (ICMPv6). Ao invés de mandar broadcasts de requisição de resolução de endereços para todos os hosts, o IPv6 mapeia grupos de multicasts e endereços de IPv6 de uma forma que elimina broadcasts e assegura que um dado nó receba (quase) somente o trafego que é de interesse dele (veja a barra lateral sobre grupos de multicast).
Grupos Multicast
Um endereço multicast que é computado como função do endereço do nó é chamado um endereço de multicast de nó solicidado. O algoritmo completo é definido na RFC 2373. Em resumo, o endereço multicast de nó solicitado é formado tomando-se os 24 bits de ordem menor do endereço e anexando aqueles bits ao prefixo FF02:0:0:0:0:1:FF00::/104.
Por exemplo, o endereço de nó FE80::260:35FF:FE23:4567 se torna FF02::1:FF23:4567.
Os detalhes do ICMPv6, multicasting e NDP estão além do escopo deste artigo. Mais informação sobre estes e outros tópicos está disponível em www.ipv6.org.

IPv6 embarcado
O novo mundo de dispositivos embarcados traz o TCP/IP para as menores ferramentas e as conecta à rede. Enquanto a visão da torradeira em rede de forma justa morreu com o desaparecimento de certas companhias de startup, a conectividade é uma característica desejável para outros dispositivos do dia a dia, tais como medidores de energia, gravadores de vídeo pessoais e máquinas de respostas.
Há várias abordagens para se adicionar redes TCP/IP a dispositivos embarcados. Uma prática comum é usar um sistema operacional, tais quais VxWorks, Windows CE, ou Linux, com uma suíte de protocolo TCP/IP incluída. Se estas soluções não se adequam à sua plataforma, você pode adicionar um de um grande número de implementações de terceiros do stack TCP/IP para quase qualquer um sistema operacional real-time.

Micro IPv6
Se hardware muito potente (processador e memória) está fora de questão em seu sistema, parecerá difícil implementar o IPv6. Muitos sistemas embarcados, por exemplo, possuem menos de 64KB para código e 128KB para dados, incluindo toda a memória disponível para o OS, stack TCP/IP com suporte ao IPv6 e a própria aplicação.
Felizmente, a implementação completa de todas as funções do IPv6 não é tecnicamente necessária em várias áreas. Estas áreas são esclarecidas no documento InternetNode "Requerimentos mínimos de ferramentas IPv6 para redes de baixo custo" (este documento, juntamente com outros, está disponível em http://www.taca.jp/docs.html). Em particular, muitas funções de roteamento são opcionais. Por exemplo, a segurança é frequentemente também disponível no nível de aplicação (especialmente se a aplicação tem que dar suporte ao IPv4). O IPv6 pode ser canalizado sobre redes IPv4 existentes ("6over4", no jargão), mas esta é outra área onde o código pode ser removido de end nodes.
Na Dallas Semiconductor, nós modificamos uma suíte de protocolo IPv4 mínima para compatibilidade com IPv6. Nós tínhamos como alvo um microcontrolador baseado em 8051, o DS80C400, com 64KB de ROM[1].
Quando nós começamos a implementar o IPv6 juntamente com o IPv4, nós fomos tentados a simplesmente duplicar o código, por exemplo ao criar um módulo TCP6 próximo de um TCP4. Isto foi eliminado, no entanto, por nosso apertado "orçamento" de memória. Ao invés de criar um segundo set de rotinas, nós modificamos implementações existentes de protocolo de alto nível (TCP, UDP, e outros) para trabalhar tanto com IPv4 quanto com IPv6.
A realidade é que aplicações existentes hoje suportam IPv4 e a vasta maioria das novas aplicações irão ainda operar sob o IPv4, não IPv6. Para justificar o suporte ao IPv6 do lado da aplicação, o stack de rede tem que tornar o menos doloroso possível adicionar suporte IPv6 a uma aplicação. Por exemplo, uma implementação que tem uma função socket() para IPv4 e uma função separada socket6() para IPv6 não será provavelmente bem recebida pelos desenvolvedores. Mantendo as implementações de protocolos de alto nível e a API os mesmos para ambas versões tornará mais fácil para o programador de aplicação adaptar-se às mudanças.
Nós rapidamente descobrimos que um número de otimizações eram necessárias para espremer o IPv6 em nossa pequena ROM. Além de estabelecer limites óbvios como o tamanho máximo de pacote suportado, uma idéia que nos salvou de muita dor de cabeça foi sempre usar endereços de 128 bits de tamanho, mesmo com o IPv4. Já que o prefixo ::0/96 (12 bytes de zeros no início) não é atualmente usado pelo IPv6 com exceção do localhost ::1, nós declaramos todos os endereços começando com ::0/96 como sendo endereços IPv4 e colocamos os endereços IPv4 de fato nos restantes 32 bits. Isto eliminou um grande número de construções if-then-else, tornou desnecessários flags de endereço de protocolo, e simplificou enormemente a passagem de parâmetros. É verdade que não há mais localhost IPv6 mais, mas o localhost IPv4 (127.0.0.1) ainda funciona e, quando se fala consigo mesmo, ninguém realmente importa muito com qual o protocolo usado.

Tabela 1: O tamanho do código TCP/IP na ROM do DS80C400
MóduloTamanho de códigoIPv4IPv6Compartilhado
ARP1111X
DHCP2366X
ICMP1949X
IGMP1346X
IP2487X
ICMP6/Ping63346X
IP 66999X
NDP67962X
Driver Ethernet2677X
TCP10494X
TFTP584X
UDP1225X
Tamanho total4254692591830714980

Tabela 1 mostra o tamanho de código para cada módulo na suíte revisada de protocolo TCP/IP. O código foi escrito em assembler para 8051.

Preparar, apontar, fogo!
IPv6 está se tornando mais importante. Suporte a esta tecnologia será crucial para o sucesso de muitos dispositivos embarcados vindouros. Além de melhorar o protocolo IP, IPv6 fornece auto-configuração, um número virtualmente ilimitado de endereços IP e alguns alinhamentos do protocolo IP e do processo de roteamento.
A implementação do IPv6 em um dispositivo embarcado pode ser cheio de manhas, e você terá que fazer compromissos. Os benefícios, contudo, valem a pena, e não é de forma alguma impossível - mesmo em um microcontrolador de 8 bits com 64KB de ROM.

Robert Muchsel é um engenheiro de software senior na Dallas Semiconductor. Ele possui um diploma em ciências da computação do Instituto Federal Suíço de Tecnologia em Zurique e tem desenvolvido software por 12 anos. Seu endereço de e-mail é robert.muchsel@dalsemi.com.

Notas finais
1. A porção IPv6 do software do DS80C400 foi desenvolvido em colaboração com InternetNode, um empreendimento conjunto de Yokogawa e Wide Research Institute.

Nenhum comentário:

Postar um comentário

Você também poderá gostar de