¿Por qué hay un signo de porcentaje '%' en la dirección IPv6?

125

Estoy usando las .NET Frameworkclases para obtener las direcciones IP de mi máquina.

Dns.GetHostAddresses(Dns.GetHostName())

Tengo un adaptador VirtualBox que tiene una dirección IPv4 e IPv6. Usando el código .NET obtengo la dirección IPv6 comofe80::71a3:2b00:ddd3:753f%16

Observe el% 16 al final?

Sin embargo, si consulto lo mismo usando WMI, obtengo la dirección como 'fe80 :: 71a3: 2b00: ddd3: 753f'

Entonces, ¿el% 16 tiene algún significado especial?

Editar:

Acabo de tener algunas observaciones más sobre esto. Y coinciden bastante bien con lo que dijo Stephen Jennings en su respuesta.

Instalé Vmware para ver qué dirección IPv6 emitió. Las direcciones fueron: fe80 :: 3dd0: 7f8e: 57b7: 34d5% 19

fe80 :: b059: 65f4: e877: c40% 20

Claramente, los números después de% no son una representación hexadecimal. Verifiqué todas las propiedades disponibles para un adaptador de red usando Wmi y descubrí que los números son exactamente iguales a la propiedad InterfaceIndex de cada adaptador de red. Según MSDN , identifica de forma exclusiva cada adaptador de red y esta propiedad se introdujo en Vista.

Lo que aún me confundía era por qué la clase IPAddress le permitía crear una dirección IP en ese formato a menos que fuera válida. La respuesta fue proporcionada por Stephen. El número es la identificación del alcance. IPAddress tiene un constructor que acepta la dirección Y una identificación de alcance.

Ah, y todos estos tres adaptadores de red eran enlaces locales. Confirmado a través de ipconfig

Bueno. ¡¡Eso fue interesante!!

Amith George
fuente
2
No tenía idea de lo que era antes de que lo preguntaras. También aprendí algo interesante sobre IPv6 hoy (qué nerds somos).
Stephen Jennings el
@Stephen, ¿has trabajado antes con ipv6? Me sorprendió lo rápido que lo conseguiste. Había buscado en Google por bastante tiempo antes de publicar la pregunta aquí. ¡Buen trabajo!
Amith George el
La búsqueda del "porcentaje de dirección ipv6" me dio el nombre que necesitaba, y de ahí buscar y tratar de dar sentido a la documentación técnica confusa tomó más tiempo. Entiendo lo que IPv6 está tratando de lograr, pero hay muchos conceptos nuevos que no he podido investigar y comprender. Este fue uno, y nada te da una mejor comprensión que tratar de explicárselo a alguien más.
Stephen Jennings el
Una notación alternativa podría ser fe80:10(el 0x0010ser 16). Lo uso en mi navegador cuando trabajo con direcciones IPv6 de enlace local, pero no estoy 100% seguro de que esto esté de acuerdo con los estándares. (Usando el porcentaje en las URL es desordenado en los navegadores, de hecho no pude conseguir que funcione en absoluto.)
Arjan

Respuestas:

134

El número después del '%' es la identificación del alcance.

IPv6 define al menos tres alcances de alcance para direcciones:

  1. Globalmente direccionable. Esta es una dirección IPv6 que le proporcionó su ISP. Está disponible para usar en Internet público.

  2. Enlace local. Esto es similar al rango 169.254.XX. Es una dirección que se asigna una computadora para facilitar las comunicaciones locales. Estas direcciones no se enrutan en Internet pública porque no son globalmente únicas.

  3. Nodo-local. Esta es una dirección que identifica la interfaz local, similar a 127.0.0.1. Básicamente, esta es la dirección :: 1.

Microsoft ha publicado este artículo que describe el direccionamiento IPv6 , que es el artículo menos confuso que encontré. El artículo indica que la presencia de una identificación de alcance en su dirección significa que es una dirección de enlace local . También puede decir que es un enlace local porque la dirección comienza con fe80.

La información clara y simple sobre este tema parece ser rara, por lo que estoy armando el resto de esto basado en mi mejor comprensión de RFC 4007 y la otra información disponible.

Una computadora puede tener múltiples direcciones locales de enlace, cada una con un alcance diferente. La identificación del alcance indica para qué alcance es la dirección. Por ejemplo, imagine el escenario de una computadora con dos NIC, cada una con una dirección de enlace local en diferentes redes. Si intenta enviar algo a otra dirección que comience con fe80, ¿cómo sabrá la computadora en qué NIC enviar? La identificación del alcance parece ser la solución para esto.

