¿Qué es el Neighbor Discovery Protocol (NDP)?

El protocolo de Internet es un componente esencial para las redes de Internet y de área local, pero para transportar la información digital y lograr que los paquetes de datos alcancen los hosts de destino es necesaria una serie de protocolos de ayuda y enrutamiento también conocidos como pila o familia de protocolos de Internet. Mientras que, por ejemplo, el Dynamic Host Configuration Protocol (DHCP) se encarga de asignar la dirección de red adecuada a los clientes al establecer la conexión IP, el Neighbor Discovery Protocol (NDP) se utiliza, entre otras cosas, para la comunicación entre hosts adyacentes en las redes de área local, así como también para determinar la puerta de enlace del router.

Definición del Neighbor Discovery Protocol

El Neighbor Discovery Protocol (“protocolo de descubrimiento de vecinos”) se utiliza junto con la versión más reciente del protocolo de Internet IPv6. Su principal objetivo es resolver las direcciones IPv6 en direcciones MAC válidas, que son las direcciones de hardware propias de cada dispositivo. En IPv4, el encargado de esta función era el Address Resolution Protocol (ARP). Todas las direcciones determinadas se almacenan en el llamado neighbor cache. Este buffer informa a los componentes de la red sobre las direcciones locales de los clientes vecinos y les suministra información adicional que puede ser necesaria, por ejemplo, para verificar la disponibilidad.

Además, tal y como se mencionó anteriormente, el NDP también es un instrumento para la asignación de la puerta de enlace estándar (standard gateway). Con la incorporación del Router Advertisement Protocol (RA) es posible verificar tanto el router estándar como los prefijos de red válidos, dos parámetros fundamentales de la configuración de red. Por último, el protocolo de red, que se encarga únicamente de intercambiar datos dentro de una red, funciona también como protocolo de apoyo para la configuración dinámica de direcciones. Este proceso también se conoce como configuración automática de direcciones sin estado (Stateless Automatic Address Configuration o SLAAC).

¿Cómo funciona el NDP?

Cualquier dispositivo que implemente el Neighbor Discovery Protocol para la comunicación en red, gestiona su propio neighbor cache. En este figuran todos los dispositivos conocidos de su red, verificables por su dirección de dispositivo único (MAC). Aquí es posible ver si la dirección en caché pertenece a un cliente o, por ejemplo, a un router. Sin embargo, el neighbor cache no es el único, sino uno de los cuatro buffers que sirven a las operaciones del protocolo NDP. Los otros tres componentes, que también son utilizados individualmente por cada dispositivo, son:

  • Caché de destino: este incluye entradas para los nodos de la red a los que ya se han enviado paquetes de datos. A su vez, cada una de estas entradas se refiere a una dirección en el neighbor cache, que se utiliza al enviar paquetes de datos al puerto de destino como hop o conexión intermedia.
  • Caché de prefijo: la lista de prefijos sirve para gestionar todos los prefijos válidos para la red en donde se encuentra el cliente. Esta lista es necesaria porque IPv6 soporta el multihoming (la accesibilidad de la red a través de dos proveedores diferentes)y porque permite la división del espacio de direcciones en diferentes prefijos.Con los registros en la caché de prefijo, el NDP se asegura de que el host de destino se encuentre en la misma subred. Cada prefijo, a excepción de la dirección MAC (también Link Layer Adress) dispone de un plazo fijo de validez, manteniendo así la memoria caché siempre al día.
  • Default Router List: esta lista incluye todos los routers conocidos que tienen contacto regularmente con el dispositivo. Cada entrada en esta lista está vinculada a una entrada en el neighbor cache. El hecho de que solo se incluyan routers activos se debe a que automáticamente se define un periodo de caducidad para todos los agentes. Una extensión o renovación solo tiene lugar tras la correspondiente notificación del router.

Para crear diferentes cachés para el Neighbor Discovery Protocol, se suele utilizar el protocolo de Internet conocido como ICMPv6 (Internet Control Message Protocol for the Internet Protocol Version 6).

