NOME¶
arp - módulo de kernel para ARP em Linux.
DESCRIÇÃO¶
Este módulo de protocolo de kernel implementa o Protocolo de
Resolução de Endereços (Address Resolution Protocol)
definido na RFC 826. Ele é usado para converter o endereço de
hardware da camada 2 para endereços do protocolo IPv4 em redes
diretamente conectadas. Normalmente o usuário não interage
diretamente com este módulo, exceto para configurá-lo; em vez
disso, ele provê um serviço para outros protocolos no kernel.
Um processo de usuário pode receber pacotes ARP através do uso de
sockets do tipo
packet(7). Há também um mecanisco
de gerenciamento do cache ARP no espaço de usuário,
através do uso de sockets do tipo
netlink(7). A tabela
ARP também pode ser controlada via
ioctl (2) ou qualquer socket
do tipo
PF_INET
O módulo ARP matém um cache de mapeamento entre endereços
de hardware e endereços de protocolo. O cache tem um tamanho limitado
pois há uma "coleta de lixo" entre entradas mais antigas e
usadas com menos freqüência. Entradas que são marcadas
como permanentes nunca são apagadas pelo coletor de lixo. O cache pode
ser manipulado diretamente pelo uso de ioctls, e seu comportamento pode ser
ajustado pelos sysctls definidos abaixo.
Quando não há feedback positiva para um mapeamento existente
depois de um certo tempo (veja os sysctls abaixo), uma entrada de cache
vizinha é considerada travada. Para enviar dados para o destino
novamente, o ARP primeiro tenta pedir ao daemon arp local um endereço
MAC atualizado por
app_solicit vezes. Se falhar, e um endereço
MAC antigo é conhecido, um teste de unicast é enviado
ucast_solicit vezes. Se falhar também, ele fará um
broadcast de um novo pedido de ARP na rede. Pedidos são enviados apenas
quando há dado enfileirado para envio.
O Linux acrescentará automaticamete uma entrada não permanente de
arp proxy quando receber um pedido de um endereço para encaminhamento,
e o arp proxy é habilitado na interface de recepção.
Quando houver uma rota rejeitada para o destino, nenhuma entrada de arp proxy
é acrescentada.
IOCTLS¶
Esses ioctls são disponíveis em todos os sockets
PF_INET
Eles pegam um ponteiro para um
struct arpreq como parâmetro.
struct arpreq
{
struct sockaddr arp_pa; /* endereço de protocolo */
struct sockaddr arp_ha; /* endereço de hardware */
int arp_flags; /* flags */
struct sockaddr arp_netmask; /* máscara de rede do endereço de protocolo */
char arp_dev[16];
};
SIOCSARP,
SIOCDARP e
SIOCGARP respectivamente seta, deleta
e obtém um mapeamento ARP. Setar e deletar mapas ARP são
operações privilegiadas e só podem ser realizadas por um
processo com a capabilidade
CAP_NET_ADMIN ou com um UID efetivo igual a
0.
arp_pa deve ser um socket
AF_INET e
arp_ha deve ter o mesmo
tipo que o dispositivo especificado em
arp_dev.
arp_dev é
uma string terminada em zero que nomeia um dispositivo.
arp_flags |
|
flag |
significado |
ATF_COM |
Busca completada |
ATF_PERM |
Mantém entrada |
ATF_PUBL |
Publica entrada |
ATF_USETRAILERS |
Trailers requeridos |
ATF_NETMASK |
Usa uma máscara de rede |
ATF_DONTPUB |
Não responde |
Se o flag
ATF_NETMASK é selecionado, então
arp_netmask deveria ser válido. O Linux 2.2 não suporta
entradas entradas ARP de rede proxy, então deveria ser setado para
0xffffffff, ou 0 para remover uma entrada de proxy arp existente.
ATF_USETRAILERS é obsoleto e não deveria ser usado.
SYSCTLS¶
O ARP suporta uma interface de sysctl para configurar parâmetros em uma
base global ou por interface. Os sysctls podem ser acessados por leitura ou
escrita dos arquivos
/proc/sys/net/ipv4/neigh/*/* ou com a interface
sysctl(2) /proc/sys/net/ipv4/neigh/. A configuração no
diretório `default' é usada por todos os dispositivos
recém-criados. A menos que se especifique o contrário, sysctls
relacionados a tempo são especificados em segundos.
- anycast_delay
- O número máximo de jiffies para atraso antes de uma resposta
a uma mensagem de solicitação de vizinhança IPv6.
Suporte a anycast ainda não foi implementado. O padrão
é 1 segundo.
- app_solicit
- O número máximo de testes para envio ao daemon ARP do
espaço de usuário, via netlink, antes de voltar aos testes
de multicast (veja mcast_solicit). O padrão é 0.
- base_reachable_time
- Uma vez que um vizinho foi encontrado, a entrada é considerada
válida pelo menos por um valor aleatório entre
base_reachable_time/2 e 3*base_reachable_time/2. Uma
validação da entrada será estendida se ele receber
feedback positivo de protocolos de nível mais alto. O padrão
é de 30 segundos.
- delay_first_probe_time
- Atraso antes do primeiro teste, depois que ele decidiu que um vizinho
está travado. O padrão é de 5 segundos.
- gc_interval
- Quão freqüentemente o coletor de lixo para entradas vizinhas
deveria tentar rodar. O padrão é de 30 segundos.
- gc_stale_time
- Determina a freqüência da checagem por entradas de vizinhos
travados. Quando uma entrada de vizinho é considerada travada,
é resolvido novamente antes de enviar dados para ele. O
padrão é de 60 segundos.
- gc_thresh1
- O número mínimo de entradas a serem mantidas no cache ARP. O
coletor de lixo não rodará se houver menos do que este
número de entradas no cache. O padrão é de 128.
- gc_thresh2
- O número máximo flexível de entradas a serem mantidas
no cache ARP. O coletor de lixo permitirá que o número de
entradas exceda este número por 5 segundos antes que a coleta seja
realizada. O padrão é de 512.
- gc_thresh3
- O número máximo rígido de entradas a serem mantidas
no cache ARP. O coletor de lixo sempre rodará se houver mais que
este número de entradas no cache. O padrão é de
1024.
- locktime
- O número mínimo de jiffies a manter uma entrada ARP no
cache. Isto previne o esmagamento do cache ARP se houver mais que um
mapeamento potencial (geralmente devido a desconfiguração de
rede). O padrão é de 1 segundo.
- mcast_solicit
- O número máximo de tentativas para resolver um
endereço por multicast/broadcast antes de marcar a entrada como
não alcançável. O padrão é de 3.
- proxy_delay
- Quando é recebido um pedido ARP de um endereço proxy-ARP
conhecido, atrasa até proxy_delay jiffies antes de
responder. Isto é usado para prevenir flooding (enxurrada) na rede
em alguns casos. O padrão é de 0.8 segundos.
- proxy_qlen
- O número máximo de pacotes que podem ser enfileirados em
endereços proxy-ARP. O padrão é de 64.
- retrans_time
- O número de jiffies de atraso antes de se retransmitir um pedido. O
padrão é de 1 segundo.
- ucast_solicit
- O número máximo de tentativas de enviar testes de unicast
antes de perguntar ao daemon ARP (veja app_solicit). O
padrão é 3.
- unres_qlen
- O número máximo de pacotes que podem ser enfileirados para
cada endereço não resolvido por outras camadas da rede. O
padrão é de 3.
PROBLEMAS¶
Algumas configurações de temporização são
específicos em jiffies, que são relacionados com a arquitetura.
No Alpha, um jiffy é 1/1024 segundo, em muitas outras arquiteturas
é 1/100s.
Não há maneira de sinalizar feedback positivo a partir do
espaço do usuário. Isto significa que protocolos orientados a
conexão implementados no espaço de usuário gerarão
um tráfego ARP excessivo, porque ndisc retestará regularmente o
endereço MAC. O mesmo problema se aplica para a
implementação do NFS no kernel.
Esta página de manual busca tanto a funcionalidade específica para
IPv4 quanto a compartilhada entre IPv4 e IPv6.
VERSÕES¶
O
struct arpreq mudou no Linux 2.0 para incluir o membro
arp_dev e
os números de ioctl mudaram ao mesmo tempo. O suporte aos ioctls
antigos foi tirado do Linux 2.2.
O suporte a entradas de arp proxy para redes (máscara de rede diferente
de 0xffffffff) foi eliminado no Linux 2.2. Ele é substituído
pela configuração automática pelo kernel do arp proxy
para todos os hosts alcancáveis em outras interfaces (quando o repasse
e o arp proxy estiverem habilitados para a interface).
VEJA TAMBÉM¶
ip(7)
RFC826 para uma descrição do ARP.
RFC2461 para uma descrição da descoberta de vizinhos IPv6 e os
algoritmos-base usados.
TRADUZIDO POR LDP-BR em 21/08/2000.¶
Rubens de Jesus Nogueira <darkseid99@usa.net> (tradução)
André L. Fassone Canova <lonelywolf@blv.com.br>
(revisão)