Как заставить cURL использовать keepalive из командной строки?


36

Я пытаюсь проверить, используются ли постоянные соединения HTTP во время связи с запущенным мной веб-сервером Tomcat. В настоящее время я могу получить ресурс на моем сервере из браузера (например, Chrome) и проверить с помощью netstat, что соединение установлено:

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

Однако, если я использую curl, я никогда не увижу соединение с сервером в netstat.

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

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

Я также попытался использовать следующую команду curl:

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

Вот версия curl моей клиентской машины:

[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

Как заставить curl использовать постоянное / keepalive соединение? Я немного погуглил на эту тему, но безуспешно. Следует отметить, что я также использовал linksна клиентском компьютере для получения ресурса, и это дает мне ESTABLISHEDсоединение на сервере.

Дайте мне знать, если мне нужно предоставить больше информации.


Ответы:


38

curl уже использует keepalive по умолчанию.

В качестве примера:

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

Производит следующее:

* 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

Этот фрагмент:

* Соединение № 0 с хостом www.google.com осталось без изменений
* Повторное использование существующего подключения! (# 0) с хостом www.google.com

Указывает, что он повторно использовал то же соединение.

Используйте тот же самый " curl -v http://my.server/url1 http://my.server/url2" вызов для вашего сервера и убедитесь, что вы видите то же сообщение.

Попробуйте использовать tcpdump вместо netstat, чтобы увидеть, как обрабатываются пакеты. netstat даст вам только краткий обзор того, что происходит, тогда как с помощью tcpdump вы увидите каждый отдельный пакет. Другой вариант - Wireshark.


Спасибо за ответ. Да, я понял, что большинство HTTP-клиентов по умолчанию используют keepalive. Я думаю, что я пытаюсь выяснить, почему я не вижу ESTABLISHEDсоединение на сервере, только когда я использую curl.
Роб Хруска

7
Если вы запрашиваете только один URL через curl, у curl нет никаких причин, чтобы что-то поддерживать. Процесс curl будет прекращен, как только будут получены все URL. Укажите два URL-адреса (это может быть даже один и тот же URL-адрес дважды) и следите за выводом, создаваемым «curl -v». К моменту запуска netstat соединение уже было закрыто, поскольку curl больше не работает и больше не существует причины, по которой соединение остается открытым.
Рошан

1
В этом есть смысл; не имело бы смысла сохранять связь, если процесс, владеющий им, завершился. Спасибо за вашу помощь.
Роб Хруска

8

Если ваш сервер поддерживает «KeepAlive On», вы можете использовать telnet для поддержания постоянного соединения следующим образом:

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

прекрасный. Бьет локон пока петля.
Михаил Озерянский

Я пытался проверить, правильно ли применено мое изменение KeepAliveTimout - это всего лишь билет. Благодарность!
Дэйв Грегори

6

Один из способов проверить постоянное соединение HTTP / Keep-Alive состоит в том, чтобы проверить, используется ли соединение TCP для последующих соединений.

Например. У меня есть файл, содержащий ссылку на http://google.com повторяется несколько раз.

Выполнение команды ниже откроет http://google.com несколько раз с одним и тем же TCP-соединением.

curl -K /tmp/file

И в течение этого времени, если вы используете netstat, вы обнаружите, что TCP-соединение не изменилось, и старое соединение возобновляется (сокет остается прежним).

$ 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   

Но когда мы просим клиента использовать HTTP 1.0, который не поддерживает постоянное соединение HTTP, адрес сокета изменяется

$ 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       

Исходя из этого, мы можем быть уверены, что TCP-соединение используется повторно.


5

--keepalive времени

человек кудри ... человек ..: D


2
Я прочитал справочную страницу, спасибо. Вы не заметили --keepalive-time 60в моем примере?
Роб Хруска

3
ох ... я чувствую себя глупо сейчас :(
Arenstar

8
Указание «keepalive-time», как предложено выше, не влияет на поддержание уровня HTTP; это влияет на низкоуровневое соединение TCP. Со страницы руководства ( curl.haxx.se/docs/manpage.html ): «Этот параметр устанавливает время, в течение которого соединение должно оставаться бездействующим перед отправкой тестов активности активности, и время между отдельными тестами активности активности ». Приятно, что существует так много разных вариантов поддержки активности, из которых я могу выбрать;)
ShabbyDoo
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.