Ping | ICMP Echo

Repo: https://github.com/umarquez/100DaysOfC0D3/tree/master/19-ping

Hace muchos años, jugando con mIRC y aquellos servidores IRC, se me ocurrió hacerle reversa al protocolo para desarrollar mi propio bot, solo por la curiosidad de saber como funcionaban, pues antes del torrent y el eDonkey este era el #medio de intercambiar archivos preferido por muchos. Así que había cualquier cantidad de canales repletos de servidores XDCC totalmente automatizados que eran capaces de listar archivos, recibir peticiones de envío y ponerlas en cola hasta estar disponibles para enviarte en “privado” el archivo que minutos (o incluso horas) antes habías solicitado. Pura magia…

En esta ocasión haremos lo mismo con una herramienta que utilizamos regularmente o que por lo menos hemos visto en videojuegos y que nos indica el estado de un host y el tiempo que toma comunicarnos con el.

Ping measures the round-trip time for messages sent from the originating host to a destination computer that are echoed back to the source. The name comes from active sonar terminology that sends a pulse of sound and listens for the echo to detect objects under water. Ping mide el tiempo que toma un mensaje en ir y venir desde el host que lo origina hasta la computadora destino la cual lo re-envía de vuelta a la fuente. El nombre proviene de la terminología de sonares activos que envían un pulso y escuchan el echo con el fin de detectar objetos bajo el agua. https://en.wikipedia.org/wiki/Ping_(networking_utility)

Este consiste en enviar un mensaje ICMP de tipo Echo Request y esperar uno de tipo Echo Reply con el mismo contenido como respuesta válida.

El mensaje debe contener un identificador y un número de secuencia que generalmente son usados para identificar cada paquete (pues podemos enviar varios al mismo o diferentes hosts de manera simultanea), además de estos campos, deberá contener una secuencia de bytes como cuerpo del mensaje que generalmente puede ser una cadena de texto o el timestamp del mensaje.

Existen diferencias entre los paquetes echo de IPv4 e IPv6, pero en general cumplen con los mismos en común. La librería estandar de Go no cuenta con un método para hacer ping pero si con librerías para enviar mensajes ICMP, tanto para IPv4 como para IPv6.

Implementación en Go

Vamos a hacer ping a un host utilizando IPv4

127.0.0.1 (0.0010117 seg.): &{#100DaysOfC0D3}
127.0.0.1 (0 seg.): &{#100DaysOfC0D3}
127.0.0.1 (0 seg.): &{#100DaysOfC0D3}
127.0.0.1 (0 seg.): &{#100DaysOfC0D3}
127.0.0.1 (0 seg.): &{#100DaysOfC0D3}

Referencias: