J'essaie de vérifier que les connexions persistantes HTTP sont utilisées lors de la communication avec un serveur Web Tomcat que j'ai en cours d'exécution. Actuellement, je peux récupérer une ressource sur mon serveur à partir d'un navigateur (par exemple Chrome) et vérifier à l'aide de netstat que la connexion est établie:
# visit http://server:8080/path/to/resource in Chrome
[server:/tmp]$ netstat -a
...
tcp 0 0 server.mydomain:webcache client.mydomain:55502 ESTABLISHED
Cependant, si j'utilise curl, je ne vois jamais la connexion sur le serveur dans netstat.
[client:/tmp]$ curl --keepalive-time 60 --keepalive http://server:8080/path/to/resource
...
[server:/tmp]$ netstat -a
# no connection exists for client.mydomain
J'ai également essayé d'utiliser la commande curl suivante:
curl -H "Keep-Alive: 60" -H "Connection: keep-alive" http://server:8080/path/to/resource
Voici la version curl de ma machine 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
Comment obtenir curl pour utiliser une connexion persistante/persistante? J'ai fait pas mal de recherches sur le sujet, mais sans succès. Il convient de noter que j'ai également utilisé links
sur la machine cliente pour récupérer la ressource, et que me donne un ESTABLISHED
connexion sur le serveur.
Faites-moi savoir si j'ai besoin de fournir plus d'informations.
curl utilise déjà keepalive par défaut.
Par exemple:
curl -v http://www.google.com http://www.google.com
Produit les éléments suivants:
* 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
Cet extrait:
* La connexion n ° 0 à l'hôte www.google.com est restée intacte * Réutilisation de la connexion existante! (# 0) avec l'hôte www.google.com
Indique qu'il a réutilisé la même connexion.
Utilisez le même "curl -v http://my.server/url1 http://my.server/url2
"sur votre serveur et vérifiez que le même message s'affiche.
Pensez à utiliser tcpdump au lieu de netstat pour voir comment les paquets sont traités. netstat ne vous donnera qu'un aperçu momentané de ce qui se passe, alors qu'avec tcpdump vous verrez chaque paquet impliqué. Une autre option est Wireshark.
Si votre serveur autorise "KeepAlive On", vous pouvez utiliser telnet pour maintenir une connexion persistante comme ceci:
$ while :;do echo -e "GET / HTTP/1.1\nhost: $YOUR_VIRTUAL_HOSTNAME\n\n";sleep 1;done|telnet $YOUR_SERVERS_IP 80
Une façon de tester la connexion persistante HTTP/Keep-Alive est de voir si la connexion TCP est réutilisée pour les connexions suivantes.
Par exemple. J'ai un fichier contenant un lien de http://google.com répété plusieurs fois.
L'exécution de la commande ci-dessous ouvrira http://google.com plusieurs fois avec la même connexion TCP.
curl -K /tmp/file
Et pendant ce temps, si vous netstat, vous pouvez constater que la connexion TCP n'a pas changé et que la plus ancienne est rétablie (la socket reste la même).
$ 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
Mais lorsque nous demandons au client d'utiliser HTTP 1.0 qui ne prend pas en charge la connexion HTTP persistante, l'adresse de socket change
$ 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
à partir de cela, nous pouvons être sûrs que la connexion TCP est réutilisée.
--keepalive-time
homme curl ... homme ..: D