Saltar a contenido

Protocolo arp

El protocolo ARP

Introducción

ARP (Address Resolution Protocol) es un protocolo de nivel de enlace/red que permite averiguar qué dirección MAC corresponde a una dirección IP dentro de una misma red local (LAN). Funciona mapeando IP → MAC, necesario porque una red Ethernet necesita direcciones MAC para enviar tramas.

Los equipos para comunicarse a nivel de red utilizan direcciones lógicas, las direcciones IP.

Para que un paquete IP llegue a su destinatario, en la capa de enlace al encapsular el paquete en una trama hemos de saber la dirección MAC a la que tenemos que enviar la trama para añadirla al encabezado de la misa. Es hay donde entra en juego el protocolo ARP.

El Protocolo de Resolución de Dirección (en inglés ARP significa Address Resolution Protocol) o protocolo ARP permite averiguar la dirección MAC asociada a una determinada dirección IP.

Funcionamiento.

El sistema operativo de los equipos guarda en memoria cache un tabla llamada tabla de búsqueda en la que en cada entrada hay correspondencias entre direcciones IP y direcciones MAC.

Cada una de estas entradas se guarda durante un periodo de tiempo corto ya que los equipos puede cambiar tanto sus direcciones IP como sus direcciones físicas (MAC)

Supongamos que el el host A (IP 192.168.1.10) quiere enviar algo a B (IP 192.168.1.20) e inicialmente el contenido de su tabla de búsqueda es el siguiente:

arp -n
Dirección                TipoHW  DirecciónHW         Indic Máscara         Interfaz
192.168.1.1              ether   60:ce:86:bf:d8:d6   C                     eno1
192.168.1.14             ether   dc:62:79:87:df:fe   C                     eno1

No sabe la dirección MAC que tiene el equipo con IP 192.168.1.20. Para descubrirla utiliza ARP.

El proceso es el siguiente

  1. A envía un ARP Request (difusión / broadcast):

  2. MAC destino: FF:FF:FF:FF:FF:FF

  3. Pregunta: “¿Quién tiene la IP 192.168.1.20?”

  4. B recibe el broadcast (porque llega a todos los equipos en la LAN).

  5. B responde con un ARP Reply (unicast):

  6. “El equipo con IP 192.168.1.20 soy yo, mi MAC es AA:BB:CC:11:22:33”.

  7. A actualiza su tabla ARP con esa correspondencia. Si ahora consultamos su contenido es el siguiente:

arp -n
Dirección                TipoHW  DirecciónHW         Indic Máscara         Interfaz
192.168.1.1              ether   60:ce:86:bf:d8:d6   C                     eno1
192.168.1.14             ether   dc:62:79:87:df:fe   C                     eno1
192.168.1.20             ether   aa:bb:cc:11:22:33   C                     eno1

Y A ya puede construir la trama para comunicarse con B

De forma resumida, el esquema de funcionamiento del protocolo sería el siguiente:

img

Esquema y campos de un paquete ARP**

ARP Request / ARP Reply contienen:

Campo Descripción
Hardware Type 1 para Ethernet
Protocol Type 0x0800 para IPv4
Hardware Size 6 (bytes MAC)
Protocol Size 4 (bytes IP)
Opcode 1 = Request, 2 = Reply
Sender MAC Address MAC del emisor
Sender IP Address IP del emisor
Target MAC Address En Request: 00:00:00:00:00:00
Target IP Address IP del destino

Los campos del paquete que nos interesan son:

  • Sender MAC Address
  • Sender IP Address
  • Target MAC Address
  • IP del destino

Ejemplo ARP Request

Para el ejemplo anterior, los campos del ARP request serían:

  • Sender MAC: 10:AB:22:33:44:55
  • Sender IP: 192.168.1.10
  • Target MAC: 00:00:00:00:00:00
  • Target IP: 192.168.1.20

Target MAC es la MAC que queremos a averiguar, que como no la sabemos en la petición tienen todos sus bits a 0.

Este paquete se encapsula en una trama de difusión y se envía a la red.

Ejemplo de ARP Reply

Al ser una trama de difusión, todos los equipos de la red reciben la trama y la desencapsulan. Miran el campo Target IP del paquete y si la IP coincide con la del equipo este construye un paquete ARP Reply de respuesta con los valores:

  • Sender MAC: AA:BB:CC:11:22:33 - La MAC del equipo que responde qué es el valor a averiguar
  • Sender IP: 192.168.1.20
  • Target MAC: 10:AB:22:33:44:55
  • Target IP: 192.168.1.10

En el Reply simplemente se invierte el par Sender/Target, incluyendo en el Sender MAC la MAC que quiere averiguar el equipo A.

Este paquete es encapsulado en una trama unicast de respuesta y enviada por la red.

Funcionamiento del protocolo ARP cuando la IP de destino está en otra red

ARP solo se usa dentro de la misma red local.

Si A quiere llegar, por ejemplo, a la IP 1.1.1.1, aplica su máscara a la dirección y determina que dicha IP NO está en su red.

Entonces:

  1. A no puede enviar directamente la trama al destinatario, sino que se la envía al gateway (router) para que este se encargue de encaminarla a la siguiente red. Por lo tanto, necesita la MAC del router, no la de 1.1.1.1
  2. Si no la conoce, realiza un ARP Request para la IP del router.
  3. El router responde con su MAC.
  4. A envía la trama al router, y este ya se encarga del resto.

Tabla direccionamiento MAC de los switches al reciben tramas ARP

Como vimos en el apartado de conmutación de tramas, los switches aprenden direcciones MAC observando la MAC de origen de cualquier trama que les llega, incluidas las ARP. Por tanto:

  • Cuando un switch recibe una trama ARP Request, aprende que la MAC del emisor está en el puerto por el que entró y actualiza su tabla con dicha información.
  • Como el ARP Request va por broadcast, el switch lo reenvía por todos los demás puertos.
  • El ARP Reply es unicast, y cuando el switch lo recibe:

    • Aprende la MAC del host que responde.
    • Lo reenvía solo por el puerto correcto, que sabe cual es puesto que lo aprendió en el ARP Request.

Comandos arp en Linux

Para ver el contenido de la tabla ARP ejecutamos

$ arp -a

Si queremos ver los equipos incluidos por su IP en lugar de por su nombre utilizamos:

$ arp -n

Si queremos eliminar una determinada entrada de la tabla arp lo podemos hacer ejecutando:

$ sudo arp -d **direccion-ip**
  • Donde direccion-ip es la dirección IP de la entrada en la tabla que queremos eliminar

Si lo que quisieramos es limpiar todas las direcciones MAC de la tabla arp lo podemos hacer ejecutando:

$ sudo ip -s neigh flush all

Para averiguar el tiempo de vida de las entradas en la tabla arp lo podemos hacer ejecutando:

$ cat /proc/sys/net/ipv4/neigh/enp0s3/gc_stale_time