¿Cómo hago que cURL use keepalive desde la línea de comandos?

36

Estoy tratando de verificar que se usen conexiones persistentes HTTP durante la comunicación con un servidor web Tomcat que estoy ejecutando. Actualmente, puedo recuperar un recurso en mi servidor desde un navegador (por ejemplo, Chrome) y verificar usando netstat que la conexión está establecida:

# visit http://server:8080/path/to/resource in Chrome
[server:/tmp]$ netstat -a
...
tcp        0      0 server.mydomain:webcache client.mydomain:55502 ESTABLISHED

Sin embargo, si uso curl, nunca veo la conexión en el servidor en netstat.

[client:/tmp]$ curl --keepalive-time 60 --keepalive http://server:8080/path/to/resource
...

[server:/tmp]$ netstat -a
# no connection exists for client.mydomain

También intenté usar el siguiente comando curl:

curl -H "Keep-Alive: 60" -H "Connection: keep-alive" http://server:8080/path/to/resource

Aquí está la versión curl de mi máquina cliente:

[server:/tmp]$ curl -V
curl 7.19.5 (x86_64-unknown-linux-gnu) libcurl/7.19.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5 libssh2/1.1
Protocols: tftp ftp telnet dict http file https ftps scp sftp
Features: IDN IPv6 Largefile NTLM SSL libz

¿Cómo obtengo curl para usar una conexión persistente / keepalive? He buscado bastante en Google sobre el tema, pero sin éxito. Cabe señalar que también he utilizado linksen la máquina cliente para recuperar el recurso, y que hace darme una ESTABLISHEDconexión en el servidor.

Avíseme si necesito proporcionar más información.

Rob Hruska
fuente
stackoverflow.com/questions/6086609/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

38

curl ya usa keepalive por defecto.

Como ejemplo:

curl -v http://www.google.com http://www.google.com

Produce lo siguiente:

