वर्तमान में परीक्षण चल रहा है: पूरा होने पर GitHub कोड खोला जाएगा।

ट्रांसपोर्ट लेयर

आइटममान
ट्रांसपोर्टTCP (स्थायी कनेक्शन)
डिफ़ॉल्ट पोर्ट5225
सॉकेट विकल्पTCP_NODELAY सक्षम — छोटे पैकेट तुरंत भेजता है, Nagle की मिलाने वाली देरी के बिना
TLSवैकल्पिक — यदि सर्वर पर सर्टिफ़िकेट कॉन्फ़िगर है, तो पूरी स्ट्रीम एकतरफ़ा TLS (सर्वर प्रमाणीकरण) में लपेटी जाती है
एन्कोडिंगफ़िक्स्ड-चौड़ाई बाइनरी फ़ील्ड + UTF-8 कुंजियाँ। पूर्णांक बिग-एंडियन (नेटवर्क ऑर्डर) हैं
फ़्रेम टर्मिनेटरएक \n बाइट। कोई \r हैंडलिंग नहीं
खाली फ़्रेमएक अकेला \n (op स्थान पर \n) चुपचाप keep-alive के रूप में अनदेखा किया जाता है
अधिकतम frame आकार192 bytes — op सहित, \n छोड़कर (सीमा पार → E line_too_long, फिर connection बंद)
पाइपलाइनिंगअनुमत — प्रतिक्रियाएँ अनुरोधों से भिन्न क्रम में आ सकती हैं
आइडल टाइमआउटकोई नहीं — सर्वर कभी भी शांत कनेक्शन को बंद नहीं करता
Frame progress समयपहले op byte से fixed header और LF तक अधिकतम 5 सेकंड; partial send connection को अनंत समय नहीं रोक सकता

कनेक्शन स्थापना क्रम

  1. TCP कनेक्ट
  2. यदि सर्वर पर TLS सक्षम है तो TLS हैंडशेक — प्लेनटेक्स्ट में TLS सर्वर से कनेक्ट करने पर इस चरण में कनेक्शन कट जाता है
  3. प्रमाणीकरण हैंडशेक, एक बार
  4. उसके बाद से लॉक प्रोटोकॉल फ़्रेम आदान-प्रदान

फ़्रेमिंग नियम

हर संदेश एक फ़्रेम = एक लाइन है।

[ op: 1 बाइट ][ op-विशिष्ट फ़िक्स्ड हेडर ][ परिवर्तनशील बॉडी ] \n

प्राप्तकर्ता को op देखना होता है और फ़िक्स्ड हेडर को उसकी बाइट संख्या के आधार पर पहले पढ़ना होता है, उसके बाद ही \n की खोज करनी होती है। ऐसा इसलिए क्योंकि फ़िक्स्ड हेडर बाइनरी है और इसमें एक मान के रूप में 0x0A (\n) हो सकता है (जैसे lease=100A)। \n की खोज केवल अनुगामी key/टेक्स्ट खंड पर ही लागू होती है।

दिशाopफ़िक्स्ड हेडर
क्लाइंट → सर्वरA10 bytes (wait:u8 + lease:u8 + owner:u64 BE)
क्लाइंट → सर्वरR8 bytes (token:u64 BE)
सर्वर → क्लाइंटA16 bytes (token:u64 BE + owner:u64 BE)
सर्वर → क्लाइंटT · B8 bytes (owner:u64 BE)
सर्वर → क्लाइंटR · N8 bytes (token:u64 BE)
सर्वर → क्लाइंटM · L · E0 bytes (address/reason UTF-8 text)

Frame 192 bytes से बड़ा या malformed हो तो server संभव हो E flush करके connection बंद करता है। Client भी malformed, oversized, unknown op या uncorrelatable E को connection-fatal मानता है। इस session में एक byte भी भेजे गए acquire को auto-retry नहीं किया जाता और final response बिना वह Indeterminate है।

शब्दावली

  • फ़्रेम (frame) — एक निरंतर बाइट स्ट्रीम (TCP) को "एक संदेश" के रूप में विभाजित करने की इकाई। इस प्रोटोकॉल में, \n से समाप्त होने वाली एक लाइन एक फ़्रेम है।
  • बिग-एंडियन (big-endian) — बाइट क्रम जो किसी पूर्णांक का सबसे महत्वपूर्ण बाइट पहले लिखता है। यह नेटवर्क प्रोटोकॉल का मानक है, इसलिए इसे नेटवर्क ऑर्डर भी कहा जाता है।
  • पाइपलाइनिंग (pipelining) — पिछली प्रतिक्रिया की प्रतीक्षा किए बिना अगला अनुरोध भेजना। इस तरह राउंड-ट्रिप विलंबता को ओवरलैप करने से थ्रूपुट बढ़ता है।
  • keep-alive — यह बताने के लिए समय-समय पर भेजा जाने वाला निरर्थक संकेत कि कनेक्शन अभी भी जीवित है। यहाँ, एक खाली फ़्रेम (\n) यह भूमिका निभाता है।