Estoy usando las .NET Framework
clases 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!!
fe80:10
(el0x0010
ser 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.)Respuestas:
El número después del '%' es la identificación del alcance.
IPv6 define al menos tres alcances de alcance para direcciones:
Globalmente direccionable. Esta es una dirección IPv6 que le proporcionó su ISP. Está disponible para usar en Internet público.
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.
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.
fuente
fe80::42
. Además, los enrutadores tienen la misma direcciónfe80::1
. Ahorafe80::1%X
se puede usar para diferenciar entre los enrutadores, perofe80::42%X
es de menor uso para el cliente, ¿verdad?fe80::1%1
llegar al enrutador conectado a la NIC # 1, y enviaría mensajesfe80::1%2
para 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.%nn
se puede omitir, por lo menos algunos comandos, por ejemploping
,tracert
.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,
%16
es 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
ifconfig
herramienta no lo muestra porque es obvio a qué interfaz pertenece una dirección. Pero en general debe tenerse en cuenta.fuente
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:
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
ping
comando 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.
fuente