* About to connect() to www.google.com port 80 (#0)
*   Trying 74.125.39.99... connected
* Connected to www.google.com (74.125.39.99) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: www.google.com
> Accept: */*
> 
< HTTP/1.1 302 Found
< Location: http://www.google.ch/
< Cache-Control: private
< Content-Type: text/html; charset=UTF-8
< Set-Cookie: PREF=ID=0dd153a227433b2f:FF=0:TM=1289232886:LM=1289232886:S=VoXSLP8XWvjzNcFj; expires=Wed, 07-Nov-2012 16:14:46 GMT; path=/; domain=.google.com
< Set-Cookie: NID=40=sOJuv6mxhQgqXkVEOzBwpUFU3YLPQYf4HRcySE1veCBV5cPtP3OiLPKqvRxL10VLiFETGz7cu25pD_EoUq1f_CkNwOna-xRcFFsCokiFqIbGPrb6DmUO7XhcpMYOt3dB; expires=Tue, 10-May-2011 16:14:46 GMT; path=/; domain=.google.com; HttpOnly
< Date: Mon, 08 Nov 2010 16:14:46 GMT
< Server: gws
< Content-Length: 218
< X-XSS-Protection: 1; mode=block
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.ch/">here</A>.
</BODY></HTML>
* Connection #0 to host www.google.com left intact
* Re-using existing connection! (#0) with host www.google.com
* Connected to www.google.com (74.125.39.99) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: www.google.com
> Accept: */*
> 
< HTTP/1.1 302 Found
< Location: http://www.google.ch/
< Cache-Control: private
< Content-Type: text/html; charset=UTF-8
< Set-Cookie: PREF=ID=8b531815cdfef717:FF=0:TM=1289232886:LM=1289232886:S=ifbAe1QBX915QGHr; expires=Wed, 07-Nov-2012 16:14:46 GMT; path=/; domain=.google.com
< Set-Cookie: NID=40=Rk86FyMCV3LzorQ1Ph8g1TV3f-h41NA-9fP6l7G-441pLEiciG9k8L4faOGC0VI6a8RafpukiDvaNvJqy8wExED9-Irzs7VdUQYwI8bCF2Kc2ivskb6KDRDkWzMxW_xG; expires=Tue, 10-May-2011 16:14:46 GMT; path=/; domain=.google.com; HttpOnly
< Date: Mon, 08 Nov 2010 16:14:46 GMT
< Server: gws
< Content-Length: 218
< X-XSS-Protection: 1; mode=block
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.ch/">here</A>.
</BODY></HTML>
* Connection #0 to host www.google.com left intact
* Closing connection #0

Este fragmento:

* La conexión n. ° 0 para alojar www.google.com quedó intacta
* ¡Reutilizando la conexión existente! (# 0) con el host www.google.com

Indica que reutilizó la misma conexión.

Use lo mismo "curl -v http://my.server/url1 http://my.server/url2 " invocación contra su servidor y verifique que vea el mismo mensaje.

Considere usar tcpdump en lugar de netstat para ver cómo se manejan los paquetes. netstat solo te dará un vistazo momentáneo de lo que está sucediendo, mientras que con tcpdump verás cada paquete involucrado. Otra opción es Wireshark.

Roshan
fuente
Gracias por la respuesta. Sí, he llegado a comprender que la mayoría de los clientes HTTP usan keepalive por defecto. Supongo que lo que intento averiguar es por qué no veo la ESTABLISHEDconexión en el servidor solo cuando estoy usando curl.
Rob Hruska el
77
Si solo solicita una única URL a través de curl, no hay razón para que curl mantenga algo vivo. El proceso de curl finalizará tan pronto como se hayan obtenido todas las URL. Especifique dos URL (incluso podría ser la misma URL dos veces) y vigile la salida producida por "curl -v". En el momento en que netstat se ejecuta, la conexión ya se ha cerrado ya que curl ya no se está ejecutando y ya no hay una razón para que la conexión se mantenga abierta.
Roshan
1
Eso tiene sentido; No tendría sentido mantener la conexión si el proceso que la posee ha finalizado. Gracias por tu ayuda.
Rob Hruska
8

Si su servidor permite 'KeepAlive On', puede usar telnet para mantener una conexión persistente de la siguiente manera:

$ while :;do echo -e "GET / HTTP/1.1\nhost: $YOUR_VIRTUAL_HOSTNAME\n\n";sleep 1;done|telnet $YOUR_SERVERS_IP 80
Laboratorios AX
fuente
hermosa. Batir un rizo mientras bucle de lejos.
Michael Ozeryansky
Estaba tratando de probar si mi cambio KeepAliveTimout se había aplicado correctamente, esto era solo el ticket. ¡Gracias!
Dave Gregory
6

Una forma de probar la conexión persistente HTTP / Keep-Alive es ver si la conexión TCP se reutiliza para conexiones posteriores.

Por ejemplo. Tengo un archivo que contiene el enlace de http://google.com repetido varias veces.

La ejecución del siguiente comando abrirá http://google.com varias veces con la misma conexión TCP.

curl -K /tmp/file

Y durante este tiempo, si netstat puede encontrar que la conexión TCP no ha cambiado y que la anterior se reinicia (el socket permanece igual)

$ sudo netstat -pnt|grep curl
tcp        0      0 106.51.85.118:48682     74.125.236.69:80        ESTABLISHED 9732/curl       
$ sudo netstat -pnt|grep curl
tcp        0      0 106.51.85.118:48682     74.125.236.69:80        ESTABLISHED 9732/curl       
$ sudo netstat -pnt|grep curl
tcp        0      0 106.51.85.118:48682     74.125.236.69:80        ESTABLISHED 9732/curl   

Pero cuando le pedimos al cliente que use HTTP 1.0 que no admite una conexión HTTP persistente, la dirección del socket cambia

$ curl -0 -K /tmp/file

$ sudo netstat -pnt|grep curl
tcp        0      0 106.51.85.118:48817     74.125.236.69:80        ESTABLISHED 9765/curl       
$ sudo netstat -pnt|grep curl
tcp        0      0 106.51.85.118:48827     74.125.236.69:80        ESTABLISHED 9765/curl       
$ sudo netstat -pnt|grep curl
tcp        0     74 106.51.85.118:48838     74.125.236.69:80        ESTABLISHED 9765/curl       

De esto podemos estar seguros de que la conexión TCP se reutiliza.

Kannan Mohan
fuente
5

- tiempo de mantenimiento

hombre rizo ... hombre ..: D

Arenstar
fuente
2
He leído la página de manual, gracias. ¿No notaste el --keepalive-time 60en mi ejemplo?
Rob Hruska el
3
oh ... me siento estúpido ahora :(
Arenstar
8
Especificar "keepalive-time" como se sugirió anteriormente no afecta al nivel HTTP mantener vivo; afecta la conectividad TCP de bajo nivel. Desde la página de manual ( curl.haxx.se/docs/manpage.html ): "Esta opción establece el tiempo que una conexión debe permanecer inactiva antes de enviar sondas de keepalive y el tiempo entre sondas de keepalive individuales". Es agradable que haya tantos tipos de recuerdos para elegir, supongo;)
ShabbyDoo