Saat ini dalam pengujian: kode GitHub akan dibuka setelah selesai.

Lapisan Transport

ItemNilai
TransportTCP (koneksi persisten)
Port default5225
Opsi socketTCP_NODELAY aktif — mengirim paket kecil langsung, tanpa delay penggabungan Nagle
TLSOpsional — jika server memiliki sertifikat terkonfigurasi, seluruh stream dibungkus TLS satu arah (autentikasi server)
EncodingField biner fixed-width + key UTF-8. Integer dalam big-endian (network order)
Terminator frameSatu byte \n. Tidak ada penanganan \r
Frame kosong\n polos (posisi op adalah \n) diabaikan secara diam-diam sebagai keep-alive
Ukuran frame maksimum192 bytes — termasuk op, tanpa \n (terlampaui → E line_too_long, lalu koneksi ditutup)
PipeliningDiizinkan — respons bisa datang dengan urutan berbeda dari request
Idle timeoutTidak ada — server tidak pernah menutup koneksi yang diam
Waktu progres frameMaksimal 5 detik dari byte op pertama sampai fixed header dan LF; kiriman parsial tidak dapat menahan koneksi tanpa batas

Urutan Pembentukan Koneksi

  1. Koneksi TCP
  2. TLS handshake, jika server mengaktifkan TLS — koneksi ke server TLS dalam bentuk plaintext akan diputus di langkah ini
  3. Auth handshake, sekali
  4. Pertukaran frame protokol lock setelahnya

Aturan Framing

Setiap pesan adalah satu frame = satu baris.

[ op: 1 byte ][ header tetap khusus op ][ body variabel ] \n

Penerima 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=100A). Pemindaian \n hanya berlaku untuk segmen key/teks di akhir.

ArahopHeader tetap
Klien → ServerA10 bytes (wait:u8 + lease:u8 + owner:u64 BE)
Klien → ServerR8 bytes (token:u64 BE)
Server → KlienA16 bytes (token:u64 BE + owner:u64 BE)
Server → KlienT · B8 bytes (owner:u64 BE)
Server → KlienR · N8 bytes (token:u64 BE)
Server → KlienM · L · E0 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 \n adalah 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.