Lapisan Transport
| Item | Nilai |
|---|---|
| Transport | TCP (koneksi persisten) |
| Port default | 5225 |
| Opsi socket | TCP_NODELAY aktif — mengirim paket kecil langsung, tanpa delay penggabungan Nagle |
| TLS | Opsional — jika server memiliki sertifikat terkonfigurasi, seluruh stream dibungkus TLS satu arah (autentikasi server) |
| Encoding | Field biner fixed-width + key UTF-8. Integer dalam big-endian (network order) |
| Terminator frame | Satu byte \n. Tidak ada penanganan \r |
| Frame kosong | \n polos (posisi op adalah \n) diabaikan secara diam-diam sebagai keep-alive |
| Ukuran frame maksimum | 192 bytes — termasuk op, tanpa \n (terlampaui → E line_too_long, lalu koneksi ditutup) |
| Pipelining | Diizinkan — respons bisa datang dengan urutan berbeda dari request |
| Idle timeout | Tidak ada — server tidak pernah menutup koneksi yang diam |
| Waktu progres frame | Maksimal 5 detik dari byte op pertama sampai fixed header dan LF; kiriman parsial tidak dapat menahan koneksi tanpa batas |
Urutan Pembentukan Koneksi
- Koneksi TCP
- TLS handshake, jika server mengaktifkan TLS — koneksi ke server TLS dalam bentuk plaintext akan diputus di langkah ini
- Auth handshake, sekali
- Pertukaran frame protokol lock setelahnya
Aturan Framing
Setiap pesan adalah satu frame = satu baris.
[ op: 1 byte ][ header tetap khusus op ][ body variabel ] \nPenerima harus melihat op dan membaca header tetap berdasarkan jumlah byte-nya terlebih dahulu, baru memindai \n setelahnya. Ini karena header tetap bersifat biner dan bisa mengandung 0x0A (\n) sebagai nilai (mis. lease=10 → 0A). Pemindaian \n hanya berlaku untuk segmen key/teks di akhir.
| Arah | op | Header tetap |
|---|---|---|
| Klien → Server | A | 10 bytes (wait:u8 + lease:u8 + owner:u64 BE) |
| Klien → Server | R | 8 bytes (token:u64 BE) |
| Server → Klien | A | 16 bytes (token:u64 BE + owner:u64 BE) |
| Server → Klien | T · B | 8 bytes (owner:u64 BE) |
| Server → Klien | R · N | 8 bytes (token:u64 BE) |
| Server → Klien | M · L · E | 0 bytes (address/reason UTF-8 text) |
Jika frame melebihi 192 bytes atau malformed, server melakukan flush E bila mungkin lalu menutup koneksi. Klien juga memperlakukan malformed, oversized, op tidak dikenal, atau E yang tidak dapat dikorelasikan sebagai connection-fatal. Acquire yang sedikitnya satu byte-nya terkirim dalam session itu tidak otomatis diulang dan menjadi Indeterminate tanpa respons final.
Terminologi
- Frame — satuan yang memotong stream byte kontinu (TCP) menjadi "satu pesan". Dalam protokol ini, satu baris yang diakhiri
\nadalah satu frame. - Big-endian — urutan byte yang menulis byte paling signifikan dari integer terlebih dahulu. Ini standar untuk protokol jaringan, sehingga juga disebut network order.
- Pipelining — mengirim request berikutnya tanpa menunggu respons request sebelumnya. Latensi round-trip yang saling tumpang tindih ini meningkatkan throughput.
- Keep-alive — sinyal tanpa makna yang dikirim secara berkala untuk menandakan koneksi masih hidup. Di sini, frame kosong (
\n) memainkan peran itu.