Programando em IPv6
Sockets em IPv6
- Sockets em IPv6
- Introdução
- Socket
- IPv4 e IPv6
- Mobile
- Dual Stack
- Problemas
- Cliente
- Servidor
- IPv4-mapped IPv6 address
- Soluções
- Happy Eyeballs
Introdução
Com o esgotamento do IPv4, é inevitável que o mundo começe a migrar para o IPv6 e, mesmo que aos poucos, pode-se observar que o número de serviços disponíveis em IPv6 vem aumentando. No entanto algumas precauções devem ser tomadas ao se adotar o novo protocolo.
Na área de programação, é necessário tomar um cuidado adicional, especialmente com relação aos sockets, pois sua implementação varia muito de acordo com a linguagem utilizada.
Socket
Basicamente um socket é um par composto por um IP e uma porta que criam uma interface de comunicação com outro socket, estabelecendo assim uma conexão entre as duas interfaces (rfc793#page-84).
IPv4 e IPv6
Apesar de serem parecidos, devemos tomar alguns cuidados na hora de se implementar sockets que suportem IPv6, principalmente em linguagens como C e C++. Algumas rfc’s ajudam na implementação de sockets em IPv6, como a rfc3493e arfc3542
É importante ressaltar que deve-se manter o suporte a sockets IPv4, como descrito na rfc3493#section-3.6, para se manter a compatilibidade com os serviços atuais.
Mobile
Também existem recomendações para sockets IPv6 em mobile, como é definido na rfc4584
Dual Stack
Ao se implementar um socket com suporte a IPv6, é recomendado que se mantenha o suporte tanto a IPv6 quanto a IPv4 de forma independente. A isso é dado o nome de Dual Stack (também conhecido como Dual IP Layer). Mais informações sobre o Dual Stack podem ser encontradas na rfc que o define (rfc4213) e na rfc que define o funcionamento das aplicações em Dual Stack (rfc4038#section-4).
Problemas
Sockets Dual Stack devem ser implementados com atenção especial, pois agora, ao se estabelecer uma conexão, ela pode ser feita tanto via IPv4 quanto IPv6. Com isso, alguns cuidados devem ser tomados, tanto no lado do cliente quanto no lado do servidor.
Cliente
No lado do cliente o principal problema está em decidir qual conexão será utilizada caso o servidor esteja em Dual Stack. Por padrão o cliente tenta se conectar primeiro em IPv6 e se não conseguir ele tenta via IPv4 (rfc3484#section-10.3). Apesar de ser um incentivo ao uso de IPv6, essa forma de decisão é problemática, pois caso a conexão em IPv6 esteja muito lenta ou com algum problema, mesmo que a conexão em IPv4 esteja boa o sistema vai preferir a conexão em IPv6, prejudicando o usuário. Além disso, essa técnica se torna prejudicial até mesmo para o lado do servidor, que pelo simples fato de possuir IPv6, irá prejudicar os usuários com IPv6, dando a impressão de que o serviço está lento, mesmo com o serviço em IPv4 estando normal.
Servidor
No lado do servidor a maior preocupação é em disponibilizar o serviço tanto em IPv4 quanto IPv6. Para isso basta criar 2 sockets, 1 em IPv4 e outro em IPv6, sendo que ambos escutam a mesma porta. O maior problema enfrentado nesse caso são os IPv4-mapped IPv6 address, pois a maioria dos sistemas impede a criação de um socket IPv4 e outro IPv6 na mesma porta quando se utiliza o IPv4-mapped IPv6 address.
IPv4-mapped IPv6 address
IPv4-mapped IPv6 address é uma das técnicas de tradução para tentar manter um grau de compatibilidade com o IPv4 (rfc3493#section-3.7). Essa técnica se baseia em utilizar apenas a estrutura do IPv6 como padrão e tratar endereços IPv4 como se fossem IPv6, através da máscara ::FFFF:/96 (rfc4291#section-2.5.5.2). A princípio parece uma boa idéia, mas ao se adotar essa técnica a segurança do sistema diminui, como é descrito na rfc4942#section-2.2.
Além disso, essa técnica gera ambuiguidade na rede, pois uma pessoa com IPv4 poderia se conectar num socket IPv6, mesmo sem existir um socket IPv4.
Soluções
Existem algumas recomendações que visam melhorar a utilização do IPv6 sem muitos problemas. No caso do IPv4-mapped IPv6 address é recomendado que se evite ao máximo o seu uso, além de atualizar os programas que ainda o utilizam. Dessa forma é possível ter mais controle sobre o que acontece nas conexões IPv4 e o que acontece nas conexões IPv6.
Happy Eyeballs
Definida na rfc6555, Happy Eyeballs é uma forma de tentar corrigir o problema de decisão sobre qual conexão preferir, caso as duas pontas possuam IPv4 e IPv6. Seu funcionamento consiste em tentar se conectar às duas conexões simultaneamente e utilizar aquela que é estabelecida mais rapidamente, dando uma leve preferência para a conexões IPv6. Browsers como Google Chrome e Mozilla Firefox em suas versões atuais já implementam o Happy Eyeballs e o utilizam por padrão.