ConnectionTimeout versus SocketTimeout

135

Saya mengalami masalah dengan perpustakaan yang saya gunakan. Mungkin perpustakaan atau saya salah menggunakannya!

Pada dasarnya, ketika saya melakukan ini (Timeout dalam milidetik)

_ignitedHttp.setConnectionTimeout(1);  // v short
_ignitedHttp.setSocketTimeout(60000);  // 60 seconds

Tidak ada pengecualian batas waktu yang dihasilkan dan berfungsi dengan baik, namun, ketika saya melakukan hal berikut,

_ignitedHttp.setConnectionTimeout(60000);  // 60 seconds
_ignitedHttp.setSocketTimeout(1);          // v short

Saya mendapatkan Pengecualian Soket.

Jadi, pertanyaan saya adalah mengapa saya tidak bisa mensimulasikan Pengecualian Koneksi? Apakah saya salah memahami perbedaan antara soket dan waktu habis koneksi? Perpustakaan ada di sini (belum dirilis secara resmi).

Robert
sumber

Jawaban:

227

Waktu tunggu koneksi hanya terjadi setelah memulai koneksi TCP. Ini biasanya terjadi jika mesin jarak jauh tidak menjawab. Ini berarti bahwa server telah dimatikan, Anda menggunakan IP / nama DNS yang salah, port yang salah atau koneksi jaringan ke server sedang down.

Waktu tunggu soket didedikasikan untuk memantau aliran data masuk yang berkelanjutan. Jika aliran data terputus untuk batas waktu yang ditentukan, koneksi dianggap macet / terputus. Tentu saja ini hanya berfungsi dengan koneksi di mana data diterima sepanjang waktu.

Dengan menetapkan batas waktu soket ke 1, ini akan mengharuskan setiap milidetik data baru diterima (dengan asumsi Anda membaca blok data dengan bijak dan blok cukup besar)!

Jika hanya aliran masuk yang terhenti lebih dari satu milidetik, Anda mengalami timeout.

Robert
sumber
1
Bisakah Anda mendapatkan batas waktu koneksi jika server tidak down tetapi sibuk? Atau apakah itu akan menjadi soket habis?
Robert
9
Itu tergantung - jika koneksi TCP telah dibuat sebelum server kelebihan beban Anda akan mendapatkan pengecualian soket - jika tidak Anda akan mendapatkan pengecualian koneksi, yang menunjukkan bahwa koneksi TCP tidak dapat dibuat.
Robert
2
Mempertimbangkan latensi tinggi dari jaringan seluler yang lebih lama, batas waktu koneksi harus diatur ke beberapa detik (misalnya 10 detik atau lebih baik 10000 msec). Waktu tunggu soket saya hanya akan ditetapkan jika Anda tidak menggunakan beberapa koneksi karena HTTP dapat menggunakan kembali koneksi setelah permintaan.
Robert
1
Apakah ini berarti bahwa jika Anda menetapkan batas waktu soket (misalnya 1 menit), maka sambungan akan dimatikan setelah 1 menit tidak aktif, di mana seperti itu biasanya akan digunakan kembali jika tidak ada batas waktu yang ditetapkan?
Robert
2
@ Robert Anda tidak perlu mendapatkan pengecualian koneksi jika server terlalu sibuk. Ini tergantung platform, pada platform server. Batas waktu baca soket tidak mematikan koneksi. Itu hanya menyebabkan SocketTimeoutException. Apakah koneksi masih dapat digunakan adalah keputusan yang harus diambil oleh aplikasi. Tidak ada yang pasti tentang API yang mengatakan Anda tidak dapat mencoba lebih banyak I / O pada soket. Pernyataan Anda tentang tidak menggunakan batas waktu jika Anda menggunakan banyak koneksi tidak masuk akal. Terlalu banyak informasi yang salah di sini.
Marquis of Lorne
83

Sebuah batas waktu koneksi adalah jumlah maksimum waktu bahwa program ini bersedia menunggu untuk setup koneksi ke proses lain. Anda tidak mendapatkan atau memposting data aplikasi apa pun pada saat ini, hanya membuat koneksi sendiri.

Waktu tunggu soket adalah batas waktu saat menunggu paket individual. Ini adalah kesalahpahaman umum bahwa batas waktu soket adalah batas waktu untuk menerima respons penuh. Jadi jika Anda memiliki batas waktu soket 1 detik, dan respons terdiri dari 3 paket IP, di mana setiap paket respons membutuhkan 0,9 detik untuk tiba, dengan total waktu respons 2,7 detik, maka tidak akan ada batas waktu.

entpnerd
sumber
3
Baik. 1. Jadi dapatkah kita mengatakan bahwa SocketTimeout hanya muncul ketika sebuah Koneksi telah dibuat? 2. Bagaimana jika tidak ada aliran data seperti katakan 5 menit setelah 3 paket diterima? Apakah akan ada pengecualian SocketTimeout setelah paket ke-3 diterima?
Saurabh Patil
2
@SaurabhPatil 1. Ya. Lihat Tinjauan Teknis Wikipedia tentang protokol HTTP untuk konfirmasi. 2. Setelah akhir pesan dikirim, tidak ada data lebih lanjut yang diperlukan, sehingga batas waktu soket tidak akan terjadi. Lihat jawaban ini pada topik.
entpnerd
7
Saya berharap mereka menamai "socket timeout" sebagai "idle timeout".
Manish Maheshwari