ARP(7)

NAZWA
arp - moduł ARP jądra Linuksa

OPIS
Ten moduł protokołu w jądrze zawiera implementację protokołu rozpoznawania adresów (ang. Address Resolution Protocol) zdefiniowanego w RFC 826. Służy on do przekształcania adresów sprzętowych warstwy 2 na adresy protokołu IPv4 w sieciach o bezpośrednim połączeniu. Normalnie użytkownik nie korzysta bezpośrednio z tego modułu, z wyjątkiem konfigurowania go; służy on innym protokołom w jądrze. Proces użytkownika może odbierać pakiety ARP za pomocą gniazd packet(7). Istnieje także mechanizm zarządzania pamięcią podręczną ARP w przestrzeni użytkownika za pomocą gniazd netlink(7). Tabelą ARP można również zarządzać za pomocą ioctl(2) lub dowolnego gniazda PF_INET. Moduł ARP zarządza pamięcią podręczną odwzorowań pomiędzy adresami sprzętowymi i adresami protokołu. Pamięć podręczna ma ograniczony rozmiar, więc stare i rzadko używane wpisy są usuwane. Wpisy oznaczone jako trwałe nie są nigdy usuwane podczas procesu czyszczenia. Można manipulować bezpośrednio tą pamięcią podręczną za pomocą kontrolek wejścia/wyjścia (ang. ioctls) a jej zachowanie można dostrajać za pomocą zdefiniowanych poniżej kontrolek systemowych (ang. sysctls). Gdy dla istniejącego odwzorowania nie ma pozytywnych odpowiedzi, po pewnym czasie (patrz kontrolki systemowe poniżej) wpis w pamięci podręcznej dla danego adresu jest uważany za przestarzały. Pozytywna odpowiedź może zostać odebrana od wyższej warstwy; na przykład jako pozytywne potwierdzenie TCP. Inne protokoły mogą sygnalizować postępy w połączeniu za pomocą znacznika MSG_CONFIRM w sendmsg(2). Gdy nie ma postępów w połączeniu ARP próbuje próbkować ponownie. Najpierw próbuje odpytać o zaktualizowany adres MAC app_solicit razy lokalnego demona arp. Gdy to się nie powiedzie, a stary adres jest znany, to dokonywane jest ucast_solicit razy próbkowanie pojedyncze. Gdy to się również nie powiedzie, wysyłane jest w sieć nowe zapytanie rozgłoszeniowe ARP. Zapytania są wysyłane jedynie wtedy, gdy w kolejce do wysłania czekają jakieś dane. Linux automatycznie dodaje nietrwałe wpisy proxy arp po otrzymaniu zapytania dotyczącego adresu, dla którego są przekazywane pakiety, o ile dla interfejsu odbierającego dany pakiet włączono proxy arp. Gdy dla danego celu ustawiona jest droga odrzucająca pakiety (ang. reject route), wpis proxy arp nie jest dodawany.

IOCTL
Dla wszystkich gniazd PF_INET dostępne są trzy kontrolki wejścia/wyjścia. Pobierają one jako parametr wskaźnik do struktury struct arpreq.
struct arpreq {
	struct sockaddr	arp_pa;	/* adres protokołu */
	struct sockaddr	arp_ha;	/* adres sprzętowy */
	int	arp_flags;	/* znaczniki */
	struct sockaddr	arp_netmask;	/* maska sieci dla adresu protokołu */
	char	arp_dev[16];
};
SIOCSARP, SIOCDARP i SIOCGARP odpowiednio ustawiają, usuwają i pobierają odwzorowanie ARP. Ustawianie i usuwanie odwzorowań ARP jest operacją uprzywilejowaną i może zostać wykonane jedynie przez proces z ustawionym znacznikiem CAP_NET_ADMIN lub posiadający efektywny UID równy 0. arp_pa musi być gniazdem AF_INET a arp_ha musi być tego samego typu, co urządzenie podane w arp_dev. arp_dev jest zakończonym znakiem NUL łańcuchem stanowiącym nazwę urządzenia.
arp_flags
znacznik | znaczenie
ATF_COM | Zapytanie zakończone
ATF_PERM | Wpis trwały
ATF_PUBL | Wpis publikacji
ATF_USETRAILERS | Zażądano danych końcowych
ATF_NETMASK | Używanie maski sieci
ATF_DONTPUB | Nie odpowiadać

Gdy ustawiony jest znacznik ATF_NETMASK, to arp_netmask powinno być prawidłowe. Linux 2.2 nie wspiera wpisów proxy ARP dla sieci, więc należy to ustawić na 0xffffffff lub 0, aby usunąć istniejący wpis arp. ATF_USETRAILERS jest przestarzałe i nie powinno być używane.