Los cinco tipos de ICMPv6 sobre los que se fundamenta el NDP

En la versión actual de la familia de protocolos de Internet, ICMPv6 se utiliza como transmisor de notificaciones de información y de error, pero también lo utiliza el Neighbor Discovery Protocol en alguno de los cinco tipos de ICMPv6 diferentes. Dependiendo del tipo que se emplee se utilizan determinadas notificaciones, con cuya ayuda es posible crear las listas o los buffers.

Tipo 134: Router Advertisement

Periódicamente, los routers envían los llamados anuncios de enrutador o router advertisement (mensajes ICMPv6 del tipo 134) para informar a los participantes de la red sobre su presencia. De este modo, y entre otras cosas, distribuyen los datos de su enrutamiento y los parámetros necesarios para la configuración automática de la IP. El destino del mensaje es el rango de direcciones multicast estándar “ff02::01”, con el cual se establece la comunicación con todos los puertos relevantes en cada área de validez. De esta manera se obtiene también la dirección del router (puerta de enlace predeterminada) y el prefijo global. Este es el esquema del Routing Advertisement:

Por defecto, este tipo de mensajes tienen una longitud de 128 bits, aunque se pueden añadir bits adicionales para las opciones. Las opciones válidas son la dirección MAC del router, los datos sobre el tamaño máximo del paquete (“Maximum Transmission Unit”) y toda la información relevante del prefijo.

En correspondencia con el mensaje, el campo “tipo” se fija en 134 y el campo “código” siempre en 0. Le siguen la suma de comprobación ICMP de 16 bits y una indicación de 8 bits para el límite de saltos (hop) que contiene las estaciones intermedias recomendadas por el router.

A continuación figuran los bits que proporcionan información acerca de:

  • si las direcciones IP están disponibles a través del DHCPv6 dinámico (M)
  • y si se pueden obtener otros datos de la dirección a través del DHCPv6 dinámico (O).

El campo “reservado” permanece sin usar y es ignorado por el receptor. Además, los anuncios del router contienen cifras sobre:

  • el tiempo en segundos que el router debe permanecer en la Default Router List (vida útil del router; dato entero de 16 bits, máximo 65535);
  • el tiempo en milisegundos que, después de establecida la accesibilidad, debe estar disponible una dirección en el neighbor cache (tiempo máximo de accesibilidad; dato entero de 32 bits, máximo 50 días aprox.)
  • el tiempo en milisegundos, después del cual se puede volver a enviar un mensaje de solicitud (ver más adelante) (tiempo máximo de resolución; dato entero de 32 bits).

Tipo 133: Router Solicitation

Las solicitudes del router son mensajes que permiten al host pedir a todos los routers de su red que envíen los router advertisements. Estos responden con un mensaje del tipo 134 exclusivo para el host solicitante (unicast) o para todos los usuarios de la red (multicast). Con este tipo de mensajes, el host no tiene que esperar a la notificación automática del router de la red en el caso de una nueva conexión, por ejemplo. Este tipo de mensaje ICMPv6 está estructurado de la siguiente manera:

La estructura estándar de un mensaje ICMPv6 para NDP del tipo 133 tiene una longitud mínima de 64 bits. “Tipo” contiene el valor de solicitud 133, mientras que “código” se ajusta nuevamente a 0. Los otros dos campos obligatorios son la suma de comprobación ICMP (16 bits) y un campo de 32 bits “reservado” que se queda sin utilizar.

La única opción de entrada posible, que puede ser añadida al mensaje, es la dirección MAC del remitente.

Tipo 135: Neighbor Solicitation

Los clientes de la red envían Neighbor Solicitations para conseguir la dirección MAC de destino del host y, opcionalmente, transmiten a cambio su propia dirección. Si los equipos quieren encontrar una dirección, pueden transmitir este tipo de mensajes ICMPv6 por multicast o por unicast si solo quieren comprobar la disponibilidad de un vecino.