Stephen Jennings
fuente
¡Gracias! Edité mi pregunta para agregar las cosas adicionales que observé mientras esperaba una respuesta. Y cuando vine a publicarlos, me sorprendió ver su respuesta confirmando las observaciones :)
Amith George
Buena respuesta. Déjame ver si entendí completamente eso. Por lo tanto, un dispositivo con dos NIC puede conectarse a dos enrutadores diferentes y obtener la misma dirección DHCP fe80::42. Además, los enrutadores tienen la misma dirección fe80::1. Ahora fe80::1%Xse puede usar para diferenciar entre los enrutadores, pero fe80::42%Xes de menor uso para el cliente, ¿verdad?
usuario123444555621
2
@ Pumbaa80 El cliente enviaría mensajes para fe80::1%1llegar al enrutador conectado a la NIC # 1, y enviaría mensajes fe80::1%2para llegar al enrutador conectado a la NIC # 2. Por otro lado, las direcciones locales de enlace se configuran automáticamente por la computadora host, no a través de DHCP, por lo que probablemente no asignaría a sus dos NIC la misma IP. También tenga en cuenta que las direcciones locales de enlace no son enrutables, por lo que generalmente no enviará mensajes a un enrutador, sino que enviará mensajes entre dos hosts.
Stephen Jennings el
por experimentación, parece que el arrastre %nnse puede omitir, por lo menos algunos comandos, por ejemplo ping, tracert.
Matt Wilkie
Muy buena respuesta. Solo mencionar que el ID de alcance es cero es especial, y parece indicar que un algoritmo específico de implementación para elegir un ID de alcance de la lista de interfaces con ese alcance de esa IP.
Arran Cudbard-Bell
21

Las direcciones IPv6 con el prefijo fe80 :: / 64 son direcciones locales de enlace que se construyen combinando ese prefijo con la dirección de hardware del dispositivo de red, 71a3: 2b00: ddd3: 753f en su ejemplo. (El análogo en IPv4 es 169.254.0.0/16.) Dado que el prefijo es el mismo para todas las direcciones locales de enlace en una máquina, el enrutamiento a veces puede necesitar saber a qué interfaz se refiere. Y eso es lo que especifica el número después del porcentaje, llamado índice de zona. Los detalles dependen del sistema operativo: en Windows, %16es la interfaz número 16; en Linux, por ejemplo, puede ver algo así %eth0.

Algunas herramientas o API considerarán este índice de zona sin importancia o implícito para sus propósitos. Por ejemplo, en Linux la ifconfigherramienta no lo muestra porque es obvio a qué interfaz pertenece una dirección. Pero en general debe tenerse en cuenta.

Peter Eisentraut
fuente
18

Los caracteres después del% (que en su ejemplo son números) son el Identificador de interfaz. Esos caracteres se utilizan para identificar una "interfaz de red", que la gente suele llamar una "tarjeta de red". Por ejemplo, puede ayudar a determinar si un paquete usará una tarjeta Ethernet con cable o un adaptador inalámbrico de Wi-Fi.

Supongo que estás usando Microsoft Windows. Utiliza números como identificadores de interfaz.

Como punto de comparación, los sistemas tipo Unix pueden usar letras después del signo%. p.ej:fe80::71a3:2b00:ddd3:753f%eth0

En ese caso, el identificador de interfaz eth0, coincide con el nombre de la tarjeta de red.

En Microsoft Windows, puede obtener una lista de los identificadores de interfaz (numéricos) utilizando una de las líneas de comando que verifican la tabla de enrutamiento. Prefiero " netstat -nr" ya que eso también funciona en otros sistemas operativos, pero Microsoft Windows también es compatible con " route print". El resultado resultante, que se informa, probablemente se extenderá por una pantalla larga, así que prepárate para desplazarte hacia atrás, a menos que canalices más.

por ejemplo, en mi sistema:

=========================================================================== Interface List 14...5c f9 dd 6d 98 b8 ......Realtek PCIe GBE Family Controller 12...e0 06 e6 7e fc 4e ......Bluetooth Device (Personal Area Network) 1...........................Software Loopback Interface 1 13...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter 15...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #2 ===========================================================================

En este caso, una dirección como fe80 :: 71a3: 2b00: ddd3: 753f% 14 se referiría a mi controlador de familia Realtek PCIe GBE. El "GBE" se refiere a Gigabit Ethernet.

