Urządzenia w sieci globalnej łączą się używając adresu IP, jednak IP są zmienne i przypisywane do urządzeń na określony czas (za wyjątkiem mechanizmów pozwalających przypiąć na stałe IP do urządzenia, np rezerwując dla danego MAC konkretne IP w ustawieniach routera).

W sieci lokalnej urządzenia również są identyfikowane poprzez IP, tzn komunikują się wg TCP/IP pomiędzy IP, jednak urządzenie samo w sobie nie posiada czegoś takiego jak adres IP.

Adres IP jest nadawany ręcznie lub automatycznie (DHCP), jednak faktyczne połączenie następuje w najniższych warstwach OSI, pomiędzy urządzeniami znającymi swój adres MAC.

Urządzenie, które chce wysłać dane do innego, ale nie zna jego MAC, znając tylko IP, musi dokonać zamiany IP na MAC. Do tego celu służy protokół ARP. Urządzenie, które nie znam MAC odbiorcy, wysyła do wszystkich urządzeń w sieci lokalnej zapytanie, które można by określić kolokwialnie tak: „Hey, które z was ma przydzielony adres IP <konkretny adres>”? Do wszystkich, to znaczy że w miiejsce adresu MAC odbiorcy wpisuje adres rozgłoszeniowy. Dla MAC ma on postać FF:FF:FF:FF:FF:FF .

Każde urządzenie w sieci lokalnej odbiera ten komunikat i porównuje poszukiwany w nim adres IP ze swoim. Jeśli adresy się zgadzają – odpowiada: „Hej, IP o który pytasz to mój IP, zaś mój MAC to <wartość adresu MAC>”.

W ten sposób urządzenie dowiaduje się, że z adresem IP jest skojarzony adres MAC. Zapamiętuje te dane w swojej tabeli ARP, a gdy następny razem chce wysłać pod ten adres IP -korzysta ze swojej tablicy, nie pytając już do kogo ten IP należy.

przykład tablicy ARP w Linux (Ubuntu):

wiks@dellwiks:~$ arp 
Address             HWtype  HWaddress           Flags Mask            Iface
192.168.0.65        ether   08:11:96:f0:7e:44   C                     eno1
_gateway            ether   00:25:86:a2:a6:60   C                     eno1
wiks@dellwiks:~$ arp -n
Address             HWtype  HWaddress           Flags Mask            Iface
192.168.0.65        ether   08:11:96:f0:7e:44   C                     eno1
192.168.0.1         ether   00:25:86:a2:a6:60   C                     eno1

tablicę ARP możemy nie tylko oglądać w różny sposób (opcje), ale także modyfikować, np dopisując ręcznie skojarzenia IP – MAC:

wiks@dellwiks:~$ arp -s 192.168.0.199 08:08:08:08:08:08
SIOCSARP: Operacja niedozwolona

ale wymagane są do tego uprawnienia root:

wiks@dellwiks:~$ sudo arp -s 192.168.1.199 08:08:08:08:08:08
wiks@dellwiks:~$ arp -n
Address             HWtype  HWaddress           Flags Mask            Iface
192.168.0.65        ether   08:11:96:f0:7e:44   C                     eno1
192.168.0.199       ether   08:08:08:08:08:08   CM                    eno1
192.168.0.1         ether   00:25:86:a2:a6:60   C                     eno1

Możemy również wpisać pary IP – MAC z pliku – opcja -f.

Wpisy do tabeli ARP są dodawane, gdy urządzenie otrzymuje odpowiedź na wysłane pytanie o MAC dla IP, ale także gdy otrzymuje takie pytanie od innego komputera (bo zawiera ono MAC i IP nadawcy -pytającego).

Wpis w tabeli ARP ma czas, po którym 'znika’. Dla linuxa, czas ten (w sekundach) możemy sprawdzić tak:

cat /proc/sys/net/ipv4/neigh/default/gc_stale_time
60

…albo ustawić tak

