javascript - Integritas pesan Websockets
Saat menggunakan koneksi data full-duplex WebSocket antara klien dan server, apakah saya dijamin, ketika mengirim dua pesan dari server, bahwa saya akan menerima kedua pesan yang sama persis itu di klien, sesuatu yang TCP tidak lakukan?
Dengan kata lain, jika server mengirim secara berurutan hello dan kemudian its me, apakah klien selalu menerima dua pesan yang berisi hello dan its me atau apakah mungkin klien menerima helloit dan kemudian s me atau bahkan hanya satu pesan seperti helloits me?
Jawaban #1
Awalnya WebSocket memiliki byte awal dan akhir untuk pesan teks, tetapi itu informasi lama. Ada komponen panjang dalam framing (Des 2011). Omong-omong, ada flag dalam spesifikasi framing yang menentukan apakah frame adalah seluruh "pesan" atau "fragmen pesan", artinya ada frame lain yang membentuk "pesan" ini. Terserah penerima untuk menggabungkan fragmen-fragmen tersebut dengan benar agar dapat diteruskan ke kode aplikasi. Biasanya Anda tidak perlu memikirkan ini kecuali Anda memiliki "pesan" yang sangat besar (anggap "pesan" WS sebagai "data" daripada pesan sebenarnya... WS sebenarnya bukan protokol "messaging" per se).
Tapi perhatikan, WebSocket adalah transportasi tingkat rendah. Pikirkan itu seperti TCP berbasis web. Pemrogram aplikasi sebaiknya menggunakan protokol tingkat tinggi "di atas WS/WSS" dan tidak perlu khawatir tentang pengurutan, koneksi ulang, kehadiran, pub/sub, tuple-spaces, pengiriman yang dijamin, dll, dll. Jika kita tidak melakukan ini, puluhan dan puluhan protokol aplikasi yang sudah berumur puluhan tahun akan ditemukan kembali.
Jawaban #2
Memiliki koneksi yang sangat buruk, Anda mungkin kehilangan pesan (namun seharusnya dikirim ulang dengan tcp), tetapi sangat tidak mungkin dipecah dengan cara seperti itu. Setiap pesan teks memiliki batas - byte awal (0x00) dan akhir (0xFF). Browser seharusnya tidak mengacaukan pesan. Kemungkinan Anda dapat menerima pesan dalam urutan yang berbeda.
Bagaimana Anda bisa lebih yakin:
- Tambahkan jumlah kontrol Anda sendiri ke pesan (tetapi memang itu merupakan beban tambahan).
- Gunakan protokol wss (websockets+tls/ssl) - pesan yang rusak tidak akan didekripsi dengan baik.