2011-02-04 19 views
10

Para divertirme, me gustaría entender mejor los componentes básicos o los elementos que están dentro de una dirección IPv6.Guía definitiva para comprender cómo formular una dirección IPv6

Éstos son los fundamentos, desde mi entendimiento:

  • direcciones IPv6 son 128 bits de longitud (escrito como 8 bloques, cada uno con 16 bits)
  • Cada bloque se codifica como dígitos hexadecimales entre 0 y 0xffff . Los ceros a la izquierda pueden omitirse.
  • Se puede agregar una dirección IPv4 doted-quad, y ocupará los 32 bits inferiores de la dirección IPv6. 1: 2: 3: 4: 5: 6: 200.201.202.203. (Las reglas para IPv4 son las esperadas).
  • La representación de IPv4 solo puede aparecer al final.
  • Es posible usar la sintaxis de dos puntos para representar uno o más bloques con ceros. 1: 2 :: 7: 8 es equivalente a 1: 2: 0: 0: 0: 0: 7: 8.
  • Cada dirección IPv6 solo puede tener una coma doble dentro, de lo contrario es sintácticamente incorrecta.
  • Dos puntos dobles pueden aparecer al principio, en el medio o al final de un ip6, pero no dentro de una dirección de cuatro puntos con IPv4.

¿Son correctos todos los puntos anteriores?

Por favor, no me diga que lea el RFC. Hay varios sobre este tema, y ​​ninguno viene con algunos ejemplos simples para describir los diversos mecanismos de codificación. Estoy seguro de que muchos apreciarían una lista simple con ejemplos.

herramienta de prueba en línea La herramienta en línea más cercana a ayudar es http://www.dominicsayers.com/source/beta/is_email/test/ pero los mensajes son confusos y que en realidad no dice de manera clara Inglés lo que es correcto y lo incorrecto y por qué. También está diseñado para correos electrónicos que, por supuesto, pueden contener direcciones IPv6, por lo que no es exactamente ideal.

+0

Desafortunadamente, el enlace dominical al programa is_email/test se ha roto. –

+0

En una dirección IPv4 puede omitir middle-zero cuadripléjicos. Por ejemplo, 10.0.0.248 se puede escribir 10.248. No estoy seguro de si puede hacer eso al final de una dirección IPv6, como 1: 2: 3: 4: 5: 6: 10.248. –

Respuesta

7

En general, sí, sus puntos son correctos.

¿Estás seguro de que lees la RFC? RFC 3513, section 2.2 tiene exactamente lo que estás pidiendo. Está muy bien escrito, para un RFC. =) No puedo evitar señalar esto, ya que puede ser muy útil para las futuras personas que lean esta pregunta.

+0

Espero haber leído el RFC correcto, ya que hay algunos que están relacionados. 2.2 incluye algunas muestras, pero no incluye ejemplos de errores fáciles de cometer ... Por ejemplo, no incluye un ip6 con dos bloques vacíos :: con una nota que explique por qué esto está mal ... –

+0

@mP, Bueno, sí dice que "The" :: "solo puede aparecer una vez en una dirección., pero tiene razón en que no dice por qué. Si lo piensas, no es demasiado difícil descubrir por qué. Imagine una dirección como ':: 1 ::', que podría expandirse a 6 direcciones únicas. Es ambiguo permitir dos, y en los casos en que no sería ambiguo, sería inútil. – mpontillo

+1

[RFC 5952, una recomendación para representación de texto de dirección IPv6] (https://tools.ietf.org/html/rfc5952) ha actualizado el estándar para la representación de texto canónico para direcciones IPv6. –

6

Obviamente este bit es un error tipográfico:

es posible utilizar dos puntos dobles sintaxis para representar uno o más bloques con ceros. 1: 2 :: 6: 7 es equivalente a 1: 2: 3: 4: 5: 6: 7: 8.

1:2::6:7 significa 1:2:0:0:0:0:6:7.

que no había oído esto antes:

dos puntos dobles [no aparecerá] dentro de una IP4 dot dirección.

Pero hice un programa de prueba, y parece confirmarlo.

$ ./testipv6 0:0:0:0:0:0:192.168.0.1 
0:0:0:0:0:0:192.168.0.1: OK 

$ ./testipv6 0:0:0:0:0:0:192.168::1 
0:0:0:0:0:0:192.168::1: ERROR 

De lo contrario, creo que todo lo que ha dicho está bien.


testipv6.c

#include <stdio.h> 
#include <stdlib.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 

int convert(const char *addr) 
{ 
    struct in6_addr dst; 

    return inet_pton(AF_INET6, addr, (void *)&dst); 
} 

int main(int argc, char **argv) 
{ 
    if (argc == 1) { 
     fprintf(stderr, "Usage: testipv6 <addr>\n"); 
     exit(2); 
    } 

    while (argc > 1) { 
     argc--, argv++; 
     const char *addr = argv[0]; 

     if (convert(addr)) { 
      printf("%s: OK\n", addr); 
     } else { 
      printf("%s: ERROR\n", addr); 
     } 
    } 
} 
+0

Gracias por la detección de errores tipográficos. Yo mismo no estoy exactamente seguro ya que hay muchas excepciones. Eche un vistazo a las tonterías que son posibles con los correos electrónicos: uno puede incrustar comentarios aquí. Eso puede ser obsoleto, pero el por qué se incluyó está más allá de mí. Traté de escribir un programa, pero este tipo de pruebas de Blackbox podría dejar de lado algunos casos extraños de los que no tengo conocimiento :) –

+0

Solo di los puntos a Mike porque encontró un fragmento en el archivo oficial. –

+0

+1 para el código fuente. A veces la mejor manera de aprender algo es experimentarlo por ti mismo. =) Además, es una buena introducción a inet_pton() que cualquiera que codifique C para IPv6 debería conocer. – mpontillo

0

Las direcciones IPv6 con ID de zona tienen una notación única, aunque no es específica de la dirección en sí. En un sistema con múltiples interfaces habilitadas para IPv6, la dirección local del enlace debe ser desambiguada de alguna manera. Se hace usando la notación "%".

FE80 :: AA% eth0 hace referencia a la dirección local del enlace accesible a través de la interfaz eth0. Puede ser un índice de interfaz en algunas plataformas, FE80 :: AA% 10

Cuestiones relacionadas