Tiempos de respuesta (SSL handshake, TCP, DNS, redirección, etc) en consultas con Curl (HTTP/S, SSH, FTP, etc.)

Con el comando Curl es muy fácil obtener los tiempos de respuesta de las diferentes partes que forman una conexión FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, FILE, LDAP, etc. Algo muy útil cuando se necesita obtener métricas (Cacti, collectd, etc) o simplemente obtener datos del rendimiento de las conexiones.

La flexibilidad que nos ofrece todas las opciones de Curl nos permite, no solo poder analizar los tiempos de respuesta de un servidor, si no también las perdidas de rendimiento al utilizar diferentes tipos de proxys, métodos HTTP, user-agents, etc.

Para obtener dichos tiempos de respuesta se utilizará la opción “-w” de Curl como se muestra en el siguiente ejemplo de una petición HTTPS.

curl -o /dev/null -L -qs -w "Tiempo en completar el handshake HTTPS: %{time_appconnect}\\nTiempo en conectar (TCP): %{time_connect}\\nTiempo en resolver DNS: %{time_namelookup}\\nTiempo pre-transferencia: %{time_pretransfer}\\nTiempo en completar la redirección: %{time_redirect}\\nTiempo hasta que el primer byte fue transferido: %{time_starttransfer}\\nTiempo total:%{time_total}\\n\\nURL final: %{url_effective}\\n" https://dominio.net
 
 Tiempo en completar el handshake HTTPS: 0,882
 Tiempo en conectar (TCP): 0,459
 Tiempo en resolver DNS: 0,253
 Tiempo pre-transferencia: 0,882
 Tiempo en completar la redirección: 0,935
 Tiempo hasta que el primer byte fue transferido: 1,114
 Tiempo total: 3,042
 
 URL final: https://www.dominio.net/

Tiempos de respuesta disponibles en Curl.

Otro ejemplo incluyendo otros campos como velocidad media, tamaño de descarga, consulta, etc.

curl -o /dev/null -L -qs -w "\\nTiempo en completar el handshake HTTPS: %{time_appconnect}\\nTiempo en conectar (TCP): %{time_connect}\\nTiempo en resolver DNS: %{time_namelookup}\\nTiempo pre-transferencia: %{time_pretransfer}\\nTiempo en completar la redirección: %{time_redirect}\\nTiempo hasta que el primer byte fue transferido: %{time_starttransfer}\\nTiempo total:%{time_total}\\n\\nVelocidad media de bajada: %{speed_download} B/s\\nTotal Datos descargados: %{size_download} bytes / Cabeceras: %{size_header} bytes\\n\\nTamaño de la consulta HTTP/S: %{size_request} bytes\\n\\nURL final: %{url_effective} (%{num_redirects} redirecciones)\\n" https://dominio.com/fichero.txt

Tiempo en completar el handshake HTTPS: 0,817
Tiempo en conectar (TCP): 0,329
Tiempo en resolver DNS: 0,125
Tiempo pre-transferencia: 0,817
Tiempo en completar la redirección: 0,000
Tiempo hasta que el primer byte fue transferido: 1,269
Tiempo total:81,862

Velocidad media de bajada: 209233,000 B/s
Total Datos descargados: 17128295 bytes / Cabeceras: 762 bytes

Tamaño de la consulta HTTP/S: 83 bytes

URL final: https://dominio.com/fichero.txt (0 redirecciones)

También es posible configurar todos los parámetros en un archivo y usarlo en la linea de comandos de curl.

curl_opciones.txt
Tiempo en completar el handshake HTTPS: %{time_appconnect}\n
Tiempo en conectar (TCP): %{time_connect}\n
Tiempo en resolver DNS: %{time_namelookup}\n
Tiempo pre-transferencia: %{time_pretransfer}\n
Tiempo en completar la redirección: %{time_redirect}\n
Tiempo hasta que el primer byte fue transferido: %{time_starttransfer}\n
=====\n
Tiempo total:%{time_total}\n
URL final: %{url_effective}\n
curl -w "@curl_opciones.txt" https://busindre.com

Frontend de métricas para Curl: https://github.com/reorx/httpstat

Pruebas de rendimiento HTTP/SSH con Curl (obtener valores medios)

Basando en lo anteriormente visto, se pueden obtener las medias de los valores que queramos tras un número determinado de pruebas.

Por ejemplo vamos a ver qué media de tiempo de respuesta tiene “time_appconnect” (Tiempo en completar el handshake HTTPS/SSH) con el dominio “www.XXX.com” al hacer 10 peticiones seguidas.

LC_NUMERIC="C" && for i in {1..10}; do curl -o /dev/null -L -qs -w %{time_appconnect}\\n https://www.XXX.com; done 2>&1 | awk '{sum += $1} END {print sum / NR}'
 
0.082159
 
# Borrar la parte awk de la tubería si se quiere obtener los valores de todas las peticiones.

Para usar Curl con el protocolo SSH es necesario que venga compilado explícitamente para soportarlo. La opción para compilar Curl con soporte ssh es “–with-libssh2”.

Para comprobar si la versión de Curl soporta libssh2 se puede ejecutar el comando curl con la opción -V.

curl -V 
curl 7.59.0 (x86_64-pc-linux-gnu) libcurl/7.59.0 OpenSSL/1.1.0g zlib/1.2.11 libidn2/2.0.4 libpsl/0.20.1 (+libidn2/2.0.4) nghttp2/1.30.0
# No tiene soporte ya que no se en la salida algo como libssh2/1.8.0-3