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 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
AF_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ą opisanych
poniżej interfejsów
/proc.
Gdy dla istniejącego odwzorowania nie ma pozytywnych odpowiedzi, po pewnym
czasie (patrz interfejsy
/proc 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.
Kontrolki systemowe (ioctl)¶
Dla wszystkich gniazd
AF_INET dostępne są trzy kontrolki
wejścia/wyjścia. Pobierają one jako argument wskaźnik do
struktury
struct arpreq.
struct arpreq {
struct sockaddr arp_pa; /* adres protokołu */
struct sockaddr arp_ha; /* addres sprzętowy */
int arp_flags; /* znaczniki */
struct sockaddr arp_netmask; /* maska sieciowa 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ć adresem
AF_INET, a
arp_ha musi
być tego samego typu, co urządzenie podane w
arp_dev.
arp_dev jest zakończonym znakiem NULL ł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.
Interfejsy /proc¶
ARP wspiera interfejsy
/proc, pozwalające konfigurować
parametry globalne lub lokalne - dla podanego interfejsu. Dostęp do tych
interfejsów można uzyskać odczytując i zapisując
pliki
/proc/sys/net/ipv4/neigh/*/*. 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
wartości interfejsów związanych z czasem są podawane w
sekundach.
- anycast_delay (od Linuksa 2.2)
- 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 (od Linuksa 2.2)
- 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 (od Linuksa 2.2)
- Kiedy tylko sąsiad zostanie znaleziony, wpis jest
uważany za ważny przez co najmniej losową wartość
czasu 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. Plik jest obecnie przestarzały, zamiast
niego prosimy używać base_reachable_time_ms.
- base_reachable_time_ms (od Linuksa 2.6.12)
- Tak jak base_reachable_time, ale czas jest
wyrażany w milisekundach. Domyślną wartością jest
30000 milisekund.
- delay_first_probe_time (od Linuksa 2.2)
- Oczekiwanie przed pierwszą próbą po tym, jak
sąsiad został uznany za niedostępny. Domyślnie 5
sekund.
- gc_interval (od Linuksa 2.2)
- Jak często powinien się uruchamiać proces
oczyszczania śmieci z listy wpisów o sąsiadach.
Domyślnie 30 sekund.
- gc_stale_time (od Linuksa 2.2)
- 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 (od Linuksa 2.2)
- 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 (od Linuksa 2.2)
- 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 (od Linuksa 2.2)
- 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 (od Linuksa 2.2)
- 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 (od Linuksa 2.2)
- Maksymalna liczba prób rozwiązywania adresu za
pomocą multicast/broadcast przed zaznaczeniem wpisu jako
niedostępny. Domyślnie 3.
- proxy_delay (od Linuksa 2.2)
- 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 (od Linuksa 2.2)
- Maksymalna liczba pakietów, które mogą
być zakolejkowane w adresie proxy-ARP. Wartość
domyślna to 64.
- retrans_time (od Linuksa 2.2)
- Liczba jiffies oczekiwania przed ponowną
transmisją żądania. Domyślnie 1 sekunda. Plik jest
obecnie przestarzały, zamiast niego prosimy używać
retrans_time_ms.
- retrans_time_ms (od Linuksa 2.6.12)
- Liczba milisekund oczekiwania przed ponowną
transmisją żądania. Domyślnie 1000 milisekund.
- ucast_solicit (od Linuksa 2.2)
- Maksymalna liczba prób wysłania
żądań unicast przed zapytaniem demona ARP (patrz
app_solicit). Domyślnie 3.
- unres_qlen (od Linuksa 2.2)
- Maksymalna liczba pakietów, które mogą
być kolejkowane przez inne warstwy sieci dla każdego
nierozwiązanego adresu. Domyślnie 3.
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
komputerów osiągalnych na innych interfejsach (gdy dla danego
interfejsu włączone są przekazywanie pakietów i proxy
ARP).
Interfejsy
neigh/* nie istniały w Linuksie przed wersją 2.2.
BŁĘDY¶
Niektóre ustawienia timera są podawane w jednostkach jiffy, które
są zależne od architektury i wersji jądra; patrz także
time(7).
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.
ZOBACZ TAKŻE¶
capabilities(7),
ip(7)
RFC 826 dla opisu ARP.
RFC 2461 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.
O STRONIE¶
Angielska wersja tej strony pochodzi z wydania 3.40 projektu Linux
man-pages. Opis projektu oraz informacje dotyczące zgłaszania
błędów można znaleźć pod adresem
http://www.kernel.org/doc/man-pages/.
TŁUMACZENIE¶
Autorami polskiego tłumaczenia niniejszej strony podręcznika man
są: Andrzej M. Krzysztofowicz (PTM) <ankry@mif.pg.gda.pl> i Robert
Luberda <robert@debian.org>.
Polskie tłumaczenie jest częścią projektu manpages-pl;
uwagi, pomoc, zgłaszanie błędów na stronie
http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją
3.40 oryginału.