বর্তমানে পরীক্ষা চলছে: সম্পূর্ণ হলে GitHub কোড উন্মুক্ত করা হবে।

ট্রান্সপোর্ট লেয়ার

বিষয়মান
ট্রান্সপোর্টTCP (স্থায়ী সংযোগ, persistent)
ডিফল্ট পোর্ট5225
সকেট অপশনTCP_NODELAY সক্রিয় — ছোট প্যাকেট জমিয়ে না রেখে Nagle-এর বিলম্ব ছাড়াই তাৎক্ষণিক পাঠায়
TLSঐচ্ছিক — সার্ভারে সার্টিফিকেট কনফিগার করা থাকলে পুরো স্ট্রিম এক-মুখী TLS (সার্ভার প্রমাণীকরণ) দিয়ে মোড়ানো হয়
এনকোডিংফিক্সড-উইদথ বাইনারি ফিল্ড + UTF-8 কী। ইন্টিজার বিগ-এন্ডিয়ান (network order)
ফ্রেম টার্মিনেটরএকটি \n বাইট। \r হ্যান্ডলিং নেই
খালি ফ্রেমশুধু \n (op-এর জায়গায় \n) এলে কিপ-অ্যালাইভ হিসেবে নীরবে উপেক্ষা করা হয়
সর্বোচ্চ 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:১ বাইট ][ 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) — আগের অনুরোধের সাড়ার জন্য অপেক্ষা না করে পরবর্তী অনুরোধ পাঠানো। এভাবে রাউন্ড-ট্রিপ লেটেন্সি ওভারল্যাপ হয়ে থ্রুপুট বাড়ে।
  • কিপ-অ্যালাইভ (keep-alive) — সংযোগ এখনো জীবিত জানাতে পর্যায়ক্রমে পাঠানো অর্থহীন সংকেত। এখানে একটি খালি ফ্রেম (\n) এই ভূমিকা পালন করে।