Bagaimana cara membuat cURL menggunakan keepalive dari baris perintah?

36

Saya mencoba memverifikasi bahwa koneksi persisten HTTP sedang digunakan selama komunikasi dengan server web Tomcat yang saya jalankan. Saat ini, saya dapat mengambil sumber daya di server saya dari browser (misalnya Chrome) dan memverifikasi menggunakan netstat bahwa koneksi dibuat:

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

Namun, jika saya menggunakan curl, saya tidak pernah melihat koneksi di server di netstat.

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

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

Saya juga sudah mencoba menggunakan perintah ikal berikut:

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

Inilah versi ikal mesin klien saya:

[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

Bagaimana cara mendapatkan ikal menggunakan koneksi persisten / tetap? Saya telah melakukan sedikit Googling tentang masalah ini, tetapi tidak berhasil. Perlu dicatat bahwa saya juga menggunakan linkspada mesin klien untuk mengambil sumber daya, dan yang tidak memberikan saya sebuah ESTABLISHEDkoneksi pada server.

Beri tahu saya jika saya perlu memberikan informasi lebih lanjut.

Rob Hruska
sumber
stackoverflow.com/questions/6086609/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

38

curl sudah menggunakan keepalive secara default.

Sebagai contoh:

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

Menghasilkan yang berikut:

* 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

Cuplikan ini:

* Sambungan # 0 ke host www.google.com dibiarkan utuh
* Menggunakan kembali koneksi yang ada! (# 0) dengan host www.google.com

Menunjukkan itu menggunakan kembali koneksi yang sama.

Gunakan curl -v http://my.server/url1 http://my.server/url2permintaan " " yang sama terhadap server Anda dan periksa apakah Anda melihat pesan yang sama.

Pertimbangkan untuk menggunakan tcpdump daripada netstat untuk melihat bagaimana paket-paket ditangani. netstat hanya akan memberi Anda gambaran sekilas tentang apa yang terjadi, sedangkan dengan tcpdump Anda akan melihat setiap paket yang terlibat. Opsi lain adalah Wireshark.

Roshan
sumber
Terima kasih atas jawabannya. Ya, saya telah memahami bahwa sebagian besar klien HTTP menggunakan keepalive secara default. Saya kira apa yang saya coba cari tahu adalah mengapa saya tidak melihat ESTABLISHEDkoneksi di server hanya ketika saya menggunakan curl.
Rob Hruska
7
Jika Anda hanya meminta satu URL melalui curl, tidak ada alasan bagi curl untuk menjaga segala sesuatu tetap hidup. Proses ikal akan berakhir segera setelah semua URL diambil. Tentukan dua URL (bahkan bisa menjadi URL yang sama dua kali) dan perhatikan output yang dihasilkan oleh "curl -v". Pada saat netstat berjalan, koneksi telah ditutup karena curl tidak lagi berjalan dan tidak ada lagi alasan untuk koneksi tetap terbuka.
Roshan
1
Itu masuk akal; tidak masuk akal untuk menjaga koneksi tetap ada jika proses kepemilikan sudah selesai. Terima kasih atas bantuan Anda.
Rob Hruska
8

Jika server Anda mengizinkan 'KeepAlive On', Anda dapat menggunakan telnet untuk membuat koneksi tetap seperti:

$ while :;do echo -e "GET / HTTP/1.1\nhost: $YOUR_VIRTUAL_HOSTNAME\n\n";sleep 1;done|telnet $YOUR_SERVERS_IP 80
Lab AX
sumber
indah. Ketukan ikal saat loop sejauh ini.
Michael Ozeryansky
Saya mencoba menguji apakah perubahan KeepAliveTimout saya telah diterapkan dengan benar - ini hanya tiketnya. Terima kasih!
Dave Gregory
6

Salah satu cara untuk menguji koneksi persisten HTTP / Keep-Alive adalah untuk melihat apakah koneksi TCP digunakan kembali untuk koneksi selanjutnya.

Sebagai contoh. Saya memiliki file yang berisi tautan http://google.com diulang beberapa kali.

Perintah di bawah ini akan membuka http://google.com beberapa kali dengan koneksi TCP yang sama.

curl -K /tmp/file

Dan selama waktu ini jika Anda netstat Anda dapat menemukan bahwa koneksi TCP tidak berubah dan yang lebih lama resued (Soket tetap sama).

$ 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   

Tetapi ketika kami meminta klien untuk menggunakan HTTP 1.0 yang dosisnya tidak mendukung koneksi HTTP persisten, alamat soket berubah

$ 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       

dari sini kita dapat yakin bahwa koneksi TCP digunakan kembali.

Kannan Mohan
sumber
5

--pertahankan waktu

man curl ... man ..: D

Arenstar
sumber
2
Saya sudah membaca halaman manual, terima kasih. Apakah Anda tidak memperhatikan --keepalive-time 60dalam contoh saya?
Rob Hruska
3
oh ... saya merasa bodoh sekarang :(
Arenstar
8
Menentukan "keepalive-time" seperti yang disarankan di atas tidak memengaruhi tingkat HTTP tetap hidup; itu mempengaruhi konektivitas TCP tingkat rendah. Dari halaman manual ( curl.haxx.se/docs/manpage.html ): "Opsi ini mengatur waktu koneksi harus tetap siaga sebelum mengirim probe keepalive dan waktu antara probe keepalive individual." Sangat menyenangkan bahwa ada begitu banyak jenis keep-live yang dapat dipilih, saya kira;)
ShabbyDoo