Congestion Lab
Simulator per paket yang menunjukkan kenapa panggilan video tersendat saat ada yang mulai mengunduh di rumah

- algoritma congestion control, satu pengirim bersama
- 5
- hasil riset dicek sebelum setiap deploy
- 4
- skenario yang bisa dibagikan, masing-masing satu efek
- 9
- paket disimulasikan dalam sekitar setengah detik
- 288 ribu
Di halaman ini
Masalahnya
Setiap koneksi internet memutuskan, berkali-kali dalam sedetik, seberapa cepat ia boleh mengirim data. Keputusan itu menjelaskan masalah sehari-hari: kenapa panggilan video tersendat saat ada orang di rumah mulai mengunduh, atau kenapa server yang jauh terasa lambat di jaringan yang cepat. Biasanya ini diajarkan lewat satu gambar, garis bergerigi yang tidak pernah kita lihat proses terbentuknya.
Ada empat hal yang tetap tersembunyi tanpa simulator. Server yang berjarak 300 ms pulih dari paket yang hilang enam kali lebih lambat daripada server berjarak 50 ms, dengan bandwidth yang sama. "Slow start" ternyata menggandakan kecepatan setiap putaran. Buffer router yang terlalu besar menambah jeda sampai hitungan detik tanpa kehilangan satu paket pun. Dan berbagi jalur secara adil hanya berhasil dalam kondisi tertentu. Congestion Lab dibuat untuk mahasiswa jaringan, engineer yang tahu istilahnya tapi belum melihat mekanismenya, dan para pengajarnya.
Yang saya bangun
Setiap paket disimulasikan, kurvanya mengikuti
Saya membangun simulator yang mengirim paket satu per satu lewat jalur virtual. Paket mengantre di router, dibuang saat antrean penuh, lalu dikonfirmasi penerimanya. Kecepatan kirim yang terlihat adalah hasil reaksi algoritmanya. Tidak ada kurva yang berasal dari rumus. Simulator yang menggambar bentuk yang sudah diharapkan tidak akan pernah memberi kejutan, padahal kejutan itulah inti proyek ini.
Hasil riset menentukan boleh tidaknya deploy
Simulator yang salah tetap bisa menggambar garis bergerigi yang meyakinkan, jadi saya tidak memercayainya hanya dengan melihat. Empat hasil independen dari literatur riset diperiksa di berbagai rentang pengaturan, dan kalau gagal, deploy diblokir. Keempatnya mencakup throughput saat ada paket hilang, pemakaian jalur dibanding ukuran buffer, keunggulan server yang dekat, dan cara dua pengirim menuju bagian yang sama besar. Dua di antaranya sudah lolos sebelum saya membuat satu layar pun. Aturannya: kalau pemeriksaan gagal, simulatornya yang salah, dan toleransinya tidak diubah.
Lima algoritma memakai satu pengirim
Saya mengimplementasikan lima algoritma congestion control dari spesifikasi resminya: Tahoe, Reno/NewReno, CUBIC, Vegas, dan BBR v1. Semuanya terpasang di pengirim yang sama, jadi perbandingannya hanya mengukur algoritmanya. Di jalur yang panjang dan cepat, awalnya semua algoritma terlihat sama karena pemulihan paket hilang menjadi hambatannya. Karena itu saya menambahkan selective acknowledgement, yang tidak ada di rencana awal, supaya perbandingannya bermakna.
Empat grafik berbagi satu sumbu waktu
Tampilan utamanya menumpuk jendela pengiriman, antrean router, throughput, dan waktu bolak-balik pada satu sumbu waktu. Membaca lurus ke bawah di titik mana pun menunjukkan alasan pengirim bertindak seperti itu. Halaman bufferbloat menjalankan unduhan yang sama lewat buffer dalam dan lewat antrean yang dirancang untuk membatasi jeda: throughput-nya hampir sama, sedangkan jedanya berbeda sepuluh kali lipat. Setelah setiap simulasi, situs menuliskan temuannya dalam kalimat sederhana, dalam bahasa Indonesia atau Inggris, lengkap dengan sumbernya.
Batas modelnya ditunjukkan
Beberapa perilaku tidak bisa dimodelkan dengan setia di sini. Saya mencatatnya sebagai celah dan menampilkannya di tempat celah itu memengaruhi hasil. Ada satu hasil yang mengejutkan saya. Dengan antrean sederhana yang membuang paket saat penuh, waktu kedatangan paket kadang membalik keunggulan server yang dekat. Pemeriksaan keadilan saya pindahkan ke antrean yang membuang paket secara acak, dan efek mengejutkan itu tetap punya tesnya sendiri.
Hasilnya
Congestion Lab sudah live dan terbuka untuk umum, dalam bahasa Indonesia dan Inggris. Ada sembilan skenario pilihan, masing-masing menunjukkan satu efek yang punya nama, dan setiap simulasi bisa dibagikan lewat tautan tanpa akun atau server. Simulatornya mengolah 288.000 paket dalam sekitar setengah detik di thread latar. Tidak ada pustaka simulasi atau grafik yang dipakai. Audit aksesibilitas otomatis tidak menemukan pelanggaran di lima halamannya saat itu, dalam kedua bahasa. Saya membangunnya dalam sekitar 10 jam pada 6 Agustus 2026.
Di balik layarDetail teknis untuk engineer
- Mesin discrete-event di
lib/sim/(~3.600 baris): jam virtual, priority queue, serialisasi link, disiplin antrean, pengirim dan penerima, serta buku besar paket. (config, seed) → SimTraceidentik per byte di mesin mana pun: waktu dalam nanodetik integer, tanpaDate, tanpa keacakan tanpa seed, dan timestamp yang sama diurutkan dengan nomor urut monoton eksplisit.- Konservasi paket (
sent = delivered + dropped + in flight) diverifikasi di setiap event pada setiap test suite. - Keempat oracle: throughput Mathis et al. 1997, utilisasi terhadap ukuran buffer dan BDP, rasio ketidakadilan RTT pada Reno, dan konvergensi AIMD Chiu & Jain 1989. Sebelum ada UI, Mathis cocok dalam 13% di 5 laju kehilangan × 4 RTT, dan ukuran buffer dalam 1% di 9 ukuran buffer.
- Setiap algoritma mengimplementasikan
onAck,onLoss,onTimeout, dancanSend. Tidak adaif (algorithm === 'cubic')di pengirim. Pengirim CBR berlaju tetap dipakai sebagai acuan. - SACK mengikuti RFC 2018 dan RFC 6675, bisa diatur per flow lewat
sackEnabled, dan mati untuk Tahoe. - Disiplin antrean: DropTail, RED, dan CoDel. Pada DropTail yang deterministik, efek fase Floyd–Jacobson membalik bias RTT, jadi oracle keadilan berjalan di RED dan efek fase diverifikasi di
tests/oracles/rtt-unfairness.test.ts. - Simulasi 60 detik di 100 Mbps berisi sekitar setengah juta paket. Field yang sering dipakai disimpan di typed array dengan tabel samping dan hidrasi malas; simulasi berjalan di Web Worker dengan anggaran event. Benchmark di M0: 288 ribu paket dalam ~0,5 detik dengan heap yang tidak bertambah.
MODEL_GAPSdilib/sim/engine.ts: tanpa RACK atau Tail Loss Probe, tanpa delayed ACK, tanpa HyStart, ACK tidak pernah mengantre atau hilang, segmen selalu satu MSS, dan batas bawah RTO 200 ms (Linux), bukan 1 detik seperti RFC 6298.lib/analysis/insight.tsmenyusun kalimat temuan dalam kedua bahasa. Keadilan diukur dengan indeks Jain dari waktu ke waktu dan diagram fase Chiu-Jain.TraceChartmengukur container-nya dan menyatakan jarak dalam piksel perangkat, setelah label 11px ternyata tampil sekitar 4px di ponsel dalam viewBox tetap 1000 unit.bund(3,0:1) dansediment(2,9:1) lolos kontras untuk garis tapi tidak untuk teks, jadi ditambahkan varian-inkyang aman untuk teks.- Nol pelanggaran axe-core di kelima rute dalam kedua bahasa pada M6. 6 rute × 2 bahasa, 148 tes di 18 berkas, ~12.100 baris TypeScript, 34 commit, tiga dependensi runtime.
Tangkapan layar
Sedang merekrut, atau membangun hal serupa?
Saya terbuka untuk posisi full-time dan proyek freelance tertentu.