Ahora, esta es la parte difícil: si desea hacer ping a una dirección remota, es posible que necesite usar la dirección IPv6 del sistema remoto, pero el identificador de interfaz del sistema local. Entonces, por ejemplo, si estoy usando la computadora A y tengo una dirección IPv6 local de fe80 :: 1 conectada a la interfaz número 14, y quiero hacer ping a la computadora B y tiene una dirección IPv6 local de fe80 :: 2 conectada a su interfaz número 16, entonces esto es lo que usaría:

ping fe80::2%14

Entonces, el pingcomando enviará el paquete ICMPv6 a la dirección IPv6 remota (fd80 :: 2), que pertenece a la computadora remota, y utilizará la interfaz con el Identificador 14 para hacerlo. El Identificador de interfaz 14 es un número del sistema que estoy usando, no el sistema remoto.

Ahora, veamos por qué esto podría ser necesario.

Si quiero hacer ping a la dirección IPv6 de Google (que es 2607: f8b0: 400a: 802 :: 200e en el momento en que escribí esta respuesta), la tabla de enrutamiento verificará qué tarjeta de red maneja las direcciones que comienzan con 2607: f8b0: 400a: 802. La tabla de enrutamiento indicará que ninguna de mis tarjetas de red está conectada directamente a una red usando direcciones que comienzan con 2607: f8b0: 400a: 802, por lo que mi computadora terminará usando una dirección de "puerta de enlace". Si me estaba conectando a otra red que es parte de la organización para la que estoy trabajando, podría tener una dirección especial de "puerta de enlace" que enruta el tráfico a una red privada. En este caso, no tengo una puerta de enlace más específica, por lo que utilizaré la "puerta de enlace predeterminada" IPv6. Así es como IPv6 funciona la mayor parte del tiempo, excepto para las direcciones locales de enlace. Así es como IPv4 funcionó la mayor parte del tiempo.

De acuerdo con RFC 4291 sección 2.8 , cada computadora que use IPv6 debe asignar una dirección de enlace local a cada interfaz de red. La sección 2.5.6 del RFC 4291 muestra los bits con los que deben comenzar las direcciones locales de enlace, lo que hace que las direcciones locales de enlace comiencen con "fe80: 0000: 0000: 0000:" (aunque muchos de esos ceros se colapsan en dos puntos) ) RFC 4291, sección 2.4, también describe el hecho de que esas direcciones comienzan con "fe80:" .

Si intenta hacer ping a un sistema remoto (p. Ej., "2607: f8b0: 400a: 802"), el proceso general generalmente es descubrir una red o subred de la que forma parte la dirección, lo que se hace mirando los bits Al inicio de la dirección. Luego, esos bits se utilizan para determinar cómo enrutar el tráfico.

Sin embargo, ese proceso no funciona para una dirección local de enlace IPv6, porque cada interfaz de red individual (operativa, activa) tiene una dirección local de enlace que comienza con "fe80:" en una subred usando el prefijo / tamaño de subred de "/ 64 ". Si está en una computadora portátil, es probable que encuentre que tanto su tarjeta Ethernet como su adaptador Wi-Fi tengan esa dirección IPv6.

Ahora, cuando envía su ping a fe80 :: 2, desea que su computadora envíe ese paquete a la tarjeta de red correcta. Si tiene una impresora que está conectada a una red cableada, no desea enviar el tráfico a su tarjeta Wi-Fi, utilizando una ruta / ruta de red que no provoque que el tráfico llegue a la impresora. Y si está intentando comunicarse con un dispositivo inalámbrico utilizando su tarjeta Wi-Fi, no quiere que su tráfico salga de la tarjeta Ethernet.

La solución es que especifique qué dispositivo de red desea que use el tráfico. Entonces, ese es el propósito del identificador de red.

TOOGAM
fuente
2
De acuerdo, al releer la respuesta de Peter Eisentraut , parece que la suya es técnicamente correcta. Espero que mis detalles brinden más claridad. No estoy de acuerdo con la respuesta de Stephen Jennings , porque esa respuesta hace que parezca que la "identificación del alcance" identifica "enlace local" como el alcance. Sin embargo, dos interfaces de red diferentes pueden ser "enlace local", pero no utilizarán el mismo "alcance" (según los ejemplos que se muestran en su lista numerada). En cambio, digo que esos números identifican la "interfaz" de la red.
TOOGAM