Come faccio a usare cURL keepalive dalla riga di comando?


36

Sto cercando di verificare che le connessioni persistenti HTTP vengano utilizzate durante la comunicazione con un server Web Tomcat che ho in esecuzione. Attualmente, posso recuperare una risorsa sul mio server da un browser (ad es. Chrome) e verificare utilizzando netstat che la connessione sia stabilita:

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

Tuttavia, se uso curl, non vedo mai la connessione sul server in netstat.

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

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

Ho anche provato a usare il seguente comando curl:

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

Ecco la versione arricciata del mio computer client:

[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

Come posso ottenere l'arricciatura per utilizzare una connessione persistente / keepalive? Ho fatto un po 'di ricerche su Google sull'argomento, ma senza successo. Va notato che ho usato anche linkssulla macchina client per recuperare la risorsa, e che non mi danno un ESTABLISHEDcollegamento sul server.

Fammi sapere se devo fornire maggiori informazioni.


Risposte:


38

curl utilizza già keepalive per impostazione predefinita.

Come esempio:

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

Produce quanto segue:

* 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

Questo frammento:

* La connessione n. 0 per ospitare www.google.com è rimasta intatta
* Riutilizzo della connessione esistente! (# 0) con l'host www.google.com

Indica che ha riutilizzato la stessa connessione.

Usa la stessa " curl -v http://my.server/url1 http://my.server/url2" chiamata sul tuo server e controlla di vedere lo stesso messaggio.

Prendi in considerazione l'utilizzo di tcpdump invece di netstat per vedere come vengono gestiti i pacchetti. netstat ti darà solo un attimo di visione di ciò che sta accadendo, mentre con tcpdump vedrai ogni singolo pacchetto coinvolto. Un'altra opzione è Wireshark.


Grazie per la risposta. Sì, ho capito che la maggior parte dei client HTTP utilizza keepalive per impostazione predefinita. Immagino che quello che sto cercando di scoprire è perché non vedo la ESTABLISHEDconnessione sul server solo quando sto usando curl.
Rob Hruska,

7
Se richiedi un solo URL tramite curl, non c'è motivo per curl per mantenere in vita qualcosa. Il processo di arricciatura termina non appena tutti gli URL sono stati recuperati. Specifica due URL (potrebbe anche essere lo stesso URL due volte) e tieni d'occhio l'output prodotto da "curl -v". Quando netstat viene eseguito, la connessione è già stata chiusa poiché l'arricciatura non è più in esecuzione e non vi è più motivo di mantenere aperta la connessione.
Roshan,

1
Ciò ha senso; non avrebbe senso mantenere la connessione in sospeso se il processo proprietario è terminato. Grazie per l'aiuto.
Rob Hruska,

8

Se il tuo server consente "KeepAlive On", puoi utilizzare telnet per mantenere una connessione persistente in questo modo:

$ while :;do echo -e "GET / HTTP/1.1\nhost: $YOUR_VIRTUAL_HOSTNAME\n\n";sleep 1;done|telnet $YOUR_SERVERS_IP 80

bellissimo. Batte un ricciolo mentre fa un giro di gran lunga.
Michael Ozeryansky,

Stavo cercando di verificare se la mia modifica KeepAliveTimout era stata applicata correttamente: questo era solo il biglietto. Grazie!
Dave Gregory,

6

Un modo per testare la connessione persistente HTTP / Keep-Alive è vedere se la connessione TCP viene riutilizzata per le connessioni successive.

Per esempio. Ho un file contenente il link di http://google.com ripetuto più volte.

L'esecuzione sotto il comando aprirà http://google.com più volte con la stessa connessione TCP.

curl -K /tmp/file

E durante questo periodo se si trova netstat è possibile scoprire che la connessione TCP non è cambiata e che la precedente viene ripristinata (il socket rimane lo stesso).

$ 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   

Ma quando chiediamo al client di utilizzare HTTP 1.0 che non supporta la connessione HTTP persistente, l'indirizzo 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       

da ciò possiamo essere certi che la connessione TCP viene riutilizzata.


5

--keepalive-time

man curl ... man ..: D


2
Ho letto la pagina man, grazie. Non hai notato --keepalive-time 60nel mio esempio?
Rob Hruska,

3
oh ... mi sento stupido ora :(
Arenstar

8
Specificare "keepalive-time" come suggerito sopra non influisce sul mantenimento del livello HTTP; influisce sulla connettività TCP di basso livello. Dalla pagina man ( curl.haxx.se/docs/manpage.html ): "Questa opzione imposta il tempo in cui una connessione deve rimanere inattiva prima di inviare sonde keepalive e il tempo tra le singole sonde keepalive." È bello che ci siano così tanti tipi di keep-alive tra cui scegliere, suppongo;)
ShabbyDoo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.