如何使cURL从命令行使用keepalive?

我正在尝试validation在与运行的Tomcat Web服务器通信期间正在使用HTTP持久连接。 目前,我可以从浏览器(例如Chrome)检索服务器上的资源,并使用netstatvalidation连接已build立:

# 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使用持久/保持连接? 我已经做了相当多的谷歌search这个问题,但没有成功。 应该指出,我也使用客户端机器上的links来检索资源,这确实给了我在服务器上的ESTABLISHED连接。

让我知道如果我需要提供更多的信息。

    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你会看到每一个包都包含在内。 另一种select是Wireshark。

    如果您的服务器允许“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 

    –keepalive时间

    男子curl…男子..:D

    testingHTTP持久性连接/ Keep-Alive的一种方法是查看TCP连接是否被重复用于后续连接。

    例如。 我有一个包含http://google.com链接多次重复的文件&#x3002;

    在命令下运行将使用相同的TCP连接多次打开http://google.com

     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连接的HTTP 1.0时,套接字地址会改变

     $ 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连接被重用。