Mengirim bingkai ping / pong websocket dari browser

130

Saya terus membaca tentang pesan ping / pong di soket web untuk menjaga koneksi tetap hidup, tapi saya tidak yakin apa itu. Apakah ini jenis bingkai yang berbeda? (Saya tidak melihat metode apa pun pada objek WebSocket javascript di chrome yang terkait dengan ping-pong). Atau apakah itu hanya pola desain (misalnya saya benar-benar mengirim "ping" atau string lain ke server dan minta ia merespons). Apakah ping-pong sama sekali terkait dengan bingkai lanjutan?

Alasan saya bertanya adalah saya menggunakan kerangka python yang berjalan di belakang Mongrel2, jadi saya bertanya-tanya apakah ada cara untuk mengirim Mongrel2 pesan ping / pong tertentu yang akan memberitahu itu untuk menjaga koneksi tetap hidup tanpa aplikasi python saya perlu khawatirkan itu. Analog dengan memiliki metode HTTP terpisah untuk itu, saya kira. Dan saya membayangkan bingkai pesan ping / pong khusus bisa lebih sederhana (lebih sedikit memuat pada server dan jaringan) daripada string "ping", meskipun itu mungkin tidak terlalu masalah.

EDIT: Saya baru saja melihat RFC 6455 dan sepertinya Ping dan Pong jelas-jelas mengontrol tipe frame dengan opcode mereka sendiri. Jadi bagaimana cara mengirim bingkai Ping dari javascript di Chrome?

danny
sumber
Cukup ping dari server. Semua orang tahu tentang masalah jaringan pada port non-standar, jadi mereka mulai melakukan ping secara berkala. Saya kira Anda bisa melakukan ping ke server yang ditulis dengan buruk, tetapi mungkin tidak terlalu pintar untuk melakukan sesuatu yang sensitif dengan mereka.
@ user1382306 ping dari server terlebih dahulu akan menggunakan baterai perangkat seluler gunakan sangat cepat. Ping dari klien dapat menghemat baterai perangkat.
pria perunggu
@ user1382306 Tidak semuanya! Apa masalah jaringan pada port non-standar?
HappyDog

Jawaban:

121

Tidak ada Javascript API untuk mengirim bingkai ping atau menerima bingkai pong. Ini didukung oleh browser Anda, atau tidak. Juga tidak ada API untuk mengaktifkan, mengkonfigurasi atau mendeteksi apakah browser mendukung dan menggunakan bingkai ping / pong. Ada diskusi tentang membuat API ping / pong Javascript untuk ini. Ada kemungkinan ping mungkin dapat dikonfigurasi / terdeteksi di masa mendatang, tetapi kemungkinan Javascript tidak akan dapat langsung mengirim dan menerima bingkai ping / pong.

Namun, jika Anda mengontrol kode klien dan server, maka Anda dapat dengan mudah menambahkan dukungan ping / pong di tingkat yang lebih tinggi. Anda akan membutuhkan semacam header / metadata jenis pesan dalam pesan Anda jika Anda belum memilikinya, tetapi itu cukup sederhana. Kecuali jika Anda berencana mengirim ping ratusan kali per detik atau memiliki ribuan klien secara bersamaan, biaya overhead akan sangat minim untuk melakukannya sendiri.

kanaka
sumber
1
@bigmugcup Tautannya sudah mati
Tn. Jo
19

Ping dimaksudkan hanya dikirim dari server ke klien, dan browser harus menjawab sesegera mungkin dengan Pong OpCode, secara otomatis. Jadi Anda tidak perlu khawatir tentang itu di level yang lebih tinggi.

Meskipun tidak semua browser mendukung standar seperti yang seharusnya, mereka mungkin memiliki beberapa perbedaan dalam menerapkan mekanisme tersebut, dan bahkan mungkin berarti tidak ada fungsi respons Pong. Tetapi secara pribadi saya menggunakan Ping / Pong, dan tidak pernah melihat klien yang tidak menerapkan jenis OpCode ini dan respons otomatis pada implementasi sisi klien tingkat rendah.

moka
sumber
73
Di mana Anda membaca bahwa ping hanya dari server ke klien? RFC mengatakan, "Titik akhir MUNGKIN mengirim bingkai Ping kapan saja setelah koneksi dibuat dan sebelum koneksi ditutup."
xryl669
7
Jika Anda ingin klien mendeteksi keadaan terputus secara otomatis (ketika tidak ada paket RST / FIN yang diterima, tetapi jaringan telah terputus), maka Anda juga harus meminta klien memulai paket ping.
pschwamb
13
TCP tidak memberitahukan tentang terputusnya ketika paket RST / FIN tidak diterima. TCP hanya mendeteksi koneksi yang terputus ketika pengirim mencoba mengirim pada koneksi yang terputus. Ping digunakan sebagai detak jantung dalam banyak aplikasi dan ini adalah penggunaan yang valid. Sambungan mati hanya akan tetap mati selamanya sampai klien mencoba mengirim. Oleh karena itu, dengan WebSockets pada browser, pesan ping kustom (atau detak jantung) harus digunakan untuk mendeteksi pemutusan klien di sisi klien. Server mungkin mencoba melakukan ping, dan mendeteksi pemutusan klien, tetapi klien tidak diberitahu. Ping klien juga baik-baik saja.
DDS
15
Dalam RFC 6455, The WebSocket Protocol, secara eksplisit menyatakan: "CATATAN: Frame Ping dapat berfungsi sebagai keepalive atau sebagai sarana untuk memverifikasi bahwa titik akhir jarak jauh masih responsif."
DDS
4
Mungkin saja ping khusus server adalah praktik yang disarankan ketika agen pengguna sering kali disegarkan. Tetapi sekarang banyak situs web yang dirancang sebagai SPA. Dalam lingkungan ini mungkin sangat penting bagi aplikasi klien untuk melakukan ping server secara teratur untuk memastikan koneksi tidak terputus.
Noel Abrahams