Estou tentando verificar se as conexões persistentes HTTP estão sendo usadas durante a comunicação com um servidor da Web Tomcat que estou executando. Atualmente, posso recuperar um recurso no meu servidor de um navegador (por exemplo, Chrome) e verificar usando netstat se a conexão foi estabelecida:
# visit http://server:8080/path/to/resource in Chrome
[server:/tmp]$ netstat -a
...
tcp 0 0 server.mydomain:webcache client.mydomain:55502 ESTABLISHED
No entanto, se eu usar curl, nunca vejo a conexão no servidor no netstat.
[client:/tmp]$ curl --keepalive-time 60 --keepalive http://server:8080/path/to/resource
...
[server:/tmp]$ netstat -a
# no connection exists for client.mydomain
Eu também tentei usar o seguinte comando curl:
curl -H "Keep-Alive: 60" -H "Connection: keep-alive" http://server:8080/path/to/resource
Aqui está a versão curl da minha máquina cliente:
[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
Como faço para que o curl use uma conexão persistente/keepalive? Já pesquisei bastante sobre o assunto, mas sem sucesso. Deve-se notar que eu também usei links
na máquina cliente para recuperar o recurso, e isso me dá uma ESTABLISHED
conexão no servidor.
Deixe-me saber se eu precisar fornecer mais informações.
curl já usa keepalive por padrão.
Como um exemplo:
Produz o seguinte:
Este trecho:
Indica que reutilizou a mesma conexão.
Use a mesma "
curl -v http://my.server/url1 http://my.server/url2
" invocação em seu servidor e verifique se você vê a mesma mensagem.Considere usar tcpdump em vez de netstat para ver como os pacotes são tratados. netstat lhe dará apenas um vislumbre momentâneo do que está acontecendo, enquanto que com o tcpdump você verá todos os pacotes envolvidos. Outra opção é o Wireshark.
Se o seu servidor permitir 'KeepAlive On', você pode usar o telnet para manter uma conexão persistente assim:
Uma maneira de testar a conexão persistente HTTP/Keep-Alive é ver se a conexão TCP é reutilizada para conexões subsequentes.
Por exemplo. Eu tenho um arquivo contendo link de http://google.com repetido várias vezes.
A execução do comando abaixo abrirá http://google.com várias vezes com a mesma conexão TCP.
E durante esse tempo, se você netstat, poderá descobrir que a conexão TCP não mudou e a mais antiga foi reiniciada (o soquete permanece o mesmo).
Mas quando pedimos ao cliente para usar HTTP 1.0 que não suporta conexão HTTP persistente, o endereço do soquete muda
a partir disso, podemos ter certeza de que a conexão TCP é reutilizada.
--keepalive-time
cara enrola... cara.. :D