Como todos los mensajes ICMPv6, las Neighbor Solicitations también comienzan con la identificación de tipo de 8 bits (en este caso se le asigna el valor 135 a “tipo”), seguida por el código de 8 bits (definido en 0) y la suma de comprobación de 16 bits. Al igual que las otras notificaciones presentadas anteriormente, el campo “reservado” se queda sin usar.

Con 128 bits, la dirección IP que se tiene como objetivo (que no puede ser una dirección multicast) compone la mayor parte del mensaje, siendo su longitud total de al menos 192 bits. Este tipo de mensaje decisivo para el Neighbor Discovery Protocol también permite la especificación opcional de la dirección MAC del emisor.

Tipo 136: Neighbor Advertisement

Por un lado, los dispositivos de red envían Neighbor Advertisements como reacción a las Neighbor Solicitations entrantes y, por otro, sin que se solicite, informan a otros participantes sobre los cambios en la configuración de la dirección. La construcción de tales mensajes tiene este aspecto:

Los primeros 32 bits de la longitud estándar de 192 bits del Neighbor Advertisement se basan en el esquema típico de los mensajes ICMPv6: para “tipo” (136) y “código” (0) se reservan 8 bits, a los que siguen la suma de comprobación de 16 bits. A continuación siguen otros tres bits individuales con las siguientes condiciones:

  • R: el bit “R” se utiliza cuando el mensaje es enviado por un router.
  • S: si el mensaje contiene el bit “S”, se trata de una respuesta a una Unicast Neighbor Solicitation, con la que se confirma al usuario solicitante la disponibilidad de la red. Este bit no se debe usar como respuesta a las solicitudes multicast o en un Neighbor Advertisement ya iniciado.
  • O: la bandera “O” indica al destinatario del mensaje que sobrescriba la entrada en la caché.

Los 29 bits siguientes siguen el patrón anteriormente mencionado, es decir, se quedan en blanco, se inicializan con 0 y son ignorados por el receptor. Al añadir la dirección de destino de 128 bits se está incluyendo la parte más importante del mensaje. Esta puede ser la dirección IP desde la que se ha solicitado el Neighbor Advertisement o la dirección por la que se debe dar a conocer una nueva dirección MAC. Como opción, el router puede nombrar su propia dirección, algo que es obligatorio cuando este responde a una solicitud multicast.

Tipo 137: Redirect

Los routers tienen la posibilidad de informar a los hosts de la red acerca del primer mejor hop en el camino hacia las direcciones de destino. Para ello, envían Redirects ICMPv6 NDP que siguen el siguiente esquema:

Con una longitud mínima de 320 bits, los Redirects son los mensajes ICMPv6 más grandes y de gran relevancia para el funcionamiento del Neighbor Discovery Protocol. A la estructura con secuencias de bits para la definición de “tipo” (137), de código (0), de la suma de comprobación y de un campo “reservado” sin utilizar (32 bits), le siguen la dirección del hop recomendado y la dirección a la cual se recomienda este desvío (ambas 128 bits). Opcionalmente el paquete de mensajes puede contener la dirección MAC del destino y la cabecera del paquete redirigido.

Desafíos y posibilidades del NDP

