Membahas Tentang WebSocket Protocol

Agung Dirgantara
By -
0

WebSocket adalah protokol komunikasi full-duplex yang memungkinkan komunikasi dua arah antara client (misalnya browser) dan server melalui satu koneksi TCP. Berbeda dengan HTTP, yang bersifat request-response, WebSocket memungkinkan data dikirim dan diterima secara real-time tanpa harus membuat koneksi baru untuk setiap pesan.


Tahapan Pengiriman dan Penerimaan Data

a. Handshake

Sebelum komunikasi data berlangsung, WebSocket melakukan handshake menggunakan HTTP/HTTPS:

  1. Client mengirim HTTP GET request dengan header Upgrade: websocket.
  2. Server merespons dengan status 101 Switching Protocols jika menerima upgrade.
  3. Setelah handshake berhasil, koneksi TCP tetap terbuka dan siap untuk pertukaran data real-time.

Contoh header handshake:

Client → Server:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

Server → Client:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

b. Pengiriman Data

Setelah handshake:

  1. Data dikirim dalam bentuk frame, bukan request HTTP biasa.
  2. Frame memiliki opcode untuk menandai tipe pesan:

    • 0x1 → Text
    • 0x2 → Binary
    • 0x8 → Close
    • 0x9 → Ping
    • 0xA → Pong
  3. Frame juga bisa di-fragment, sehingga pesan panjang bisa dibagi menjadi beberapa frame.

Proses pengiriman data (client → server):

  1. Client mengemas data menjadi frame (misal, text frame).
  2. Frame tersebut bisa di-mask (selalu di-mask dari client ke server, agar aman dari proxy).
  3. Server menerima frame, membuka mask, dan membaca isi data.

c. Penerimaan Data

  1. Server membaca frame yang diterima dari TCP stream.
  2. Menginterpretasikan frame berdasarkan opcode.
  3. Jika frame merupakan fragmented message, server akan menggabungkan beberapa frame hingga menjadi pesan lengkap.
  4. Setelah itu, server dapat memproses data (misal: menyimpan, membroadcast ke client lain, dll).

d. Keep-Alive dan Ping-Pong

  • Untuk memastikan koneksi tetap hidup, server atau client bisa mengirim ping frame.
  • Penerima wajib membalas dengan pong.
  • Jika tidak ada respons dalam waktu tertentu, koneksi bisa dianggap mati.

e. Menutup Koneksi

  • Close frame (0x8) digunakan untuk menutup koneksi dengan elegan.
  • Frame ini bisa membawa kode status (misal 1000 = normal closure).
  • Setelah frame close diterima dan dibalas, koneksi TCP ditutup.

Kelebihan WebSocket dalam Pengiriman/Penerimaan Data

  • Real-time: tidak perlu request HTTP berulang.
  • Full-duplex: data bisa mengalir dua arah secara bersamaan.
  • Efisien: hanya ada overhead kecil setelah handshake.

Diagram Alur WebSocket: Handshake → Data → Close

Client                                              Server
  |                                                   |
  | 1. HTTP Handshake Request                        |
  |------------------------------------------------->|
  | GET /chat HTTP/1.1                                |
  | Upgrade: websocket                                |
  | Connection: Upgrade                               |
  | Sec-WebSocket-Key: ...                            |
  |                                                   |
  |                                                   |
  | 2. HTTP Handshake Response                        |
  |<-------------------------------------------------|
  | HTTP/1.1 101 Switching Protocols                 |
  | Upgrade: websocket                                |
  | Connection: Upgrade                               |
  | Sec-WebSocket-Accept: ...                         |
  |                                                   |
  |*** WebSocket connection established ***          |
  |                                                   |
  | 3. Data Transmission (Full-duplex)               |
  | Text/Binary Frame 1                               |
  |------------------------------------------------->|
  |                                                   |
  | Text/Binary Frame 2 (server can send anytime)    |
  |<-------------------------------------------------|
  | Text/Binary Frame 3                               |
  |------------------------------------------------->|
  | ...                                               |
  |                                                   |
  | 4. Ping / Pong (keep-alive)                       |
  | Ping                                             |
  |------------------------------------------------->|
  | Pong                                             |
  |<-------------------------------------------------|
  |                                                   |
  | 5. Close Connection (graceful termination)       |
  | Close Frame (1000 - Normal Closure)             |
  |------------------------------------------------->|
  | Close Frame (acknowledge)                        |
  |<-------------------------------------------------|
  | TCP Connection Closed                             |

