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)