Evidentemente, existe una gran cantidad de información en cuanto a los mecanismos de caché y los recursos de comunicación del Neighbor Discovery Protocol en combinación con el protocolo de control de mensajes de Internet (Internet Control Message Protocol). Los siguientes escenarios del NDP ilustran la interacción y el funcionamiento de ambos protocolos:

  • Reconocimiento del router y del prefijo de red: todos los routers en una red transmiten Router Advertisements a todos los usuarios de la red a través de multicast. Estos contienen, entre otras cosas, información como la dirección, el prefijo de red y el enrutamiento, que sirven para crear la Default Router List y la Prefix List. Sobre la base de estos registros los clientes determinan la puerta de enlace determinada y la máscara de subred. Debido a que todas estas entradas tienen una validez limitada, solo el router activo permanece registrado. Los anuncios del router también se pueden forzar con ayuda de las Router Solicitations.
  • Determinar los parámetros importantes para la transmisión de paquetes: opcionalmente, los Router Advertisements pueden contener información sobre los parámetros que deben aplicar los clientes durante la transmisión de paquetes. Se puede tratar de información muy concreta como, por ejemplo, el tamaño máximo del paquete, pero también de parámetros de Internet más amplios como el límite de estaciones intermedias prescrito para los paquetes salientes.
  • Determinar el siguiente hop: Si se tiene que enviar un paquete, el protocolo ND se encarga de comprobar si la caché de destino ya contiene una entrada para el host de destino previsto. Si no es así, el protocolo determina cuál es el próximo nodo intermedio a partir de la información en la lista de prefijos y en la del router estándar. A continuación, se almacena el nuevo estado de información en la memoria caché de destino, con lo que estará disponible de inmediato con una nueva solicitud. En caso de que no haya un equivalente en el neighbor cache, se genera automáticamente y se inicia la resolución de la dirección.
  • Resolver direcciones IP en direcciones MAC: para determinar la dirección MAC de un host específico en la red, este recibe una Neighbor Solicitation a través de IPv6 Multicast en su propia y muy específica dirección de multidifusión. A esta única combinación de direcciones solo puede responder el host. Como respuesta, este envía un mensaje de Neighbor Advertisement con la dirección MAC almacenada por el cliente inicial en su neighbor cache. De esta manera el NDP no solo se utiliza para identificar vecinos, sino también para definir routers.
  • Reconocer la falta de disponibilidad de un vecino: la relevancia de todas las direcciones MAC almacenadas en el neighbor cache tiene que comprobarse regularmente. Siempre y cuando se envíen desde una dirección registrada datos IP/TCP o confirmaciones de entrada, esta dirección figura como activa y el host responsable como disponible. En caso de que no se hayan intercambiado datos con el dispositivo en un tiempo y haya expirado la validez de la entrada, entonces se considera obsoleta. Para comprobar si, de hecho, el host en cuestión no está disponible, se envía primero un paquete de datos a la dirección registrada. Si no hay respuesta se realiza un último test a través de una Neighbor Solicitation Unicast. Si este confirma la inaccesibilidad, esta entrada desaparecerá del neighbor cache.
  • Detectar direcciones duplicadas: si un dispositivo ha obtenido una dirección por autoconfiguración, el NDP considera a esta dirección en un primer momento como “tentative” (provisional). Antes de activarse definitivamente, sin embargo, debe clasificarse como “inequívoca”. Con este fin, el cliente de red recién conectado envía una Neighbor Solicitation a la dirección temporal que quiere usar él mismo junto con una dirección temporal de retorno no específica. Si otro host ya utiliza dicha dirección, este responderá a la dirección de multidifusión general con un mensaje de Neighbor Advertisement. El cliente que realiza la comprobación también lo recibe, después de lo que obtiene una nueva dirección.
  • Informar sobre las opciones de redirección: con los mensajes de redirección, el Neighbor Discovery Protocol ofrece a los routers la posibilidad de optimizar el camino de los paquetes de datos hacia su host de destino. Como se mencionó anteriormente, con la ayuda del tipo ICMPv6 137, estos pueden hacer recomendaciones de las estaciones intermedias más adecuadas que, a la vez, deben incluirse en el caché de destino.

Te mostramos cómo inspeccionar el neighbor cache en tu sistema

Independientemente de si se trata de Windows, macOS, Linux, iOS o Android, todos los sistemas operativos modernos son compatibles con IPv6 y, por lo tanto, tienen la capacidad de recurrir al Neighbor Discovery Protocol en redes basadas en Ethernet. Con la ayuda del comando apropiado en la terminal de línea de comandos es posible visualizar el neighbor cache de tu dispositivo en cualquier momento.

En Windows, por ejemplo, puedes consultar tus vecinos de red con la ayuda del programa netsch (network Shell) y el siguiente comando:

netsh interface ipv6 show neighbors

Con la mayoría de distribuciones Linux se puede acceder al neighbor cache con ayuda de la herramienta iproute2 y el comando:

ip -6 neigh

En macOS y otras distribuciones basadas en BSD se accede a las entradas en cache de la siguiente manera:

ndp -a