SYSCTL
ARP wspiera interfejs sysctl, pozwalający konfigurować parametry globalne lub lokalne - dla podanego interfejsu. Dostęp do tych sysctli można uzyskać odczytując i zapisując pliki /proc/sys/net/ipv4/neigh/*/* lub używając interfejsu sysctl(2). Każdy interfejs w systemie ma swój własny katalog w /proc/sys/net/ipv4/neigh/. Ustawienia w katalogu 'default' są używane dla wszystkich nowo tworzonych urządzeń. Jeśli nie podano inaczej, wszystkie sysctl związane z czasem są podawane w sekundach.

anycast_delay
    Maksymalna liczba jiffies oczekiwania przed odpowiedzeniem na komunikat zaproszenia sąsiada IPv6. Obsługa anycast nie jest jeszcze zaimplementowana. Domyślnie 1 sekunda.

app_solicit
    Maksymalna liczba prób wysyłania demonowi ARP przestrzeni użytkownika poprzez netlink przed przejściem do prób multicast (patrz mcast_solicit). Domyślnie 0.

base_reachable_time
    Kiedy tylko sąsiad zostanie znaleziony, wpis jest uważany za ważny przez co najmniej losową wartość pomiędzy base_reachable_time/2 a 3*base_reachable_time/2. Ważność wpisu może być przedłużona, jeżeli otrzyma on takie wskazówki z protokołów wyższego poziomu. Domyślnie 30 sekund.

delay_first_probe_time
    Oczekiwanie przed pierwszą próbą po tym, jak sąsiad został uznany za niedostępny. Domyślnie 5 sekund.

gc_interval
    Jak często powinien się uruchamiać proces oczyszczania śmieci z listy wpisów o sąsiadach. Domyślnie 30 sekund.

gc_stale_time
    Określa, jak często należy sprawdzać wpisy o niedostępnych sąsiadach. Kiedy sąsiad zostanie uznany za niedostępnego, jest on ponownie sprawdzany przed próbą wysłania danych do niego. Domyślnie 60 sekund.

gc_thresh1
    Minimalna liczba wpisów przechowywanych w buforze ARP. Proces czyszczenia starych wpisów nie uruchomi się, jeżeli bufor zawiera mniej wpisów niż podana tutaj wartość. Domyślnie - 128.

gc_thresh2
    Miękka maksymalna liczba wpisów trzymanych w buforze ARP. Proces czyszczenia śmieci pozwoli przekroczyć tę liczbę wpisów na 5 sekund przed rozpoczęciem czyszczenia. Domyślnie 512.

gc_thresh3
    Twarda maksymalna liczba wpisów przechowywanych w buforze ARP. Proces czyszczenia śmieci zawsze się uruchomi, jeśli bufor zawiera więcej wpisów niż wynosi ta liczba. Domyślnie 1024.

locktime
    Minimalna liczba jiffies, przez którą wpis ARP będzie przechowywany w buforze. Zabezpiecza to bufor ARP przed zabiciem, jeżeli jest więcej niż jedno możliwe mapowanie (z powodu złej konfiguracji sieci). Domyślnie 1 sekunda.

mcast_solicit
    Maksymalna liczba prób rozwiązywania adresu za pomocą multicast/broadcast przed zaznaczeniem wpisu jako niedostępny. Domyślnie 3.

proxy_delay
    Kiedy otrzymano żądanie ATP dla znanego adresu proxy-ARP, to poczekaj proxy_delay jiffies przed wysłaniem odpowiedzi. Jest to używane, aby zapobiec zalaniu sieci żądaniami w pewnych przypadkach. Domyślnie 0.8 sekundy.

proxy_qlen
    Maksymalna liczba pakietów, które mogą być zakolejkowane w adresie proxy-ARP. Wartość domyślna to 64.

retrans_time
    Liczba jiffies oczekiwania przed ponowną transmisją żądania. Domyślnie 1 sekunda.

ucast_solicit
    Maksymalna liczba prób wysłania żądań unicast przed zapytaniem demona ARP (patrz app_solicit). Domyślnie 3.

unres_qlen
    Maksymalna liczba pakietów, które mogą być kolejkowane przez inne warstwy sieci dla każdego nierozwiązanego adresu. Domyślnie 3.

BŁĘDY
Niektóre ustawienia timera są podawane w jednostkach jiffy, które są zależne od architektury. Dla architektury Alpha jiffy to 1/1024 sekundy, na większości pozostałych architektur jest to 1/100s. Nie ma możliwości zasygnalizowania postępów w połączeniu z przestrzeni użytkownika. Oznacza to, że protokoły połączeniowe zaimplementowane w przestrzeni użytkownika będą generować nadmierny ruch ARP, gdyż ndisc będzie dokonywał regularnego próbkowania adresów MAC. Ten sam problem dotyczy niektórych protokołów jądra (np. NFS-u po UDP). Ta strona podręcznika miesza ze sobą funkcje charakterystyczne dla IPv4 z funkcjami wspólnymi dla IPv4 i IPv6.

WERSJE
W Linuksie 2.0 zmieniono struct arpreq, dodając pole arp_dev oraz jednocześnie zmieniono numery kontrolek wejścia/wyjścia. W Linuksie 2.2 porzucono wsparcie dla starych kontrolek wejścia/wyjścia. W Linuksie 2.2 porzucono wsparcie dla wpisów proxy arp dla sieci (maska sieci inna niż 0xffffffff). Zostało ono zastąpione przez automatyczną konfigurację proxy arp w jądrze dla wszystkich hostów osiągalnych na innych interfejsach (gdy dla danego interfejsu włączone są przekazywanie pakietów i proxy arp). Kontrolki systemowe neigh/* nie istniały w Linuksie przed wersją 2.2.

ZOBACZ TAKŻE
capabilities(7), ip(7)

RFC826 dla opisu ARP.
RFC2461 dla opisu znajdywania sąsiadów w IPv6 oraz podstawowych stosowanych w tym celu algorytmów.

ARP IPv4 w Linuksie 2.2+ korzysta z algorytmów IPv6, gdy jest to możliwe.