Frage Wie mache ich cURL verwenden Keepalive von der Befehlszeile?


Ich versuche zu überprüfen, dass persistente HTTP-Verbindungen während der Kommunikation mit einem Tomcat-Webserver, den ich ausgeführt habe, verwendet werden. Momentan kann ich eine Ressource auf meinem Server von einem Browser (z. B. Chrome) abrufen und mithilfe von netstat überprüfen, ob die Verbindung hergestellt wurde:

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

Wenn ich jedoch curl verwende, sehe ich nie die Verbindung auf dem 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

Ich habe auch versucht, den folgenden curl-Befehl zu verwenden:

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

Hier ist die Curl-Version meiner Client-Maschine:

[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

Wie bekomme ich die Möglichkeit, eine persistente / keepalive Verbindung zu verwenden? Ich habe ziemlich viel über das Thema gegoogelt, aber ohne Erfolg. Es sollte beachtet werden, dass ich auch benutzt habe links auf dem Client-Rechner, um die Ressource abzurufen, und das tut gib mir einen ESTABLISHED Verbindung auf dem Server.

Lassen Sie es mich wissen, wenn ich weitere Informationen bereitstellen muss.


29
2017-11-08 16:03


Ursprung


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


Antworten:


curl verwendet bereits standardmäßig keepalive.

Als Beispiel:

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

Erzeugt Folgendes:

* 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

Dieser Ausschnitt:

* Verbindung # 0 zum Hosten von www.google.com
* Wiederverwendung bestehender Verbindung! (# 0) mit dem Host www.google.com

Zeigt an, dass dieselbe Verbindung erneut verwendet wurde.

Verwenden Sie das gleiche "curl -v http://my.server/url1 http://my.server/url2"Aufruf an Ihren Server und prüfen Sie, ob Sie die gleiche Nachricht sehen.

Verwenden Sie tcpdump anstelle von netstat, um zu sehen, wie die Pakete behandelt werden. netstat gibt Ihnen nur einen flüchtigen Blick auf das Geschehen, während Sie mit tcpdump jedes einzelne Paket sehen. Eine andere Möglichkeit ist Wireshark.


35
2017-11-08 16:18



Danke für die Antwort. Ja, ich verstehe, dass die meisten HTTP-Clients standardmäßig keepalive verwenden. Ich denke, ich versuche herauszufinden, warum ich das nicht sehe ESTABLISHED Verbindung auf dem Server nur wenn ich Curl benutze. - Rob Hruska
Wenn Sie nur eine einzelne URL über curl anfordern, gibt es keinen Grund für curl, etwas am Leben zu erhalten. Der Curl-Prozess wird beendet, sobald alle URLs abgerufen wurden. Geben Sie zwei URLs an (es könnte sogar zweimal die gleiche URL sein) und behalten Sie die Ausgabe von "curl -v" im Auge. Zu dem Zeitpunkt, zu dem netstat ausgeführt wird, wurde die Verbindung bereits geschlossen, da Curl nicht mehr aktiv ist und kein Grund mehr besteht, die Verbindung offen zu halten. - Roshan
Das macht Sinn; es würde keinen Sinn machen, die Verbindung herumzuhalten, wenn der Prozess, der sie besitzt, beendet ist. Danke für Ihre Hilfe. - Rob Hruska


Wenn Ihr Server "KeepAlive On" zulässt, können Sie Telnet verwenden, um eine persistente Verbindung so zu halten:

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

5
2018-05-16 21:23



wunderschönen. Beats eine Locke während der Schleife bei weitem. - Michael Ozeryansky
Ich habe versucht zu testen, ob meine KeepAliveTimout-Änderung ordnungsgemäß angewendet wurde - das war nur das Ticket. Vielen Dank! - Dave Gregory


Eine Möglichkeit, HTTP-persistente Verbindung / Keep-Alive zu testen, besteht darin, festzustellen, ob die TCP-Verbindung für nachfolgende Verbindungen wiederverwendet wird.

Zum Beispiel. Ich habe eine Datei mit einem Link von http://google.de mehrmals wiederholt.

Der Befehl "Unterhalb" wird geöffnet http://google.de mehrere Male mit der gleichen TCP-Verbindung.

curl -K /tmp/file

Und während dieser Zeit, wenn Sie netstat, können Sie feststellen, dass die TCP-Verbindung hat sich nicht geändert und die ältere wird wiederhergestellt (Der Socket bleibt gleich).

$ 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   

Aber wenn wir den Client bitten, HTTP 1.0 zu verwenden, das keine dauerhafte HTTP-Verbindung unterstützt, ändert sich die Socket-Adresse

$ 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       

Dadurch können wir sicher sein, dass die TCP-Verbindung wiederverwendet wird.


5
2017-12-05 13:36





--Keepalive-Zeit

Mann Curl ... Mann ..: D


3
2017-11-08 16:16



Ich habe die Manpage gelesen, danke. Hast du das nicht bemerkt? --keepalive-time 60 in meinem Beispiel? - Rob Hruska
oh ... ich fühle mich jetzt dumm :( - Arenstar
Die Angabe von "Keepalive-Time", wie oben vorgeschlagen, hat keinen Einfluss auf die Aufrechterhaltung von HTTP-level; Es wirkt sich auf Low-Level-TCP-Konnektivität aus. Von der Manpage (curl.haxx.se/docs/manpage.html): "Diese Option legt die Zeit fest, die eine Verbindung benötigt, um im Leerlauf zu bleiben, bevor sie Keepalive-Tests und die Zeit zwischen einzelnen Keepalive-Tests sendet." Es ist schön, dass es so viele Arten von Keep-Alives gibt, aus denen ich wählen kann; - ShabbyDoo