Penjelasan Visual

  1. Handshake: Mengubah protokol HTTP biasa menjadi WebSocket (Upgrade header).
  2. Data Transmission: Setelah koneksi terbuka, data bisa mengalir dua arah.

    • Client dan server mengirim frames yang dapat berupa teks, binary, ping/pong, atau close.
    • Client selalu masking frame, server tidak.
  3. Ping/Pong: Memastikan koneksi masih hidup.
  4. Close Frame: Mengakhiri koneksi dengan kode status yang jelas.

Struktur Frame WebSocket (versi dasar)

Setiap frame WebSocket memiliki header dan payload. Header terdiri dari beberapa field penting:

0               1               2               3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len |    Extended payload length    |
|I|S|S|S|  (4)  |A|   (7)       |           (16/64)            |
|N|V|V|V|       |S|             |                               |
| |1|2|3|       |K|             |                               |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
|     Masking-key (32-bit) if MASK set                        |
+---------------------------------------------------------------+
|                        Payload Data                          |
+---------------------------------------------------------------+

Keterangan field:

Field Panjang Fungsi
FIN 1 bit 1 = frame terakhir dari pesan, 0 = masih ada fragment
RSV1-3 1 bit tiap bit Biasanya 0, digunakan untuk ekstensi (compression dll)
Opcode 4 bit Tipe frame: 0=continuation, 1=text, 2=binary, 8=close, 9=ping, A=pong
MASK 1 bit 1=payload di-mask (client → server), 0=tidak di-mask (server → client)
Payload length 7 bit Jika ≤125, panjang payload; 126=pakai 16-bit extended length; 127=pakai 64-bit extended length
Masking key 32 bit Hanya jika MASK=1, digunakan untuk men-decode payload
Payload data variable Data sebenarnya (di-decode dengan masking key jika MASK=1)

Contoh Frame WebSocket (Text “Hi”)

Misal client mengirim teks “Hi” ke server:

  1. Teks “Hi” dalam ASCII → H=0x48, i=0x69

  2. Client harus masking payload dengan random 32-bit key, misal 0x37FA213D

  3. Payload di-mask byte per byte:

    Masked byte[i] = Original byte[i] XOR Masking key[i % 4]
    
    • H (0x48) XOR 0x37 = 0x7F
    • i (0x69) XOR 0xFA = 0x93
    • → payload yang dikirim: 0x7F 0x93
  4. Frame header (FIN=1, Opcode=1, MASK=1, Payload len=2):

1000 0001 = 0x81  (FIN=1, Opcode=text)
1000 0010 = 0x82  (MASK=1, Payload len=2)
  1. Frame lengkap (hex):
0x81 0x82 0x37 0xFA 0x21 0x3D 0x7F 0x93

Server menerima, membaca header, tahu MASK=1 → de-mask dengan key 0x37FA213D → dapat payload asli Hi.


Alur Pengiriman & Penerimaan “Bit-Level”

Client TCP Stream -> Header (FIN, Opcode, MASK, len) -> Masking Key -> Payload (masked)
Server TCP Stream -> Baca Header -> Check MASK -> Unmask Payload -> Proses data
  • Untuk frame panjang, server bisa menerima beberapa frame fragmented, kemudian menggabungkan sampai FIN=1.
  • Ping/pong dan close frame juga dikodekan sama, cuma opcode berbeda.

Kalau mau, saya bisa buatkan diagram visual lengkap “TCP → Frame → Payload → Server” dengan contoh byte nyata untuk beberapa frame berurutan, termasuk text dan binary, supaya alurnya benar-benar jelas dari sisi client ke server dan sebaliknya.

Apakah mau saya buatkan diagram byte-level itu juga?

Posting Komentar

0Komentar

Posting Komentar (0)