Ao solucionar um problema ocasional de "paralisação" da rede na minha internet doméstica, encontrei esta dica técnica da Dell . Eles sugerem usar ping -n
para evitar uma parada causada pela resolução do DNS. Isso me fez pensar, o que o -n
switch realmente faz? Parece-me que a resolução DNS é necessária se você fizer ping em um nome DNS, mas não é necessária se você fizer ping em um IP.
Na página do manual:
-n Somente saída numérica. Nenhuma tentativa será feita para procurar nomes simbólicos para endereços de host.
Se eu fizer ping em um endereço IP, ping 8.8.8.8
como há alguma pesquisa de DNS aqui? Faz ping -n 8.8.8.8
algo diferente?
Pode depender da implementação. Se
ping
sem-n
incluidns.google
em sua saída,ping -n
provavelmente não, esta é a diferença. Mas é possível que nenhuma das saídas inclua a string.No meu Ubuntu 18.04.4 LTS
man 8 ping
lê:Este endereço exato parece não funcionar, ainda http://www.skbuff.net/iputils fornece outros links, incluindo o do SourceForge . Eu baixei iputils-s20151218 e li o código.
-n
é tratado emping_common.c
:Então a opção (
options & F_NUMERIC
) é importante emping.c
:Para chegar a
gethostbyaddr
, ambosexiting
eoptions & F_NUMERIC
devem ser falsos (porquea || b
does não avaliaráb
sea
for verdadeiro). Este último depende se-n
foi ou não usado.gethostbyaddr
é a "tentativa de procurar nomes simbólicos para endereços de host". Vejaman 3 gethostbyaddr
. Essa é a mesma chamada de bibliotecagetent hosts
usada quando você fornece um endereço IP (consulte Recursosman 1 getent
).Veja a diferença:
Pode parecer
ping
sem-n
usar apenas a string fornecida pelo usuário; mas não:Aqui
poczta.wp.pl
foi resolvido193.17.41.99
e depois193.17.41.99
resolvidopoczta.o2.pl
(notao2
em vez dewp
). O uso de-n
suprimiria a última etapa.Para alguns endereços isso acontece:
Mas se eu fornecer um endereço numérico, não haverá diferença:
É por causa deste fragmento de
ping.c
:inet_aton
converte da notação de números e pontos IPv4 para a forma binária. Ele retorna1
em caso de sucesso. Se o último argumento fornecido aping
puder ser convertido, o fragmento será avaliadooptions |= F_NUMERIC
como se-n
fosse usado .Na verdade, compilei
ping
a partir da fonte em duas versões: a original e comif … options |= F_NUMERIC;
comentários. A versão modificada se comporta assim:Agora posso responder explicitamente à pergunta:
Não. O endereço na notação de números e pontos IPv4 faz
ping
(iputils
no Linux) funcionar como se-n
fosse usado.Criei um namespace de rede separado (para garantir que o mínimo de tráfego possível interfira) com um par veth e usei-o
wireshark
lá. (Se você quiser replicar meus resultados e precisar de ajuda com o procedimento, veja esta resposta , exemplo 2).Com o original
ping
:ping -n -c 1 8.8.8.8
geraICMP echo request
e recebeICMP echo reply
. Nenhum DNS envolvido.ping -c 1 8.8.8.8
faz o mesmo (sem surpresa aqui, explicado acima).Isso significa que não há pesquisa de DNS . Abaixo estão alguns testes para comparação.
Com o meu modificado
ping
:ping -n -c 1 8.8.8.8
se comporta como o original.ping -c 1 8.8.8.8
consulta o servidor DNS após o ICMP e recebe uma resposta. Isso é para conseguirdns.google
.Novamente com o original
ping
:ping -n -c 1 dns.google
consulta o servidor DNS e recebe uma resposta antes do ICMP. Isto é para traduzirdns.google
para8.8.8.8
ou8.8.4.4
.ping -c 1 dns.google
consulta o servidor DNS e recebe uma resposta antes do ICMP (para traduzir para8.8.8.8
ou para8.8.4.4
) e separadamente após o ICMP (para traduzir de volta).Na página de manual:
então a diferença está na saída: