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


Tal vez pueda interesarte


Compartí este artículo