Documentos de Académico
Documentos de Profesional
Documentos de Cultura
tremendo auge que tendría Internet en el mundo. Ni siquiera se pensaba que la informática tendría
un papel tan destacado ni que hubiese tantos ordenadores en tan breve espacio de tiempo. Prueba de
ello son declaraciones como las siguientes:
• Vint Cerf (uno de los padres de Internet): "Pensé que 4 mil millones de direcciones serían
suficientes".
• Thomas Watson (1943), presidente de IBM: "En el mundo sólo hay mercado para 5
computadoras".
• Ken Olsen, fundador de Digital Equipment: "No hay motivo alguno para que alguien quiera
tener un ordenador en casa".
Alguna de las limitaciones de IPv4 que IPv6 mejora son:
1. Escasez de direcciones (se encuentran prácticamente agotadas y sería así de no ser por
NAT). Esto es debido al mal reparto de direcciones que se hizo antes del auge de Internet,
más que a una escasez real. El mal reparto también influyó sobre el routing.
2. El mecanismo de routing, que es ahora más eficiente. En la actualidad las tablas de
encaminamiento de los troncales de Internet son gigantescas, provocado en gran medida por
una asignación caprichosa de direcciones en su día. Esto es especialmente importante en la
DFZ (Default Free Zone). Además, la cabecera de IPv6 está preparada para ser procesada en
bloques de 64 bits, para mayor eficacia de los procesadores de 64 bits.
3. Uso de protocolos como NAT y DHCP. El ejemplo de NAT es el más claro ejemplo de
protocolo totalmente innecesario si existiesen suficientes direcciones IP en el mundo, como
ocurre con IPv6. NAT es incompatible con el uso de determinados protocolos, como
Kerberos, RTP (Real-Time Trasport Protocol), algunas funcionalidades de IPsec, etc.
4. Necesidad de protocolos 'añadidos' para aumentar su funcionalidad, como QoS o IPsec entre
otros, protocolos que a veces han presentado problemas de incompatibilidad al usar más de
uno de ellos simultáneamente.
El protocolo IPv4 puede albergar un máximo de 4.294.967.296 direcciones, mientras que IPv6
alcanza las 340.282.366.920.938.463.463.374.607.431.768.211.456, una cantidad casi inimaginable
para un ser humano. Con IPv6 es posible dar a cada ordenador una IP pública, sin necesidad de
utilizar NAT (u otras técnicas) y sin importar si está dentro de una red local privada o no.
Paradójicamente, antes de adentrarnos más en IPv6 vamos a ver cómo se desactiva el uso de IPv6
en distribuciones Linux:
sysctl -w net.ipv6.conf.eth0.autoconf=0
o
sysctl -w net.ipv6.conf.all.autoconf=0
Formato de una dirección IPv6. Extraído del RFC4291.
De forma semejante a las direcciones IPv4 donde se tenía una parte de red y otra de host, en IPv6 se
tienen también dos partes. La parte 'de red' recibe aquí el nombre de prefijo mientras que la parte de
host se denomina Identificador de Interfaz o IID (ver RFC7136).
Las direcciones IPv6 se representan en hexadecimal mediante el siguiente formato:
xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx. Donde cada x representa un dígito en notación
hexadecimal. No está prohibido el uso de mayúsculas para representar los caracteres en
hexadecimal de una IPv6, aunque el RFC 5952 advierte de posibles problemas de legibilidad al usar
mayúsculas, ya que la 'D' se puede confundir con un '0' y la 'B' con un '8' e indica que se deben usar
minúsculas (apartados 3.4.3 y 4.3.).
Este formato es "comprimible" mediante varias opciones, recogidas también en el RFC 5952:
Quitando los ceros a la izquierda en cada grupo de 4 dígitos en hexadecimal que aparezca separado
por ':' (dos puntos). Ejemplo: la dirección 3ffe:0b80:1b64:0001:0000:0000:0000:0002 se representa
normalmente así: 3ffe:b80:1b64:1:0:0:0:2, acortando su longitud. Se sigue la indicación de que los
ceros a la izquierda no tienen valor en cada grupo de 4 dígitos en hexadecimal (en cada grupo de
16-bits).
Eliminando una cadena de ceros consecutivos que aparezca en la dirección. Sólo se puede eliminar
una única cadena de ceros, por lo que si hay más de una cadena consecutiva de ceros se tendrá que
elegir por eliminar sólo una de ellas, normalmente la más larga. Por ejemplo, la dirección
3ffe:b80:1b64:1:0:0:0:2 puede comprimirse como 3ffe:b80:1b64:1::2, que es bastante más corto.
La dirección de loopback, que en IPv4 es "127.0.0.1" es, en IPv6, ::1 (0:0:0:0:0:0:0:1).
IPv4 e IPv6 pueden convivir juntas. Una dirección IPv4 puede 'convertirse' en una dirección IPv6
mediante la nomenclatura ::ffff:w.x.y.z, siendo w.x.y.z la dirección en formato IPv4. De este modo
se puede alcanzar una dirección IPv4 utilizando redes IPv6.
Representación de direcciones en IPv6
La representación de las direcciones IPv6 sigue el siguiente esquema:
Forma 1ª o notación extendida: Se representa como X:X:X:X:X:X:X:X, donde “X” es un valor en
hexadecimal de 16 bits, de la porción correspondiente a la dirección IPv6. No es preciso escribir los
ceros a la izquierda de cada campo.
Ejemplos:
fedc:ba98:7654:3210:fedc:ba98:7654:3210
2080:0:0:0:8:30:20a:428b
Como no es necesario poner los ceros a la izquierda de cada uno de los campos, la dirección
2010:0e67:0432:0:0:0:0:0123 puede (y debe) escribirse: 2010:e67:432:0:0:0:0:123
Forma 2ª o notación comprimida (Zero Compression): Dado que, por el direccionamiento que se
ha definido, podrán existir largas cadenas de bits “cero”, se permite la escritura de su abreviación,
mediante el uso de “::”, que representa múltiples grupos consecutivos de 16 bits “cero”. Este
símbolo sólo puede aparecer una vez en la dirección IPv6. En caso de que haya más de un grupo de
ceros se debe usar el más largo para comprimirlo. Si son de igual longitud, el RFC 5952 da
flexibilidad para que se pueda elegir cualquiera de las opciones, pero recomienda comprimir el
primer grupo.
Ejemplos:
Las direcciones:
2080:0:0:0:8:30:20a:428b (una dirección unicast)
ff01:0:0:0:0:0:0:101 (una dirección multicast)
0:0:0:0:0:0:0:1 (la dirección loopback)
0:0:0:0:0:0:0:0 (una dirección no especificada)
Pueden representarse como:
2080::8:30:20a:428b (una dirección unicast)
ff01::101 (una dirección multicast)
::1 (la dirección loopback)
:: (una dirección no especificada)
Nota: El RFC5952 hace una recomendación de que no se utilice esta compresión para un único
grupo de ceros de 16 bits, de cara a facilitar la legibilidad por el ser humano, a pesar del RFC4291
que no decía nada al respecto.
Forma 3ª o notación mixta: Otra forma muy conveniente en entornos mixtos IPv4/IPv6, es
x:x:x:x:x:x:d.d.d.d, donde “x” representa valores hexadecimales de 16 bits (6 porciones de mayor
peso), y “d” representa valores decimales (estándar IPv4) de las 4 porciones de 8 bits de menor
peso.
Ejemplos:
Las direcciones:
0:0:0:0:0:0:d01:4403
0:0:0:0:0:ffff:8190:3426
Pueden representarse como:
::13.1.68.3
::ffff:129.144.52.38
Representación de un socket en IPv6
Son representaciones válidas de dirección y puerto en IPv6 según el RFC5952 las siguientes:
• [2001:db8::1]:80
• 2001:db8::1:80
• 2001:db8::1.80
• 2001:db8::1 port 80
• 2001:db8::1p80
• 2001:db8::1#80
Se recomienda usar el primero, pero todos son admisibles. Así nos podemos encontrar casos como:
:::80
que sería la forma comprimida de:
0:0:0:0:0:0:0:0:80
y podría representar el puerto 80 en cualquier interfaz IPv6 disponible.
Representación de prefijos
En IPv6 a la parte de red se le denomina prefijo. Un prefijo se representa de modo similar a cómo se
representaban las direcciones de red en IPv4 con CIDR, es decir, la dirección se rellena con ceros
hasta el final y a continuación y separado por una barra se indica la longitud del prefijo. Ejemplo
(extraído del RFC): Las siguientes son formas válidas (o legales en terminología original) de
representar un prefijo:
• 2001:db8:0000:cd30:0000:0000:0000:0000/60
• 2001:db8::cd30:0:0:0:0/60
• 2001:db8:0:cd30::/60
Sin embargo las siguientes formas no son 'legales' (respecto al prefijo representado anteriormente):
• 2001:db8:0:cd3/60: porque no se incluye la dirección completa. Además no corresponde a
los prefijos anteriormente representados al quitarle un cero al final de un bloque de 16-bits.
• 2001:db8::cd30/60: porque no se expandiría en 2001:db8:0:0:0:0:0:cd30/60
• 2001:db8::cd3/60: por motivos citados en los anteriores
Autoconfiguración IPv6
Existen dos modos de autoconfiguración en IPv6:
1. Autoconfiguración con estado o statefull: es semejante a la existente en IPv4 y se realiza
mediante DHCP, en este caso DHCPv6. Para aprender más consultar el rfc sobre
DHCPv6 RFC 3315.
2. Autoconfiguración sin estado o stateless: IPv6 es capaz de asignar direcciones en función de
la dirección MAC del dispositivo de red. El proceso es el siguiente:
1. El host crea primero una dirección local de enlace. Esto se logra tomando el prefijo
local de enlace de 10 bits (1111 1110 10), agregándole 54 ceros y agregándole el
identificador de interfaz de 64 bits, que cualquier host sabe cómo generar a partir de
su tarjeta de interfaz. El resultado es una dirección de enlace local de 128 bits.
2. El host luego verifica que la dirección local de enlace sea única y no esté siendo
usada por otro host. Como se supone que el identificador de interfaz es único, la
dirección local de enlace generada es única con una gran probabilidad. Sin embargo,
para estar seguro, el host envía un neighbor solicitation message y espera un
neighbor advertisement message. Si algún host en la subred está usando esta
dirección local de enlace, el proceso falla y el host no puede autoconfigurarse,
necesita usar otro medio como DHCP para este propósito.
3. Si se pasa la prueba de unicidad de la dirección local de enlace, el host almacena esta
dirección como su dirección local de enlace (para comunicación privada), pero
aún necesita una dirección unicast global. El host entonces envía un router
solicitation message a un enrutador local. Si existe un enrutador corriendo en la red,
el host recibe un router advertisement message que incluye el prefijo unicast global
y el prefijo de subred que el host necesita para agregar a su identificador de interfaz
para generar su dirección unicast global. Si el enrutador no puede ayudar al host con
la configuración, éste informa al host en el router advertisement message. El host
entonces necesita usar otros mecanismos para su configuración.
Visto de forma práctica
Supongamos la MAC: 00:1e:33:3b:5a:94
Los últimos 6 dígitos en hexadecimal (24 bits) se corresponden con los últimos de la dirección
IPv6:
xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xx3b:5a94
Los 4 anteriores en hexadecimal serán fffe según marcan los RFCs:
xxxx:xxxx:xxxx:xxxx:xxxx:xxff:fe3b:5a94
Para los 6 dígitos anteriores en hexadecimal se usan los 6 primeros de la MAC, pero con una
variación en el primer byte. La variación consiste en complementar el segundo bit menos
significativo, llamado bit 'u', bit 'u/l' o bit universal/local debido a que se puede usar para indicar el
alcance o ámbito (scope) de la dirección. En nuestro caso el primer byte es 00, lo que en binario
sería 00000000. Al complementar el segundo bit menos significativo se obtendría: 00000010.
La dirección IPv6 va quedando así:
xxxx:xxxx:xxxx:xxxx:021e:33ff:fe3b:5a94
Con esto se completa el identificador de host, pues se usa máscara /64. El valor resultante,
equivalente en nuestro ejemplo a:
021e:33ff:fe3b:5a94
recibe el nombre de Modified EUI-64 o Interfaz Única Extendida Modificada.
El prefijo de red es el de una dirección unicast local de enlace:
fe80:0000:0000:0000:021e:33ff:fe3b:5a94
Podríamos comprimir esta dirección tal y como vimos con anterioridad, primero eliminando el cero
a la izquierda del 5º byte:
fe80:0000:0000:0000:21e:33ff:fe3b:5a94
Y posteriormente comprimiendo la cadena de ceros:
fe80::21e:33ff:fe3b:5a94
Una imagen vale más que mil palabras:
Además, la dirección unicast local de enlace autoconfigurada sin estado se considera provisional
hasta que se comprueba que no hay vecinos con la misma dirección. Esto se realiza mediante
mensajes ICMPv6 de Neighbor Solicitation. Si un host responde con la misma IP se suspende la
autoconfiguración y necesitaría ser configurada de forma manual o vía DHCP6.
Una vez configurada la IP el host intenta comunicar con los enrutadores. El prefijo de red se
completa con la información obtenida de los routers, siempre y cuando estos lo difundan mediante
mensajes ICMPv6. Si no lo hacen, el host intentará una autoconfiguración con estado, que sólo será
posible si hay un servidor DHCPv6 a la escucha.
El segundo bit menos significativo del IID o Identificador de Interfaz, como hemos visto, recibe el
nombre de bit 'u' y puede contener un valor de cero para indicar ámbito local o de 1 para indicar
ámbito universal.
El bit menos significativo es el bit de grupo (group) o bit 'g' e identifica cuando una dirección es
individual o de grupo, es decir, si identifica a una sola interfaz o no.
• Compatibles con IPv4
Una dirección IPv6 que indica un nodo sólo IPv4. Tienen el prefijo IP 0:0:0:0:0:0. Por
ejemplo, 0:0:0:0:0:0:9.180.214.114. Las direcciones compatibles con IPv4 y las mapeadas a
IPv4 utilizan el mismo espacio de direcciones. El prefijo sólo indica si el nodo soporta o no
IPv6. Las direcciones compatibles con IPv4 se consideran ya obsoletas.
El resto son sólo IPv6. En una dirección sólo IPv6 los 32 bits de menor peso no contienen
necesariamente una dirección IPv4. Los 96 bits de orden superior son distintos de 0:0:0:0:0:ffff o
0:0:0:0:0:0.
Espacio de direcciones
Según el RFC4291 el espacio de direcciones queda así:
Como se puede apreciar se diferencian las direcciones Multicast de las Unicast, pero no ocurre lo
mismo con las Anycast. Las direcciones Anycast se toman del espacio de direcciones Unicast.
Direcciones especiales:
fe8x:, fe9x:, feax, febx El prefijo de enlace local (link local) específica que
la dirección sólo es válida en el enlace físico local.
fecx:, fedx:, feex:, fefx El prefijo de sitio local (site-local prefix) indica que
la dirección sólo es válida dentro de un ámbito local.
El RFC 3879 lo declaró obsoleto, estableciendo que
los sistemas futuros no deben implementar ningún
soporte para este tipo de dirección especial. Se
deben sustituir por direcciones Local IPv6 Unicast.
4 12 16 24 32
• Etiqueta de flujo (flow label): Se emplea para gestionar tráfico en tiempo real.
• Longitud de la carga útil (payload length): Como su nombre indica, el tamaño de los datos.
• Siguiente cabecera (next header): Se utilizan cabeceras encadenadas de longitud fija, por lo
que desaparece además el campo de opciones.
• Límite de saltos (hop limit): Equivalente al TTL de IPv4.
La cabecera IPv6 es más grande que la cabecera IPv4, debido principalmente a que se cuadruplica
el tamaño de las direcciones (origen y destino). Sin embargo es más fácil de procesar debido a su
menor número de campos (de 12 a 8). Además tiene un formato adecuado para ser manejada por los
procesadores de 64 bits.
Los campos Priority y Flow Label permiten que IPv6 integre QoS (Quality of Service), CoS (Class
of Service), etc.
Como se puede apreciar se han eliminado los siguientes campos:
• Checksum: No es función de este nivel proveer de un mecanismo de control de errores.
• Fragmentación: Ahora se tiene que producir entre los extremos y se maneja mediante
mensajes ICMPv6. Desaparecen así los campos Identificación, Indicadores y Posición del
fragmento, aunque se incluyen (estos o similares) en la cabecera de fragmentación
(Fragment header).
• Header y Opciones: Ya no son necesarios con las cabeceras encadenadas de longitud fija.
Mediante el campo next header se pueden encadenar cabeceras, como se indica en el RFC 2460. De
esta forma, a fin de que el procedimiento de la cabecera del datagrama IP sea más rápido, se ha
dividido la cabecera del protocolo IPv6 en una cabecera básica y una o más cabecera de extensión.
Algunos ejemplos:
• Cabecera típica conteniendo protocolo del nivel de transporte:
• Cabecera de routing:
Comandos a conocer:
En linux: ip neigh show
En Windows es muchísimo más facil e intuitivo: netsh interface ipv6 show neighbors interface
“INTERFACE“
ICMPv6
Los mensajes ICMPv6 que se emplean para estas funciones se pueden ver en el RFC 2461. Están
enumerados en la siguiente tabla:
137 Redirect
NOTA: Por supuesto que existen muchos otros mensajes ICMPv6, como el echo Request, el Echo
Reply, etc, pero en la tabla anterior se han incluido sólo unos pocos que se emplean para
descubrimiento de vecinos y autoconfiguración.
Routing IPv6
El modelo de enrutamiento en IPv6 es jerárquico, es decir, las direcciones dependen
estrictamente de la topología de la red.
Un router procesa los paquetes IPv6 de forma parecida a lo que hace con IPv4, pero no igual.
Cuando recibe una trama (nivel de enlace) mira el protocolo que viene encapsulado dentro y si es
IPv6 comprueba si tiene información de ruteo para la dirección de destino especificada en el
paquete IPv6. Si varias entradas coinciden, le aplicará la más específica. Por ejemplo, supongamos
que la ip de destino es 8080::30:20A:428B y el router tiene las siguientes entradas en sus tablas de
routing:
8080::/32 via interfaz A
8080::/40 via interfaz B
En este caso se enviará a través de la interfaz B, ya que es más específica.
Si hay más de una ruta para un mismo prefijo se evalúan otras cosas como:
Peso de la ruta: cada ruta tiene asociado un entero entre 0 y 255. Se elige la ruta con menor valor.
Si la ruta fue aprendida mediante un protocolo de enrutamiento interno (como RIP, OSPF o IS-IS) o
mediante un protocolo externo (BGP, por ejemplo). Se prioriza los internos.
El siguiente paso es decrementar, normalmente en una unidad salvo que tenga indicado algo
diferente, el campo Hop-Limit (ver cabecera de IPv6).
Por último se envía el paquete por la interfaz adecuada.
Para realizar un ping mediante IPv6 es preciso indicar la interfaz a través de la cual se realiza.
Ejemplos:
ping fe80::5549:3176:540a:3e09%eth0
ping fe80::5549:3176:540a:3e09%1
En ambos casos se emplea el signo del % para indicar a continuación la interfaz.
Es posible que necesitemos hacer uso del modificador -6 (en Windows) o usar en su lugar el
comando ping6 (en Linux), por ejemplo si lo hacemos especificando un nombre FQDN:
ping6 www.iescierva.net
ping -6 www.iescierva.net