El utilitario ping
es una de las herramientas básicas de diagnóstico de redes. Permite comprobar si es posible establecer una conexión IP hacia un determinado host mediante el protocolo ICMP. De esta forma se puede determinar si el ruteo de paquetes IP desde y hacia el host destino funciona correctamente. En este artículo presento algunos usos especiales de la herramienta ping
en GNU/Linux y Windows.
El protocolo ICMP (Internet Control Message Protocol, o protocolo de mensajes de control de Internet) es parte del conjunto de protocolos IP. Los mensajes ICMP son comúnmente empleados con fines de diagnóstico y control, o generados en respuesta a errores en las operaciones IP, y se envían a la dirección IP de origen del paquete que dio lugar a la generación del mensaje ICMP. Este protocolo se emplea cuando un host no puede ser alcanzado, cuando el tiempo de vida de un paquete ha expirado, cuando un servicio solicitado no está disponible, etc. Es decir, se usa para manejar mensajes de error y control necesarios en los sistemas de red informando a la fuente original para que evite o corrija el problema detectado. A su vez, generalmente es utilizado como protocolo de diagnóstico mediante el utilitario ping
para determinar si el ruteo de paquetes desde y hacia un host funciona correctamente, si una red tiene enlace, etc.
Sin más, veamos algunos ejemplos de uso de ping
un tanto más avanzados que el simple ping www.google.com
(o ping 8.8.8.8
si les gusta molestar a los DNS de Google ).
Pings ilimitados en Windows
En los sistemas Unix, a diferencia de los sistemas Windows, el utilitario ping
envía paquetes indefinidamente en intervalos de 1 segundo hasta que se detenga el proceso (Ctrl+C
). En Windows por defecto sólo se envían 4 paquetes ECHO REQUEST. Para lograr el mismo comportamiento en Windows, es decir hacer ping de manera ilimitada, hasta que se detenga el proceso, es necesario agregar la opción -t
:
> ping -t 8.8.8.8
Especificar la cantidad de pings a realizar
Es posible definir cuántos mensajes ECHO REQUEST enviar (en lugar de indefinidamente en GNU/Linux o sólo 4 en Windows). En GNU/Linux mediante la opción -c
y una cantidad de pings como parámetro:
emi@hal9000:~$ ping -c 3 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=53 time=13.2 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=53 time=13.3 ms 64 bytes from 8.8.8.8: icmp_seq=3 ttl=53 time=13.3 ms --- 8.8.8.8 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 13.234/13.296/13.333/0.044 ms
En Windows se utiliza la opción -n
:
> ping -n 3 8.8.8.8
Cambiar el intervalo de tiempo entre solicitudes
Ya sea Windows o GNU/Linux, el tiempo de espera entre mensajes por defecto es de 1 segundo. En GNU/Linux es posible utilizar un tiempo personalizado mediante la opción -i
:
emi@hal9000:~$ ping -c 3 -i 5 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=53 time=13.2 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=53 time=13.2 ms 64 bytes from 8.8.8.8: icmp_seq=3 ttl=53 time=13.3 ms --- 8.8.8.8 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 10008ms rtt min/avg/max/mdev = 13.290/13.327/13.396/0.048 ms
Cabe destacar que sólo es posible utilizar un intervalo de tiempo menor a 200 milisegundos (-i 0.2
o menos) como usuario root.
Tiempo de espera para la respuesta en Windows
Windows utiliza una especie de ping bloqueante, es decir no envía nuevos mensajes ECHO REQUEST hasta no recibir respuesta de la solicitud actual o se haya agotado el tiempo de espera (por defecto de 4 segundos). Es posible cambiar este tiempo de espera (especificado en milisegundos) utilizando la opción -w
:
> ping -w 100 8.8.8.8
De esta forma, si no llega una respuesta pasados los 100 milisegundos se envía una nueva solicitud ECHO REQUEST.
Ping por un determinado espacio de tiempo
En GNU/Linux es posible hacer ping por un período de tiempo determinado (en lugar de indicar una cantidad de pings a realizar) mediante la opción -w
:
emi@hal9000:~$ ping -w 10 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=53 time=13.2 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=53 time=13.2 ms 64 bytes from 8.8.8.8: icmp_seq=3 ttl=53 time=13.3 ms 64 bytes from 8.8.8.8: icmp_seq=4 ttl=53 time=13.2 ms 64 bytes from 8.8.8.8: icmp_seq=5 ttl=53 time=13.2 ms 64 bytes from 8.8.8.8: icmp_seq=6 ttl=53 time=13.2 ms 64 bytes from 8.8.8.8: icmp_seq=7 ttl=53 time=13.2 ms 64 bytes from 8.8.8.8: icmp_seq=8 ttl=53 time=13.2 ms 64 bytes from 8.8.8.8: icmp_seq=9 ttl=53 time=13.3 ms 64 bytes from 8.8.8.8: icmp_seq=10 ttl=53 time=13.3 ms --- 8.8.8.8 ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 9011ms rtt min/avg/max/mdev = 13.260/13.296/13.361/0.058 ms
En este ejemplo se hizo ping durante 10 segundos.
Imprimir la estampilla de tiempo de cada solicitud
Esta es una funcionalidad útil para debug y scripts que permite visualizar la estampilla de tiempo de cada solicitud (opción -D
):
emi@hal9000:~$ ping -D -c 3 -i 3 8.8.4.4 PING 8.8.4.4 (8.8.4.4) 56(84) bytes of data. [1563369186.116875] 64 bytes from 8.8.4.4: icmp_seq=1 ttl=53 time=12.5 ms [1563369189.120496] 64 bytes from 8.8.4.4: icmp_seq=2 ttl=53 time=12.5 ms [1563369192.121304] 64 bytes from 8.8.4.4: icmp_seq=3 ttl=53 time=12.4 ms --- 8.8.4.4 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 6004ms rtt min/avg/max/mdev = 12.480/12.499/12.511/0.092 ms
La estampilla utiliza el formato Unix segundos.microsegundos
transcurridos desde el 1 de enero de 1970. Notar el período de tiempo de (aproximadamente) 3 segundos entre solicitudes (al haber indicado el intervalo de tiempo de 3 segundos mediante la opción -i
).
Modo (casi) silencioso
En GNU/Linux es posible omitir el detalle de cada respuesta y mostrar sólo la cabecera de inicio y el resumen al finalizar:
emi@hal9000:~$ ping -q -c 3 kernel.org PING kernel.org (198.145.29.83) 56(84) bytes of data. --- kernel.org ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1999ms rtt min/avg/max/mdev = 211.478/211.719/212.015/0.436 ms
Modificar el TTL
En GNU/Linux, mediante la opción -t
es posible modificar el TTL (Time to Live o tiempo de vida) del paquete IP. Esto permite identificar el número de saltos (número de hosts por el que debe pasar el paquete para llegar a destino):
emi@hal9000:~$ ping -c 1 -t 19 kernel.org PING kernel.org (198.145.29.83) 56(84) bytes of data. 64 bytes from kernel.org (198.145.29.83): icmp_seq=1 ttl=51 time=211 ms --- kernel.org ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 211.953/211.953/211.953/0.000 ms
Si el TTL llega a cero, el paquete se descarta y el host que detecta el tiempo de vida excedido envía la respuesta "Time to live exceeded" al origen:
emi@hal9000:~$ ping -c 1 -t 18 kernel.org PING kernel.org (198.145.29.83) 56(84) bytes of data. From xe-6-0-0.r-1.linuxfoundation.org (198.145.0.9) icmp_seq=1 Time to live exceeded --- kernel.org ping statistics --- 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
A través de este ejemplo se observa que, desde mi ubicación, es necesario pasar por 18 hosts para llegar al host cuya dirección IP es 198.145.29.83
.
En Windows es posible modificar el TTL mediante la opción -i
:
> ping -i 64 kernel.org
Referencias
- RFC 792 - INTERNET CONTROL MESSAGE PROTOCOL
- RFC 1122 - Requirements for Internet Hosts -- Communication Layers
- ping - Microsoft Docs