Jak sprawić, by cURL używał keepalive z linii poleceń?


36

Próbuję zweryfikować, czy trwałe połączenia HTTP są używane podczas komunikacji z serwerem internetowym Tomcat, który mam uruchomiony. Obecnie mogę pobrać zasób na moim serwerze z przeglądarki (np. Chrome) i zweryfikować za pomocą netstat, czy połączenie zostało nawiązane:

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

Jednak jeśli używam curl, nigdy nie widzę połączenia na serwerze w netstat.

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

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

Próbowałem także użyć następującego polecenia curl:

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

Oto wersja curl mojego komputera klienckiego:

[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

Jak uzyskać curl, aby korzystać z trwałego połączenia / utrzymywania połączenia? Zrobiłem sporo Google na ten temat, ale bez powodzenia. Należy zauważyć, że użyłem również linksna komputerze klienckim do pobrania zasobu, a to daje mi ESTABLISHEDpołączenie na serwerze.

Daj mi znać, jeśli będę musiał podać więcej informacji.


Odpowiedzi:


38

curl już domyślnie korzysta z keepalive.

Jako przykład:

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

Wytwarza następujące:

* 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

Ten fragment kodu:

* Połączenie nr 0 z hostem www.google.com pozostało nietknięte
* Ponowne wykorzystanie istniejącego połączenia! (# 0) z hostem www.google.com

Wskazuje, że ponownie użył tego samego połączenia.

Użyj tego samego curl -v http://my.server/url1 http://my.server/url2wywołania na serwerze i sprawdź, czy widzisz tę samą wiadomość.

Rozważ użycie tcpdump zamiast netstat, aby zobaczyć, jak obsługiwane są pakiety. netstat da ci tylko chwilowe spojrzenie na to, co się dzieje, podczas gdy dzięki tcpdump zobaczysz każdy zaangażowany pakiet. Inną opcją jest Wireshark.


Dziękuję za odpowiedź. Tak, zrozumiałem, że większość klientów HTTP domyślnie używa keepalive. Myślę, że próbuję się dowiedzieć, dlaczego nie widzę ESTABLISHEDpołączenia na serwerze tylko wtedy, gdy używam curl.
Rob Hruska,

7
Jeśli zażądasz tylko jednego adresu URL za pomocą curl, nie ma powodu, aby curl utrzymywał cokolwiek przy życiu. Proces zwijania zakończy się, gdy tylko wszystkie adresy URL zostaną pobrane. Podaj dwa adresy URL (może to być nawet ten sam adres URL dwa razy) i miej oko na wynik wygenerowany przez „curl -v”. Do czasu uruchomienia netstat połączenie zostało już zamknięte, ponieważ curl nie działa i nie ma już powodu, aby połączenie pozostawało otwarte.
Roshan,

1
To ma sens; nie miałoby sensu utrzymywanie połączenia w pobliżu, jeśli proces będący jego właścicielem zakończył się. Dzięki za pomoc.
Rob Hruska,

8

Jeśli Twój serwer zezwala na „KeepAlive On”, możesz użyć usługi Telnet, aby utrzymać stałe połączenie tak:

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

piękny. Jak dotąd pokonuje pętlę „curl while”.
Michael Ozeryansky

Próbowałem sprawdzić, czy moja zmiana KeepAliveTimout została zastosowana poprawnie - to był tylko bilet. Dzięki!
Dave Gregory,

6

Jednym ze sposobów przetestowania trwałego połączenia HTTP / Keep-Alive jest sprawdzenie, czy połączenie TCP jest ponownie wykorzystywane do kolejnych połączeń.

Na przykład. Mam plik zawierający link http://google.com powtórzony wiele razy.

Uruchomienie poniżej polecenia spowoduje otwarcie http://google.com wiele razy z tym samym połączeniem TCP.

curl -K /tmp/file

I w tym czasie, jeśli netstat wykryje, że połączenie TCP nie zmieniło się, a starsze zostało wznowione (gniazdo pozostaje takie samo).

$ 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   

Ale kiedy pytamy klienta o użycie protokołu HTTP 1.0, którego dawka nie obsługuje trwałego połączenia HTTP, zmienia się adres gniazda

$ 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       

z tego możemy być pewni, że połączenie TCP zostanie ponownie wykorzystane.


5

- czas imprezowy

man curl ... man ..: D


2
Dzięki, przeczytałem stronę podręcznika. Nie zauważyłeś --keepalive-time 60w moim przykładzie?
Rob Hruska,

3
och ... czuję się teraz głupio :(
Arenstar,

8
Określenie „czasu podtrzymania”, jak zasugerowano powyżej, nie wpływa na utrzymywanie aktywności na poziomie HTTP; wpływa na łączność TCP niskiego poziomu. Ze strony podręcznika ( curl.haxx.se/docs/manpage.html ): „Ta opcja określa czas, przez jaki połączenie musi pozostawać bezczynne przed wysłaniem sond podtrzymujących, oraz czas między poszczególnymi sondami podtrzymującymi”. Fajnie, że jest tak wiele rodzajów podtrzymujących życie do wyboru, jak sądzę;)
ShabbyDoo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.