Episode ini membedah cara koneksi WebSocket lahir dan mati: header handshake, kalkulasi Sec-WebSocket-Accept, empat state koneksi, struktur frame, hingga mekanisme close frame dan heartbeat.

Semua koneksi WebSocket dimulai dari sesuatu yang biasa: sebuah request HTTP. Episode 3 membedah detik-detik awal itu — opening handshake — lalu mengikuti perjalanan koneksi hingga penutupan.
Kalian akan memahami mengapa handshake wajib ada, bagaimana server membuktikan bahwa dia memahami protokol WebSocket, empat state yang dilalui koneksi, anatomi frame yang membawa data, serta mekanisme ping dan pong yang menjaga koneksi tetap hidup. Ini semua adalah detail yang membuat aplikasi WebSocket kalian berperilaku benar di production.
Saat browser atau klien membuka koneksi WebSocket, yang terkirim pertama adalah request HTTP dengan header khusus. Perhatikan header berikut:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13Header Upgrade: websocket memberi tahu server bahwa klien ingin berpindah protokol, dan Sec-WebSocket-Key adalah nonce acak yang akan dipakai server untuk membuktikan pemahamannya terhadap RFC 6455.
Jika server menerima, dia mengembalikan:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=Status 101 Switching Protocols menandakan koneksi beralih dari HTTP ke WebSocket. Kunci dari proses ini ada di header Sec-WebSocket-Accept: nilainya bukan sembarangan, melainkan hasil perhitungan dari Sec-WebSocket-Key.
Server menggabungkan key yang diterima dengan GUID standar, lalu meng-hash-nya:
const crypto = require("crypto");
function buatAccept(key) {
const GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
const hash = crypto.createHash("sha1").update(key + GUID).digest("base64");
return hash;
}
const accept = buatAccept("dGhlIHNhbXBsZSBub25jZQ==");
console.log(accept);Rumus crypto.createHash("sha1") ini membuktikan bahwa server benar-benar memahami protokol. Jika klien tidak menerima Sec-WebSocket-Accept yang sesuai, koneksi dianggap gagal.
Dua header opsional juga bisa ikut dalam handshake:
permessage-deflate untuk kompresi pesan.WebSocket mendefinisikan empat state koneksi. Di browser, kalian membacanya lewat properti readyState:
const ws = new WebSocket("ws://localhost:8080");
console.log(ws.readyState); // 0 = CONNECTING
ws.onopen = () => {
console.log(ws.readyState); // 1 = OPEN
};new WebSocket("ws://localhost:8080") langsung membuka handshake secara otomatis. Perhatikan transisi state: dari 0 ke 1 setelah onopen, dan menuju 2 lalu 3 saat penutupan dimulai.
Setelah handshake, semua data dikirim dalam frame. Setiap frame dimulai dengan header kecil yang berisi:
Aturan penting dalam RFC 6455: semua frame dari klien ke server wajib di-mask, sementara server ke klien tidak. Masking mencegah cache poisoning pada proxy lama yang salah menafsirkan frame.
Satu koneksi WebSocket melalui fase:
Penutupan tidak asal putus. Salah satu sisi mengirim close frame dengan kode dan alasan:
ws.close(1000, "selesai");Kode 1000 berarti normal closure. Kode lain yang umum: 1001 going away, 1006 koneksi abnormal tanpa close frame, dan 1009 pesan terlalu besar. Memakai ws.close(1000, "selesai") dengan alasan yang jelas membantu debugging di production.
Karena koneksi bisa diam terlalu lama, server rutin mengirim ping dan klien wajib membalas pong. Ini adalah deteksi dini koneksi mati yang di episode 11 akan kita bangun menjadi sistem heartbeat lengkap dengan timeout.
Tip
Jangan bergantung pada TCP timeout saja. Banyak proxy dan load balancer memutus koneksi diam setelah beberapa menit. Ping/pong yang rutin membuat koneksi terlihat aktif dan mencegah pemutusan diam-diam.
Episode 3 membedah mekanisme di balik setiap koneksi WebSocket: handshake HTTP yang di-upgrade, kalkulasi Sec-WebSocket-Accept, empat state koneksi, struktur frame dengan aturan masking, close frame, dan heartbeat ping/pong.
Inti yang harus dibawa pulang:
Di episode 4 selanjutnya kita akan naik ke permukaan: native WebSocket API di browser — membuat instance WebSocket, empat event handler, method send dan close, serta properti readyState dan bufferedAmount. Kalian akan mulai menulis kode klien yang nyata.