Jawaban Kuis Studi Kasus Pertemuan 04 - Sistem Terdistribusi (Socket Programming TCP/UDP)
Pertanyaan: Pilih TCP atau UDP untuk chat dan heartbeat, lalu jelaskan alasannya.
Alasan Teknis:
Alasan Teknis:
| Karakteristik | Chat CS (TCP) | Heartbeat Monitoring (UDP) |
|---|---|---|
| Sifat Koneksi | Connection-oriented (Handshake 3-way) | Connectionless (Kirim langsung datagram) |
| Garansi Pengiriman | Pasti sampai (ACK + Retransmisi) | Best-effort (Bisa hilang tanpa retransmisi) |
| Garansi Urutan | Terjamin urut (Sequence Number) | Tidak ada jaminan urutan |
| Header Overhead | 20 – 60 Byte | 8 Byte |
| Toleransi Kehilangan | 0% (Tidak boleh hilang sama sekali) | Tinggi (Tertutup oleh heartbeat periode berikutnya) |
Pertanyaan: Implementasikan server chat multi-klien dengan framing length-prefix dan uji dengan minimal tiga klien.
TCP adalah protokol aliran byte berkelanjutan (byte-stream) tanpa konsep batas pesan (no message boundaries). Satu kali pemanggilan send() bisa tiba terpecah ke beberapa recv() (fragmentasi), atau beberapa send() digabung menjadi satu paket oleh algoritma Nagle (coalescence / sticky packets).
+------------------------------------+---------------------------------------+
| Panjang Pesan / Length (4 Byte) | Payload Data JSON / Teks (N Byte) |
| Unsigned 32-bit Integer Big-Endian | {"type":"chat", "content":"Halo"} |
+------------------------------------+---------------------------------------+
Format header !I (Network Byte Order / Big-Endian) 4-byte memungkinkan payload hingga 4 GB per frame secara presisi.
Kode Inti Server (Node.js Buffer Accumulator & Parser):
// Akumulasi chunk TCP yang masuk
clientInfo.buffer = Buffer.concat([clientInfo.buffer, chunk]);
// Parsing loop selama buffer memiliki minimal 4 byte header
while (clientInfo.buffer.length >= 4) {
const expectedLength = clientInfo.buffer.readUInt32BE(0);
const totalFrameSize = 4 + expectedLength;
if (clientInfo.buffer.length >= totalFrameSize) {
const payload = clientInfo.buffer.subarray(4, totalFrameSize);
clientInfo.buffer = clientInfo.buffer.subarray(totalFrameSize);
// Pesan utuh berhasil diekstrak!
const message = JSON.parse(payload.toString('utf8'));
broadcast(message);
} else {
// Menunggu chunk lanjutan dari TCP stream
break;
}
}
Silakan beralih ke tab "💻 Simulasi Multi-Klien Live" untuk melihat pengujian langsung 3 klien dengan packet coalescence & fragmentation!
Pertanyaan: Pilih model konkurensi server untuk 2.200 koneksi bersamaan (200 agen + 2.000 pelanggan) dan jelaskan alasannya.
Contoh teknologi: Node.js (libuv / epoll / IOCP), Nginx, Go Runtime, atau Netty.
| Model Konkurensi | Kesesuaian untuk 2.200 Klien | Analisis Beban Memori & Kinerja |
|---|---|---|
| 1. Iteratif (Single Synchronous) | ❌ Sangat Tidak Layak | Hanya dapat melayani 1 klien hingga koneksi ditutup. Klien lain (2.199 klien) akan hang/mengantre, mustahil untuk chat real-time. |
| 2. Thread per Koneksi | ⚠️ Boros & Berat | Membuat 2.200 thread OS. Setiap thread membutuhkan stack memori minimal 1 MB – 8 MB. Total alokasi RAM untuk stack thread saja = 2,2 GB s.d. 17,6 GB! Terjadi overhead context switching CPU yang sangat tinggi. |
| 3. Thread Pool | ⚠️ Berisiko Starvation | Jika pool diisi 100-200 worker thread, dan 2.200 klien mempertahankan koneksi TCP persisten, maka sisa 2.000 koneksi akan tertahan di queue (thread exhaustion). |
| 4. Event Loop (Asynchronous) | ✅ Paling Efisien (Terbaik) | Menggunakan I/O Multiplexing (epoll/kqueue/IOCP) pada 1 thread utama. Konsumsi memori per koneksi hanya sebesar struktur soket & buffer (~10-20 KB per koneksi). Untuk 2.200 koneksi hanya butuh RAM ~25 - 45 MB! Zero thread context-switching overhead. |
Pertanyaan: Hitung throughput maksimum sinkronisasi arsip chat ke Singapura dan window yang diperlukan untuk 50 Mbps.
Rumus Throughput Maksimum TCP:
Langkah-langkah Perhitungan:
Kesimpulan Bagian A: Meskipun pipa bandwidth fisik jaringan 1 Gbps, throughput sinkronisasi mentok di 13,11 Mbps karena batasan buffer penerima 64 KB dan latensi 40 ms.
Rumus Bandwidth-Delay Product (BDP):
Menghitung ukuran buffer Window dalam satuan Byte:
Konversi ke Kilobyte (KB):
Field Window Size pada header standar TCP hanya berukuran 16-bit, sehingga kapasitas buffer maksimum tanpa scaling dibatasi pada:
Karena kebutuhan buffer sinkronisasi adalah 250.000 Byte (> 65.535 Byte), maka server di Jakarta dan Singapura wajib mengaktifkan opsi TCP Window Scaling (RFC 7323).
Dengan Window Scaling, nilai window riil adalah:
Kesimpulan: Diperlukan faktor skala pergeseran bit minimal w = 2.
Uji coba interaktif pengiriman pesan antara 3 klien (Agen CS Siti, Pelanggan Budi, Pelanggan Dewi). Perhatikan bagaimana header 4-byte Big-Endian selalu membatasi payload secara akurat meskipun terjadi fragmentasi atau penggabungan paket (coalescence).
Ubah parameter latensi (RTT), Window buffer, atau target bandwidth untuk melihat pengaruh langsung pada performa transmisi socket.
Semua program dibangun murni menggunakan modul bawaan Node.js (net, dgram, http) sehingga ringan, berkecepatan tinggi, dan tanpa perlu menjalankan `npm install`.
| Nama File | Fungsi & Deskripsi |
|---|---|
server.js | TCP Multi-Client Chat Server dengan Framing 4-byte Length-Prefix Big-Endian |
client.js | TCP Chat Client CLI interaktif (dapat dijalankan di beberapa terminal) |
test_clients.js | Automated test runner 3 klien simultan + uji packet coalescence & fragmentation |
heartbeat.js | UDP Heartbeat Monitor Server & Client simulator untuk 5 mikroservis |
web_server.js | Web server HTTP ringan untuk membuka dashboard ini di browser |
LAPORAN_KUIS_STUDI_KASUS.md | Dokumen laporan lengkap siap kumpul dalam format Markdown terstruktur |
# 1. Menjalankan pengujian otomatis multi-klien + framing TCP:
node test_clients.js
# 2. Menjalankan uji UDP Heartbeat:
node heartbeat.js
# 3. Menjalankan Server Chat interaktif:
node server.js
# 4. Membuka terminal lain untuk klien:
node client.js Agen_Siti
node client.js Pelanggan_Budi
node client.js Pelanggan_Dewi