wiks@dellwiks:~$ sudo sysctl -w net.ipv4.neigh.default.gc_stale_time=99
net.ipv4.neigh.default.gc_stale_time = 99
wiks@dellwiks:~$ cat /proc/sys/net/ipv4/neigh/default/gc_stale_time
99

aby sprawdzić jakie opcje oferuje komenda arp:

wiks@dellwiks:~$ arp --help
Usage:
  arp [-vn]  [<HW>] [-i <if>] [-a] [<hostname>]             <-Display ARP cache
  arp [-v]          [-i <if>] -d  <host> [pub]               <-Delete ARP entry
  arp [-vnD] [<HW>] [-i <if>] -f  [<filename>]            <-Add entry from file
  arp [-v]   [<HW>] [-i <if>] -s  <host> <hwaddr> [temp]            <-Add entry
  arp [-v]   [<HW>] [-i <if>] -Ds <host> <if> [netmask <nm>] pub          <-''-

        -a                       display (all) hosts in alternative (BSD) style
        -e                       display (all) hosts in default (Linux) style
        -s, --set                set a new ARP entry
        -d, --delete             delete a specified entry
        -v, --verbose            be verbose
        -n, --numeric            don't resolve names
        -i, --device             specify network interface (e.g. eth0)
        -D, --use-device         read <hwaddr> from given device
        -A, -p, --protocol       specify protocol family
        -f, --file               read new entries from file or from /etc/ethers

  <HW>=Use '-H <hw>' to specify hardware address type. Default: ether
  List of possible hardware types (which support ARP):
    ash (Ash) ether (Ethernet) ax25 (AMPR AX.25) 
    netrom (AMPR NET/ROM) rose (AMPR ROSE) arcnet (ARCnet) 
    dlci (Frame Relay DLCI) fddi (Fiber Distributed Data Interface) hippi (HIPPI) 
    irda (IrLAP) x25 (generic X.25) eui64 (Generic EUI-64) 

tabela ARP ma swój rozmiar, oraz określone wielkości, wpływające na prace związane z jej oczyszczaniem (garbage colector) – dla Ubuntu & Kali Linux:

wiks@dellwiks:~$ cat /proc/sys/net/ipv4/neigh/default/gc_thresh1
128
wiks@dellwiks:~$ cat /proc/sys/net/ipv4/neigh/default/gc_thresh2
512
wiks@dellwiks:~$ cat /proc/sys/net/ipv4/neigh/default/gc_thresh3
1024
wiks@dellwiks:~$ sudo sysctl -w net.ipv4.neigh.default.gc_thresh1=128
net.ipv4.neigh.default.gc_thresh1 = 128

Powyższa zmiana będzie obowiązywała jedynie do ponownego uruchomienia systemu. Aby zachować taką zmianę na dłużej, należy poczyniść odpowiednie wpisy w /etc/sysctl.conf.

Gdy tablica zostanie wypełniona do wartości maksymalnej -tj: gc_thresh3 w logach systemu pojawi się komunikat:

kernel: [138585.922764] IPv4: Neighbour table overflow

Co stanie się gdy z jakiegoś powodu tablica ARP zostanie wypełniona, a nasze urządzenie będzie chciało połączyć się z innym, którego adres IP ma, ale nie przypisany do MAC?

Nasz komputer, nie mogąc uzyskać adresu MAC odbiorcy, będzie wysyłał informacje na adres rozgłoszeniowy FF:FF:FF:FF:FF:FF – czyli do wszystkich.

Podobnie będzie w przypadku przełącznika/switcha. I to jest jeden ze sposobów, aby będąc w jednym z segmentów sieci – rozdzielonym przełącznikiem od innych, uzyskać podgląd /podsłuch ruchu. Przełacznik będzie wysyłała dane do wszystkich, na adres rozgłoszeniowy, jeśli tablica ARP będzie przepełniona, a nie będzie znał MAC odbiorcy. Taki atak nazywa się MAC flooding.

zobacz: arp , zobacz też: arp-scan