فی الحال ٹیسٹنگ جاری ہے: مکمل ہونے پر GitHub کوڈ کھول دیا جائے گا۔

ٹرانسپورٹ تہہ

آئٹمقدر
ٹرانسپورٹTCP (مستقل کنکشن)
ڈیفالٹ پورٹ5225
ساکٹ اختیاراتTCP_NODELAY فعال — چھوٹے پیکٹس Nagle کی تاخیر کے بغیر فوراً بھیجے جاتے ہیں
TLSاختیاری — اگر سرور پر سرٹیفکیٹ ترتیب دیا گیا ہو تو پوری اسٹریم یک طرفہ TLS (سرور کی تصدیق) میں لپیٹ دی جاتی ہے
انکوڈنگفکسڈ چوڑائی کے بائنری فیلڈز + UTF-8 کلیدیں۔ اعداد big-endian (network order) میں ہیں
فریم کا اختتامایک \n بائٹ۔ \r کی کوئی ہینڈلنگ نہیں
خالی فریمصرف \n (op کی جگہ \n) کو keep-alive سمجھ کر خاموشی سے نظر انداز کیا جاتا ہے
زیادہ سے زیادہ frame سائز192 bytes — op سمیت، \n کے بغیر (حد پار → E line_too_long، پھر connection بند)
Pipeliningاجازت ہے — جوابات درخواستوں سے مختلف ترتیب میں آ سکتے ہیں
بے کار (idle) ٹائم آؤٹکوئی نہیں — سرور کسی خاموش کنکشن کو بند نہیں کرتا
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 — وہ بائٹ ترتیب جس میں عدد کا سب سے اہم بائٹ پہلے لکھا جاتا ہے۔ یہ نیٹ ورک پروٹوکولز کا معیار ہے، اس لیے اسے network order بھی کہا جاتا ہے۔
  • Pipelining — پچھلے جواب کا انتظار کیے بغیر اگلی درخواست بھیجنا۔ اس طرح round-trip تاخیر ایک دوسرے پر چڑھ جاتی ہے جس سے تھرو پٹ بڑھ جاتا ہے۔
  • Keep-alive — یہ بتانے کے لیے وقفے وقفے سے بھیجا جانے والا بے معنی سگنل کہ کنکشن زندہ ہے۔ یہاں، ایک خالی فریم (\n) یہی کردار ادا کرتا ہے۔