সরাসরি পর্বে যান
পর্ব ১৭ · ৬২-এর মধ্যে · মডিউল ৩

Subnetting, CIDR আর VLSM — ধাপে ধাপে হিসাব

Subnetting, CIDR & VLSM — Block-Size and Binary Methods, Worked Examples, Route Summarisation & Wildcard Masks

Taught in Bangla, this lesson teaches subnetting by borrowing host bits, the 2^s subnets and 2^h - 2 hosts formulas, block-size and binary AND methods side by side, masks in the second and third octet, a worked equal-size split of 192.168.10.0/24 into six subnets, VLSM allocation, route summarisation, wildcard masks, a mental-math table and common mistakes.

এই পর্বে যা শিখবেন

  • কেন subnet করা হয়, আর host bit ধার নিয়ে subnet ও host-এর সংখ্যা কীভাবে বের হয় — প্রমাণসহ
  • Block size পদ্ধতি আর binary AND পদ্ধতি পাশাপাশি — চতুর্থ, তৃতীয় আর দ্বিতীয় octet-এর mask-এ
  • যেকোনো host-এর network, broadcast, ব্যবহারযোগ্য পরিসর, আর দুটি host একই subnet-এ কি না
  • সমান মাপের subnetting আর VLSM — পুরো অফিসের ঠিকানা-পরিকল্পনা টেবিলসহ
  • Route summarisation, তার বিপদ, wildcard mask, সাধারণ ভুল আর নিজে যাচাইয়ের উপায়

১ · কেন ভাগ করবেন — এক মহল্লা থেকে অনেক সেক্টর

পর্ব ১৬-এ (IPv4 ঠিকানা আর header) দেখেছেন, একটি IPv4 ঠিকানা ৩২ bit-এর, চারটি ৮ bit-এর ভাগে (octet) লেখা হয় — যেমন 192.168.10.77. ঠিকানার শুরুর কিছু bit হলো নেটওয়ার্কের নাম (prefix), বাকিটা host-এর নম্বর। কতটি bit prefix, তা বলে CIDR-এর /n লেখা বা সমতুল্য subnet mask: /24 = 255.255.255.0. Host-অংশের সব bit ০ হলে সেটি network address, সব bit ১ হলে broadcast address, আর দুটোর মাঝের ঠিকানাগুলো যন্ত্রকে দেওয়া যায়। এই পর্বের পুরো হিসাব এই একটি অনুচ্ছেদের ওপর দাঁড়িয়ে।

এখন প্রশ্ন: একটি প্রতিষ্ঠান একটি বড় ঠিকানা-ব্লক পেলে সব যন্ত্রকে একটিই বড় নেটওয়ার্কে রাখবে, নাকি ভাগ করবে? ভাগ করার কাজটির নাম subnetting.

ঢাকার উত্তরা একটি বড় এলাকা, কিন্তু চিঠি বা কুরিয়ার পৌঁছায় “সেক্টর ৭, রোড ১৫, বাড়ি ২২” ধরে। পুরো উত্তরার বাড়িগুলোকে ১ থেকে কয়েক হাজার পর্যন্ত একটানা নম্বর দিলে কাজ চলত ঠিকই, কিন্তু ডাকপিয়নকে প্রতিটি চিঠির জন্য পুরো এলাকা ঘুরতে হতো, আর মহল্লার মাইকের ঘোষণা গোটা উত্তরা শুনত। সেক্টরে ভাগ করলে প্রতিটি সেক্টরের নিজের গলি, নিজের ঘোষণা, আর সেক্টরের মোড়ে একটি ডাকঘর — বাইরে যাওয়ার চিঠি সেখানেই জমা হয়। Subnet হলো সেক্টর, network address হলো সেক্টরের নাম, আর default gateway হলো মোড়ের ডাকঘর।

চারটি কারণ

ছোট broadcast domain

একটি subnet সাধারণত একটি broadcast domain. ARP আর DHCP-র broadcast (পর্ব ১৮) শুধু নিজের subnet-এর যন্ত্রগুলো শোনে। এক হাজার যন্ত্রকে আটটি subnet-এ ভাগ করলে প্রতিটি যন্ত্রের শোনার বোঝা অনেক কমে।

কম গোলমাল

নিরাপত্তার সীমানা

Subnet থেকে subnet-এ যেতে router পার হতে হয়। সেই router বা firewall-এ নিয়ম বসানো যায় — “অতিথি subnet শুধু ইন্টারনেটে যাবে, হিসাবের সার্ভারে নয়”.

মোড়ে পাহারা

ঠিকানার পরিকল্পনা

প্রতিটি বিভাগ, তলা বা শাখার নিজের ব্লক থাকলে ঠিকানা দেখেই বোঝা যায় যন্ত্রটি কোথাকার, আর router-এর routing table-এও প্রতিটি শাখা এক লাইনে ধরা যায়।

শৃঙ্খলা

VLAN-এর সাথে মিল

পর্ব ১৩-এ (VLAN আর trunking) দেখেছেন, এক VLAN = এক broadcast domain = সাধারণত এক subnet. VLAN 20 ↔ 192.168.20.0/24 — layer 2-এর ভাগ আর layer 3-এর ভাগ একই রেখায় টানা।

layer 2 ↔ layer 3

শুরুর দিকের ইন্টারনেটে ঠিকানা ভাগ হতো শুধু class দিয়ে (পর্ব ১৬): class A, B বা C — মাঝামাঝি কিছু নেই। একটি বিশ্ববিদ্যালয় class B পেলে ৬৫ হাজারের বেশি ঠিকানার একটিই নেটওয়ার্ক। ১৯৮৫ সালের RFC 950 প্রথম standard উপায়ে বলল, প্রতিষ্ঠান নিজের ভেতরে host-অংশের কিছু bit নিয়ে subnet বানাতে পারবে — জন্ম নিল subnet mask. ১৯৯৩ সালে RFC 1519 (পরে RFC 4632) class-এর সীমাই তুলে দিল: যেকোনো দৈর্ঘ্যের prefix, ইন্টারনেট জুড়ে। সেটিই CIDR — Classless Inter-Domain Routing.

২ · Host bit ধার করা — ২s আর ২h − ২-এর হিসাব

একটি /24 ব্লক নিন: 192.168.10.0/24. প্রথম ২৪ bit নেটওয়ার্ক, শেষ ৮ bit host. এখন host-অংশের বাঁ দিক থেকে কয়েকটি bit “ধার” নিয়ে সেগুলোকে নেটওয়ার্ক-অংশে যোগ করা হলো। ধার নেওয়া bit-গুলো হলো subnet bit (সংখ্যা s), বাকিগুলো host bit (সংখ্যা h). নতুন prefix = ২৪ + s, আর s + h = ৮।

 192.168.10.0/24 থেকে ৩ bit ধার → /27

 ┌──────────── network (24 bit) ───────────┬─ subnet ─┬── host ──┐
 │ 11000000 . 10101000 . 00001010 .        │   s s s  │ h h h h h│
 │   192        168        10              │  3 bit   │  5 bit   │
 └─────────────────────────────────────────┴──────────┴──────────┘
 mask: 11111111.11111111.11111111.111 00000 = 255.255.255.224

দুটি সূত্র, আর কেন সেগুলো সত্য

সূত্র

Subnet-এর সংখ্যা = ২s  ·  প্রতি subnet-এ ঠিকানা = ২h  ·  ব্যবহারযোগ্য host = ২h − ২

প্রমাণ: প্রতিটি subnet bit ০ বা ১ হতে পারে, আর s-টি bit স্বাধীনভাবে বদলায়, তাই আলাদা subnet-নম্বর ২ × ২ × … (s বার) = ২s. একই যুক্তিতে একটি subnet-এর ভেতরে host-অংশের আলাদা মান ২h. এর মধ্যে দুটি মান সংরক্ষিত: সব bit ০ (network address — subnet-টির নিজের নাম, routing table-এ এটিই লেখা হয়) আর সব bit ১ (broadcast address — “এই subnet-এর সবাই”). তাই যন্ত্রকে দেওয়া যায় ২h − ২টি। উদাহরণ: /27-এ h = ৫, ২৫ − ২ = ৩০টি host; s = ৩, তাই একটি /24 থেকে ৮টি /27.

উল্টো দিকের প্রশ্নই পরীক্ষায় বেশি আসে: “প্রতিটি subnet-এ অন্তত ৫০টি host লাগবে, mask কত?” — সবচেয়ে ছোট h খুঁজুন যাতে ২h − ২ ≥ ৫০। h = ৫ দিলে ৩০ (কম), h = ৬ দিলে ৬২ (যথেষ্ট)। তাই h = ৬, prefix = ৩২ − ৬ = /26. আর “অন্তত ৬টি subnet লাগবে” — সবচেয়ে ছোট s যাতে ২s ≥ ৬: s = ৩ (৮টি)।

পুরোনো বই বনাম আধুনিক নিয়ম: কিছু পুরোনো পাঠ্যবই আর প্রশ্নে subnet-এর সংখ্যা লেখা থাকে ২s − ২ — সব-০ subnet (“subnet zero”) আর সব-১ subnet বাদ দিয়ে। RFC 950-এর যুগে কিছু পুরোনো routing protocol এই দুটি subnet-কে মূল নেটওয়ার্ক বা তার broadcast থেকে আলাদা করতে পারত না বলে এগুলো এড়ানো হতো। CIDR আর classless routing-এর যুগে এই সীমা আর নেই — RFC 1878 (১৯৯৫) এই প্রথাকে অপ্রচলিত বলেছে, আর Cisco IOS-এ বহু বছর ধরে ip subnet-zero ডিফল্টে চালু। এই পর্বে ২s ব্যবহার করা হয়েছে। পরীক্ষায় প্রশ্নে “subnet zero ব্যবহার করা যাবে না” জাতীয় কিছু লেখা থাকলে তবেই ২s − ২ নিন, আর উত্তরে অনুমানটি এক লাইনে লিখে দিন। Host-এর −২ কিন্তু আজও আছে।

৩ · দুই পদ্ধতি পাশাপাশি — block size বনাম binary AND

Subnetting-এর সবচেয়ে সাধারণ প্রশ্ন: “192.168.10.77/27 — network, broadcast, প্রথম আর শেষ ব্যবহারযোগ্য ঠিকানা কত?” উত্তর বের করার দুটি পদ্ধতি আছে। Router নিজে দ্বিতীয়টি করে; মানুষ মাথায় দ্রুত করে প্রথমটি। দুটোই জানা দরকার — একটি দিয়ে উত্তর, অন্যটি দিয়ে যাচাই।

পদ্ধতি ক — Block size (“magic number”)

  1. আগ্রহের octet খুঁজুন: mask-এর যে octet ২৫৫ নয় আর ০-ও নয় (বা prefix যে octet-এ শেষ হয়)। /27 = ৮ + ৮ + ৮ + ৩, তাই চতুর্থ octet, mask-এর মান ২২৪।
  2. Block size = ২৫৬ − ২২৪ = ৩২। Subnet-গুলো শুরু হয় ৩২-এর গুণিতকে: 0, 32, 64, 96, 128, 160, 192, 224.
  3. Host-এর মান কোন দুই গুণিতকের মাঝে? ৭৭ আছে ৬৪ আর ৯৬-এর মাঝে। তাই network = 192.168.10.64.
  4. Broadcast = পরের network − ১ = ৯৬ − ১ = 192.168.10.95.
  5. ব্যবহারযোগ্য: network + ১ থেকে broadcast − ১ = .65 থেকে .94, মোট ৩০টি।

পদ্ধতি খ — Binary AND

Router-এর কাছে mask একটি bit-এর ছাঁকনি: ঠিকানা আর mask-এর প্রতিটি bit জোড়ায় AND করলে (দুটোই ১ হলে ১, নইলে ০) host-অংশ মুছে গিয়ে network address থাকে। Broadcast পেতে network-এর host-অংশের সব bit ১ করে দিন (mask উল্টে OR).

              ঠিকানা      192.168.10. 0100 1101   (77)
          AND mask        255.255.255. 1110 0000   (224)
          ─────────────────────────────────────────
              network     192.168.10. 0100 0000   (64)   ← host bit মুছে গেল
           OR ~mask       000.000.000. 0001 1111   (31)
          ─────────────────────────────────────────
              broadcast   192.168.10. 0101 1111   (95)   ← host bit সব ১

দুটি পদ্ধতি কেন একই উত্তর দেয়: ব্লক B = ২h হলে mask-এর আগ্রহের octet = ২৫৬ − B, যার নিচের h-টি bit ০ আর ওপরের bit-গুলো ১. কোনো মান x-কে এর সাথে AND করলে x-এর নিচের h-টি bit মুছে যায় — অর্থাৎ ফল x − (x mod B), যা B-এর সবচেয়ে কাছের নিচের গুণিতক, ⌊x ÷ B⌋ × B. Block size পদ্ধতি ঠিক এই ভাগফলটাই মাথায় করে: ৭৭ − (৭৭ mod ৩২) = ৭৭ − ১৩ = ৬৪। এ জন্যই block size সবসময় ২-এর ঘাত, আর এ জন্যই subnet সবসময় তার নিজের block size-এর গুণিতকে শুরু হয় — পরে VLSM-এ এই সত্যটিই কাজে লাগবে।

হিসাবের খাতা
Mask
আগ্রহের octet
Block size
গুণিতকের সিঁড়ি
Network
Broadcast
ব্যবহারযোগ্য
  1. Prefix থেকে mask. /27 মানে প্রথম ২৭টি bit ১: তিনটি পূর্ণ octet (২৪ bit) আর চতুর্থ octet-এর বাঁয়ের ৩ bit — 11100000 = ১২৮ + ৬৪ + ৩২ = ২২৪। তাই mask 255.255.255.224, আর হিসাব হবে চতুর্থ octet-এ।
  2. Block size. ২৫৬ − ২২৪ = ৩২। অর্থাৎ প্রতিটি /27 subnet-এ ৩২টি ঠিকানা, আর subnet-গুলো শুরু হয় 0, 32, 64… এভাবে ৩২-এর গুণিতকে — মোট ৮টি।
  3. সিঁড়িতে host-কে বসানো। Host-এর চতুর্থ octet ৭৭। সিঁড়িতে ৬৪-এর পরের ধাপ ৯৬, আর ৭৭ এদের মাঝে। তাই ৭৭ যে subnet-এর, তার শুরু ৬৪: network address 192.168.10.64.
  4. Broadcast. পরের subnet শুরু ৯৬-এ, তাই এই subnet-এর শেষ ঠিকানা ৯৫ — 192.168.10.95. বিকল্প হিসাব: network + block − ১ = ৬৪ + ৩২ − ১ = ৯৫।
  5. ব্যবহারযোগ্য পরিসর. Network-এর ঠিক পরের .65 থেকে broadcast-এর ঠিক আগের .94. সংখ্যা ৩২ − ২ = ৩০। সাধারণ রীতিতে প্রথমটি (.65) প্রায়ই gateway-কে দেওয়া হয় — এটি রীতি, নিয়ম নয়।
  6. Binary AND দিয়ে যাচাই. ৭৭ = 01001101, ২২৪ = 11100000; AND করলে 01000000 = ৬৪ — একই network. Host bit (নিচের ৫টি) সব ১ করলে 01011111 = ৯৫ — একই broadcast. আর গাণিতিকভাবে ৭৭ − (৭৭ mod ৩২) = ৬৪। তিন রাস্তায় এক উত্তর।

চতুর্থ octet-এ আরেকটি — হাতে করে দেখুন

10.0.5.130/26: /26-এ mask-এর চতুর্থ octet ১৯২, block = ২৫৬ − ১৯২ = ৬৪। সিঁড়ি 0, 64, 128, 192 — ১৩০ আছে ১২৮ আর ১৯২-এর মাঝে। Network 10.0.5.128, broadcast 10.0.5.191, ব্যবহারযোগ্য .129–.190, ৬২টি host.

৪ · তৃতীয় আর দ্বিতীয় octet-এ mask — একই কৌশল, বড় সিঁড়ি

Prefix ২৪-এর ছোট হলে আগ্রহের octet সরে যায় বাঁয়ে। পদ্ধতি হুবহু একই, শুধু দুটি জিনিস মনে রাখতে হয়: আগ্রহের octet-এর ডানের সব octet network-এ ০ আর broadcast-এ ২৫৫, আর host-এর সংখ্যায় ডানের সব bit-ও গুনতে হয়।

উদাহরণ ১ — তৃতীয় octet: 172.16.45.200/20

  • /20 = ৮ + ৮ + ৪, তাই আগ্রহের octet তৃতীয়টি; সেখানে mask 11110000 = ২৪০। Mask 255.255.240.0.
  • Block = ২৫৬ − ২৪০ = ১৬ (তৃতীয় octet-এ)। সিঁড়ি 0, 16, 32, 48… — ৪৫ আছে ৩২ আর ৪৮-এর মাঝে।
  • Network = 172.16.32.0 (তৃতীয় octet ৩২, চতুর্থ ০)।
  • Broadcast = পরের network 172.16.48.0 − ১ = 172.16.47.255.
  • ব্যবহারযোগ্য 172.16.32.1 থেকে 172.16.47.254; host bit h = ৩২ − ২০ = ১২, তাই ২১২ − ২ = ৪,০৯৪টি।

লক্ষ করুন, এই subnet-এর ভেতরে 172.16.40.0 বা 172.16.47.0-এর মতো “শূন্যে শেষ” ঠিকানাও সাধারণ host ঠিকানা — সেগুলো network address নয়। /20-এ network একটিই, 172.16.32.0. শেষ octet ০ দেখেই “এটি network” ধরে নেওয়া একটি সাধারণ ভুল।

উদাহরণ ২ — দ্বিতীয় octet: 10.77.130.5/11

  • /11 = ৮ + ৩, আগ্রহের octet দ্বিতীয়টি; mask সেখানে 11100000 = ২২৪, পুরো mask 255.224.0.0.
  • Block = ২৫৬ − ২২৪ = ৩২ (দ্বিতীয় octet-এ)। ৭৭ আছে ৬৪ আর ৯৬-এর মাঝে।
  • Network 10.64.0.0, broadcast 10.95.255.255 (পরের network 10.96.0.0-এর ঠিক আগে)।
  • ব্যবহারযোগ্য 10.64.0.1 থেকে 10.95.255.254; h = ২১, host = ২২১ − ২ = ২০,৯৭,১৫০টি।

দুটি host কি একই subnet-এ?

দুটি ঠিকানার network address আলাদা করে বের করুন — একই mask দিয়ে। মিললে তারা একই subnet-এ, router ছাড়াই সরাসরি (ARP দিয়ে MAC জেনে) কথা বলবে; না মিললে প্রেরক packet পাঠাবে gateway-তে। প্রতিটি কম্পিউটার প্রতিটি packet পাঠানোর আগে ঠিক এই প্রশ্নটিই করে।

  • 192.168.10.70 আর 192.168.10.100, /27: block ৩২; ৭০ → ৬৪, ১০০ → ৯৬। আলাদা subnet.
  • একই দুটি ঠিকানা, /26: block ৬৪; ৭০ → ৬৪, ১০০ → ৬৪। একই subnet. উত্তর ঠিকানার ওপর নয়, mask-এর ওপর নির্ভর করে।
  • 172.16.33.1 আর 172.16.46.9, /20: তৃতীয় octet-এ block ১৬; ৩৩ → ৩২, ৪৬ → ৩২। একই subnet, যদিও তৃতীয় octet আলাদা দেখায়।

বাস্তবের একটি ফাঁদ: দুই যন্ত্রের mask আলাদা হলে (ভুল কনফিগারেশনে) একজন অন্যজনকে “নিজের subnet-এ” ভাবতে পারে, অন্যজন পারে না — তখন এক দিকের packet যায়, উত্তর ফেরে gateway ঘুরে বা ফেরেই না। “ping একদিকে যায়, অন্যদিকে যায় না” লক্ষণে প্রথমে দুই প্রান্তের mask মিলিয়ে দেখুন।

নিচের calculator ঠিক এই হিসাবগুলো করে, আর প্রতিটির সাথে block size-এর যুক্তিও ছাপে, যাতে খাতার হিসাব মেলাতে পারেন। ঠিকানাকে ৩২ bit-এর একটি সংখ্যা বানিয়ে mask দিয়ে AND (&), আর broadcast-এর জন্য উল্টানো mask দিয়ে OR (|) — router-এর hardware-ও মূলত এটাই করে। শেষের /31 উদাহরণটি অংশ ৬-এ ব্যাখ্যা করা হয়েছে।

// IPv4 subnet calculator: network, broadcast, usable range + block-size reasoning.
const toInt = ip => ip.split(".").reduce((a, o) => a * 256 + Number(o), 0);
const toIp = n => [24, 16, 8, 0].map(s => (n >>> s) & 255).join(".");
const maskOf = p => (p === 0 ? 0 : (0xffffffff << (32 - p)) >>> 0);
const netOf = (x, p) => (x & maskOf(p)) >>> 0;
function calc(cidr) {
  const [ip, ps] = cidr.split("/"), p = Number(ps), x = toInt(ip);
  const m = maskOf(p), net = netOf(x, p), bc = (net | ~m) >>> 0;
  const k = Math.max(0, Math.ceil(p / 8) - 1);           // interesting octet (0-based)
  const mo = toIp(m).split(".")[k], block = 256 - mo, v = ip.split(".")[k];
  const lo = Math.floor(v / block) * block;
  console.log(`${cidr}  mask ${toIp(m)}`);
  console.log(`  octet ${k + 1}: block = 256 - ${mo} = ${block}; ${v} lies in ${lo}..${lo + block - 1}`);
  if (p === 31) { console.log(`  /31 link: ${toIp(net)} and ${toIp(bc)} are both hosts (RFC 3021)`); return; }
  console.log(`  network ${toIp(net)}  broadcast ${toIp(bc)}`);
  console.log(`  usable ${toIp(net + 1)} - ${toIp(bc - 1)}  (${2 ** (32 - p) - 2} hosts)`);
}
function same(a, b, p) {
  const na = netOf(toInt(a), p), nb = netOf(toInt(b), p);
  console.log(`${a} vs ${b} /${p}: ${toIp(na)} vs ${toIp(nb)} -> ` +
    (na === nb ? "SAME subnet (talk directly)" : "DIFFERENT subnets (need a router)"));
}
["192.168.10.77/27", "10.0.5.130/26", "172.16.45.200/20", "10.77.130.5/11", "192.168.50.6/31"]
  .forEach(calc);
console.log("--- same subnet? ---");
same("192.168.10.70", "192.168.10.100", 27);
same("192.168.10.70", "192.168.10.100", 26);
same("172.16.33.1", "172.16.46.9", 20);

আউটপুট:

192.168.10.77/27  mask 255.255.255.224
  octet 4: block = 256 - 224 = 32; 77 lies in 64..95
  network 192.168.10.64  broadcast 192.168.10.95
  usable 192.168.10.65 - 192.168.10.94  (30 hosts)
10.0.5.130/26  mask 255.255.255.192
  octet 4: block = 256 - 192 = 64; 130 lies in 128..191
  network 10.0.5.128  broadcast 10.0.5.191
  usable 10.0.5.129 - 10.0.5.190  (62 hosts)
172.16.45.200/20  mask 255.255.240.0
  octet 3: block = 256 - 240 = 16; 45 lies in 32..47
  network 172.16.32.0  broadcast 172.16.47.255
  usable 172.16.32.1 - 172.16.47.254  (4094 hosts)
10.77.130.5/11  mask 255.224.0.0
  octet 2: block = 256 - 224 = 32; 77 lies in 64..95
  network 10.64.0.0  broadcast 10.95.255.255
  usable 10.64.0.1 - 10.95.255.254  (2097150 hosts)
192.168.50.6/31  mask 255.255.255.254
  octet 4: block = 256 - 254 = 2; 6 lies in 6..7
  /31 link: 192.168.50.6 and 192.168.50.7 are both hosts (RFC 3021)
--- same subnet? ---
192.168.10.70 vs 192.168.10.100 /27: 192.168.10.64 vs 192.168.10.96 -> DIFFERENT subnets (need a router)
192.168.10.70 vs 192.168.10.100 /26: 192.168.10.64 vs 192.168.10.64 -> SAME subnet (talk directly)
172.16.33.1 vs 172.16.46.9 /20: 172.16.32.0 vs 172.16.32.0 -> SAME subnet (talk directly)

প্রথম চারটি ফল ঠিক ওপরের খাতার হিসাবের সাথে মেলে: /27-এ ৩২-এর block-এ ৭৭ → ৬৪–৯৫, /26-এ ৬৪-এর block-এ ১৩০ → ১২৮–১৯১, /20-এ তৃতীয় octet-এ ১৬-এর block-এ ৪৫ → ৩২–৪৭, আর /11-এ দ্বিতীয় octet-এ ৩২-এর block-এ ৭৭ → ৬৪–৯৫। k বের করে prefix কোন octet-এ শেষ: ⌈p ÷ ৮⌉ − ১ (০ থেকে গোনা), তাই /20 → ২ মানে তৃতীয় octet. Same-subnet পরীক্ষায় একই দুটি ঠিকানা /27-এ আলাদা, /26-এ এক — mask-ই সিদ্ধান্ত দেয়। >>> 0 কেন? JavaScript-এ bit-অপারেশনের ফল signed ৩২ bit; ১৯২-দিয়ে শুরু ঠিকানার সবচেয়ে বাঁয়ের bit ১, তাই ফল ঋণাত্মক দেখাত। >>> 0 একে unsigned বানায়। নিজে চেষ্টা করুন: তালিকায় "172.20.137.85/19" যোগ করে আগে খাতায় উত্তর লিখুন, তারপর চালিয়ে মেলান।

৫ · সমান মাপের subnetting — 192.168.10.0/24 থেকে ৬টি subnet

প্রশ্ন: একটি অফিস 192.168.10.0/24 পেয়েছে, ৬টি বিভাগ, প্রতিটির জন্য আলাদা subnet চাই, সব subnet সমান মাপের। Mask কত? প্রতিটিতে কতটি host? সব subnet-এর তালিকা দিন। একে বলে fixed-length subnetting (FLSM).

সমাধান: ২s ≥ ৬ হতে সবচেয়ে ছোট s = ৩ (২৩ = ৮)। নতুন prefix = ২৪ + ৩ = /27, mask 255.255.255.224. h = ৫, প্রতিটিতে ২৫ − ২ = ৩০টি host. Block size ৩২:

#Networkপ্রথম ব্যবহারযোগ্যশেষ ব্যবহারযোগ্যBroadcast
১192.168.10.0/27.1.30.31
২192.168.10.32/27.33.62.63
৩192.168.10.64/27.65.94.95
৪192.168.10.96/27.97.126.127
৫192.168.10.128/27.129.158.159
৬192.168.10.160/27.161.190.191
৭ (অতিরিক্ত)192.168.10.192/27.193.222.223
৮ (অতিরিক্ত)192.168.10.224/27.225.254.255

৬টি বিভাগ পেল ৬টি subnet, আর ভবিষ্যতের জন্য ২টি বাকি রইল। কিন্তু এই নকশার দুর্বলতা স্পষ্ট: যে বিভাগে ১০০ জন, সে-ও পায় ৩০টি ঠিকানা, আর যে router-to-router link-এ মাত্র ২টি ঠিকানা লাগে, সে-ও ৩০টি নিয়ে বসে থাকে। সব সমান মাপে কাটলে কোথাও অভাব, কোথাও অপচয়। এর সমাধানই পরের অংশের VLSM.

বিপরীত প্রশ্ন একই নিয়মে: “/24 থেকে যত বেশি সম্ভব subnet, প্রতিটিতে অন্তত ২৫টি host” — ২h − ২ ≥ ২৫ → h = ৫, তাই /27, ৮টি subnet. “অন্তত ৪০টি host” হলে h = ৬, /26, মাত্র ৪টি subnet. Host বাড়লে subnet কমে — subnet-এর সংখ্যা × প্রতি subnet-এর ঠিকানা (host + ২) সবসময় ২৫৬ (মূল ব্লকের মাপ)।

৬ · VLSM — প্রতিটি দলকে তার মাপের জামা

VLSM (Variable Length Subnet Mask) মানে একই মূল ব্লকের ভেতরে বিভিন্ন দৈর্ঘ্যের prefix — বড় বিভাগের জন্য বড় block, ছোট link-এর জন্য ছোট block. দর্জির দোকানের কথা ভাবুন: সবাইকে এক মাপের জামা দিলে কারও ঢিলে, কারও আঁটসাঁট; প্রত্যেকের মাপ নিয়ে কাটলে একই থান কাপড়ে বেশি জামা হয়। তবে কাটার একটি নিয়ম আছে — বড় টুকরো আগে কাটতে হয়।

VLSM-এর চার ধাপ

  1. প্রতিটি চাহিদার জন্য সবচেয়ে ছোট block বের করুন: ২h − ২ ≥ host-সংখ্যা। Router-to-router link-এ ২টি host → /30 (৪টি ঠিকানা)।
  2. বড় থেকে ছোট সাজান (host নয়, block-এর মাপ ধরে)।
  3. মূল ব্লকের শুরু থেকে একটির পর একটি বসান — প্রতিটি block শুরু হবে তার নিজের মাপের গুণিতকে (aligned).
  4. যাচাই: শেষ block-এর broadcast মূল ব্লকের ভেতরে কি না, কোনো দুটি block ওভারল্যাপ করে কি না, আর বাকি খালি অংশ কোথায়।

উদাহরণ: একটি অফিসের জন্য 192.168.20.0/24. চাহিদা: Sales ১২০ জন, Accounts ৬০, HR ২৮, Mgmt (switch, প্রিন্টার, ক্যামেরা) ১২, আর অন্য তিন শাখার সাথে তিনটি point-to-point WAN link. মোট দরকার ১২৮ + ৬৪ + ৩২ + ১৬ + ৪ × ৩ = ২৫২, যা ২৫৬-এর মধ্যে — কাগজে আঁটে। এবার বসিয়ে দেখি:

বরাদ্দের টেবিল
Sales (120)
Accounts (60)
HR (28)
Mgmt (12)
WAN-1, 2, 3 (2 করে)
পরের খালি ঠিকানা
খরচ হলো
  1. মাপ ঠিক করে সাজানো। ১২০ host → ২৭ − ২ = ১২৬ ≥ ১২০, তাই /25. ৬০ → ৬২ (/26). ২৮ → ৩০ (/27). ১২ → ১৪ (/28). প্রতিটি WAN link-এ ২ → /30. বড় থেকে ছোট: /25, /26, /27, /28, /30, /30, /30. শুরু হবে 192.168.20.0 থেকে।
  2. Sales → 192.168.20.0/25. ১২৮-এর block, শুরু ০ (১২৮-এর গুণিতক ✔)। ব্যবহারযোগ্য .1–.126, broadcast .127. পরের খালি ঠিকানা ০ + ১২৮ = .128.
  3. Accounts → 192.168.20.128/26. ৬৪-এর block; ১২৮ নিজেই ৬৪-এর গুণিতক, তাই সরাসরি বসে। .129–.190, broadcast .191. পরের খালি .192.
  4. HR → 192.168.20.192/27. ১৯২ = ৬ × ৩২, aligned. .193–.222, broadcast .223. পরের খালি .224.
  5. Mgmt → 192.168.20.224/28. ২২৪ = ১৪ × ১৬, aligned. .225–.238, broadcast .239. পরের খালি .240.
  6. তিনটি WAN link → /30 করে। .240/30 (host .241, .242), .244/30 (.245, .246), .248/30 (.249, .250). প্রতিটি ৪-এর গুণিতকে। পরের খালি .252.
  7. যাচাই. খরচ ১২৮ + ৬৪ + ৩২ + ১৬ + ১২ = ২৫২, বাকি 192.168.20.252/30 — আরেকটি link-এর জায়গা। প্রতিটি block-এর broadcast পরের block-এর network-এর ঠিক আগে, তাই কোনো ফাঁক বা ওভারল্যাপ নেই। সাবধান: HR আর Mgmt-এ মাত্র ২টি করে বাড়তি ঠিকানা — বাস্তবে বৃদ্ধির জায়গা রাখা ভালো (অংশ ৮)।

বড়টি আগে কেন — একটি ছোট প্রমাণ

সব block-এর মাপ ২-এর ঘাত। বড় থেকে ছোট সাজালে, কোনো block (মাপ b) বসানোর সময় তার আগে বসানো সব block-এর মাপ ≥ b, আর ২-এর ঘাত বলে প্রত্যেকটি b-এর গুণিতক। তাদের যোগফলও তাই b-এর গুণিতক — অর্থাৎ “পরের খালি ঠিকানা” আপনা থেকেই b-এর সীমানায় পড়ে, কোনো ফাঁক রাখতে হয় না। এলোমেলো ক্রমে ভাবুন: আগে একটি /30 (.0–.3) বসালে Sales-এর /25 আর .0-তে বসতে পারে না, শুরু করতে হয় .128-এ। তখন “পরের খালি ঠিকানা” সোজা সামনে এগোলে বাকিদের জায়গাই থাকে না; মাঝের .4–.127-এর ১২৪টি ঠিকানা আলাদা করে খুঁজে ভরাতে হয়, আর সীমানা মেলাতে গিয়ে ফাঁক পড়ে — ভুল আর ওভারল্যাপের ঝুঁকিও বাড়ে। বড়টি আগে বসালে কোনো ফাঁক থাকে না, আর বাকি খালি জায়গা শেষে একটানা একটি block হয়ে থাকে। অপারেটিং সিস্টেমের buddy allocator-ও (contiguous allocation) একই কারণে ২-এর ঘাতে, সীমানা মেনে memory দেয়।

Point-to-point link: /30 নাকি /31?

দুই router-এর মাঝের একটি তারে মাত্র দুটি প্রান্ত। /30-এ ৪টি ঠিকানার মধ্যে ২টি (network আর broadcast) অপচয় — ৫০%. একটি দুই-প্রান্তের link-এ “সবাইকে broadcast”-এর আসলে কোনো দরকার নেই, তাই RFC 3021 (২০০০ সাল) প্রস্তাব করে, point-to-point link-এ /31 ব্যবহার করা যাবে: দুটি ঠিকানাই দুই প্রান্তের, network বা broadcast বলে আলাদা কিছু নেই। আধুনিক অনেক router আর Linux /31 সমর্থন করে, তবে সব যন্ত্র, পুরোনো firmware বা নিরীক্ষণ-সফটওয়্যার করে কি না, ব্যবহারের আগে যাচাই করা উচিত। পরীক্ষায় সাধারণত /30-ই প্রত্যাশিত, যদি না প্রশ্নে /31 বলা থাকে। আর একটিমাত্র যন্ত্রের ঠিকানা বোঝাতে /32 (host route) — যেমন router-এর loopback ঠিকানা।

নিচের planner একই চার ধাপ চালায়: চাহিদাগুলো যেকোনো ক্রমে দিলেও নিজে বড় থেকে ছোট সাজায়, প্রতিটি block-কে তার মাপের গুণিতকে বসায়, আর জায়গা না থাকলে স্পষ্ট জানায়। দ্বিতীয় উদাহরণে ইচ্ছে করে এমন চাহিদা দেওয়া হয়েছে যা একটি /24-এ আঁটে না।

// VLSM planner: biggest requirement first, every block aligned to its own size.
const toInt = ip => ip.split(".").reduce((a, o) => a * 256 + Number(o), 0);
const toIp = n => [24, 16, 8, 0].map(s => (n >>> s) & 255).join(".");
function prefixFor(hosts) {                 // smallest block with (size - 2) >= hosts
  let p = 30;
  while (2 ** (32 - p) - 2 < hosts) p--;
  return p;
}
function plan(base, reqs) {
  const [ip, bp] = base.split("/"), start = toInt(ip), end = start + 2 ** (32 - bp);
  let next = start;
  console.log(`\nBase ${base} = ${end - start} addresses`);
  for (const [name, hosts] of [...reqs].sort((a, b) => b[1] - a[1])) {
    const p = prefixFor(hosts), size = 2 ** (32 - p);
    next = start + Math.ceil((next - start) / size) * size;   // align to block size
    if (next + size > end) {
      console.log(`  ${name}: needs /${p} (${size}) but only ${end - next} left -> DOES NOT FIT`);
      continue;
    }
    console.log(`  ${name.padEnd(9)} ${String(hosts).padStart(3)} hosts -> ${toIp(next)}/${p}` +
      `  usable ${toIp(next + 1)}-${toIp(next + size - 2)}  bc ${toIp(next + size - 1)}` +
      `  spare ${size - 2 - hosts}`);
    next += size;
  }
  console.log(`  used ${next - start} of ${end - start}; ` +
    (next < end ? `free from ${toIp(next)}` : "nothing left"));
}
plan("192.168.20.0/24", [["Mgmt", 12], ["Sales", 120], ["WAN-1", 2], ["HR", 28],
  ["Accounts", 60], ["WAN-2", 2], ["WAN-3", 2]]);
plan("192.168.30.0/24", [["Floor-1", 100], ["Floor-2", 100], ["Floor-3", 50]]);

আউটপুট:

Base 192.168.20.0/24 = 256 addresses
  Sales     120 hosts -> 192.168.20.0/25  usable 192.168.20.1-192.168.20.126  bc 192.168.20.127  spare 6
  Accounts   60 hosts -> 192.168.20.128/26  usable 192.168.20.129-192.168.20.190  bc 192.168.20.191  spare 2
  HR         28 hosts -> 192.168.20.192/27  usable 192.168.20.193-192.168.20.222  bc 192.168.20.223  spare 2
  Mgmt       12 hosts -> 192.168.20.224/28  usable 192.168.20.225-192.168.20.238  bc 192.168.20.239  spare 2
  WAN-1       2 hosts -> 192.168.20.240/30  usable 192.168.20.241-192.168.20.242  bc 192.168.20.243  spare 0
  WAN-2       2 hosts -> 192.168.20.244/30  usable 192.168.20.245-192.168.20.246  bc 192.168.20.247  spare 0
  WAN-3       2 hosts -> 192.168.20.248/30  usable 192.168.20.249-192.168.20.250  bc 192.168.20.251  spare 0
  used 252 of 256; free from 192.168.20.252

Base 192.168.30.0/24 = 256 addresses
  Floor-1   100 hosts -> 192.168.30.0/25  usable 192.168.30.1-192.168.30.126  bc 192.168.30.127  spare 26
  Floor-2   100 hosts -> 192.168.30.128/25  usable 192.168.30.129-192.168.30.254  bc 192.168.30.255  spare 26
  Floor-3: needs /26 (64) but only 0 left -> DOES NOT FIT
  used 256 of 256; nothing left

প্রথম পরিকল্পনা হুবহু stepper-এর টেবিল: চাহিদা এলোমেলো ক্রমে দেওয়া (Mgmt আগে, Sales পরে), কিন্তু sort বড়টিকে আগে আনে। spare দেখায় কতটি ঠিকানা বাড়তি — Sales-এ ১২৬ − ১২০ = ৬. Math.ceil(…) * size লাইনটি alignment-এর নিরাপত্তা; বড় থেকে ছোট সাজানো থাকলে (ওপরের প্রমাণ অনুযায়ী) এটি কখনো ঠিকানা সরায় না। দ্বিতীয় পরিকল্পনায় ১০০ জনের দুটি তলা: প্রতিটির /25 লাগে (৬২ যথেষ্ট নয়), আর দুটি /25 মিলেই পুরো /24 শেষ — Floor-3-এর /26-এর জায়গা নেই। মোট চাহিদা ১০০ + ১০০ + ৫০ = ২৫০ ঠিকানা ২৫৬-এর কম দেখালেও block-এর মাপে লাগে ১২৮ + ১২৮ + ৬৪ = ৩২০। শিক্ষা: “host যোগ করে ২৫৬-এর কম” দেখে আঁটবে ধরে নেবেন না; block-এর মাপ যোগ করুন। সমাধান: একটি /23 নেওয়া, বা Floor-1 আর Floor-2-কে ১২৬-এর মধ্যে রাখা এবং ভবিষ্যৎ হিসাব করে বড় ব্লক চাওয়া।

৭ · Route summarisation — অনেক মহল্লা, এক ঠিকানা

এবার উল্টো কাজ: ভাগ করা নয়, জোড়া লাগানো। ধরুন চট্টগ্রাম শাখার router-এর পেছনে চারটি LAN: 172.16.4.0/24, 172.16.5.0/24, 172.16.6.0/24 আর 172.16.7.0/24. ঢাকার প্রধান অফিসের router-কে চারটি আলাদা লাইন না জানিয়ে এক লাইনে বলা যায়: “172.16.4.0/22 — সব আমার কাছে পাঠান”. একে বলে route summarisation বা route aggregation; যখন সারাংশটি একটি class-এর স্বাভাবিক সীমার চেয়েও বড় হয়, তখন পুরোনো নাম supernetting.

ঢাকা থেকে চট্টগ্রামগামী কুরিয়ারের বাছাইকারী প্রতিটি থানার নাম আলাদা মনে রাখেন না — “চট্টগ্রাম বিভাগ” লেখা বস্তায় সব ফেলে দেন। চট্টগ্রামের হাব পরে থানা ধরে ভাগ করে। কিন্তু বস্তায় “চট্টগ্রাম বিভাগ” লিখলে কক্সবাজারের চিঠিও তাতে ঢুকবে — চট্টগ্রামের হাব যদি কক্সবাজারে না পাঠাতে পারে, চিঠি সেখানে আটকে যাবে। Summarisation-এর লাভ আর বিপদ — দুটোই এই উপমায়।

পদ্ধতি — সাধারণ prefix খোঁজা

  1. নেটওয়ার্কগুলোকে binary-তে লিখুন (যে octet-এ পার্থক্য, শুধু সেটি লিখলেই চলে)।
  2. বাঁ দিক থেকে কতটি bit সবার এক — সেটিই নতুন prefix.
  3. বাকি bit ০ করে দিলে summary-র network address.
  4. যাচাই: summary-র মাপ (২৩২ − p) আর তালিকার নেটওয়ার্কগুলোর মোট মাপ সমান কি না। বেশি হলে summary বাড়তি ঠিকানাও ঢেকে ফেলছে।
তৃতীয় octet binary-তে (প্রথম দুই octet 172.16 সবার এক)
172.16.4.0
172.16.5.0
172.16.6.0
172.16.7.0
মিল bit
Summary
  1. Binary-তে লেখা। প্রথম দুই octet (172.16) চারটিতেই এক, তাই সেখানে ১৬ bit মিল নিশ্চিত। পার্থক্য তৃতীয় octet-এ: ৪ = 00000100, ৫ = 00000101, ৬ = 00000110, ৭ = 00000111.
  2. বাঁ থেকে মিল গোনা। চারটিরই প্রথম ৬টি bit 000001. সপ্তম bit-এ কারও ০, কারও ১ — এখানেই মিল শেষ। শেষ দুটি bit চারটি নেটওয়ার্কে 00, 01, 10, 11 — চারটি সম্ভাব্য মানই আছে।
  3. Prefix-এর দৈর্ঘ্য. ৮ (প্রথম octet) + ৮ (দ্বিতীয়) + ৬ (তৃতীয়-র মিল) = ২২। Mask 255.255.252.0 — তৃতীয় octet 11111100 = ২৫২।
  4. Summary-র network address. মিল bit রেখে বাকি সব ০: তৃতীয় octet 00000100 = ৪, চতুর্থ ০। তাই 172.16.4.0/22.
  5. নিখুঁত কি না যাচাই. /22-এর block তৃতীয় octet-এ ২৫৬ − ২৫২ = ৪; ৪ নিজেই ৪-এর গুণিতক, তাই সঠিক সীমানা। Summary ঢাকে 172.16.4.0–172.16.7.255 = ১,০২৪টি ঠিকানা, আর চারটি /24 মিলে ঠিক ৪ × ২৫৬ = ১,০২৪ — এক ঠিকানাও বাড়তি নয়।
  6. বিপদের রূপ. ধরুন 172.16.7.0/24 আসলে চট্টগ্রামে নেই — সেটি সিলেট শাখার। চট্টগ্রাম তবু 172.16.4.0/22 ঘোষণা করলে ঢাকার router 7.x-এর packet-ও চট্টগ্রামে পাঠাবে, যদি না সিলেট আরও নির্দিষ্ট 172.16.7.0/24 ঘোষণা করে (দীর্ঘতম prefix জেতে — পর্ব ২২)। নইলে সেই packet ভুল জায়গায় গিয়ে হারিয়ে যায় (black hole). একে বলে over-summarising.

চারটি /24 সবসময় /22 হয় না

এবার 192.168.1.0/24 থেকে 192.168.4.0/24. তৃতীয় octet: ১ = 00000001, ৪ = 00000100. মিল মাত্র প্রথম ৫ bit (00000), তাই prefix ৮ + ৮ + ৫ = /21, summary 192.168.0.0/21 — যা ঢাকে 0 থেকে 7, আটটি /24. কারণ? ১ থেকে ৪ একটি ৪-এর block নয় — /22-এর block শুরু হয় ৪-এর গুণিতকে (0, 4, 8…), আর ১–৪ দুটি block-এ ছড়ানো (0–3 আর 4–7). এখানে নিখুঁত summary এক লাইনে হয় না; ভালো বিকল্প হলো 192.168.1.0/24, 192.168.2.0/23 আর 192.168.4.0/24 — তিন লাইন, কিন্তু একটিও বাড়তি ঠিকানা নয়।

নিচের summariser প্রতিটি নেটওয়ার্কের পুরো ৩২ bit ছাপে, সাধারণ prefix গোনে, আর summary-র ভেতরের যে অংশ তালিকায় নেই তা সতর্কবার্তায় দেখায়।

// Route summarisation: longest common prefix of several networks + what else it covers.
const toInt = ip => ip.split(".").reduce((a, o) => a * 256 + Number(o), 0);
const toIp = n => [24, 16, 8, 0].map(s => (n >>> s) & 255).join(".");
const bin = n => n.toString(2).padStart(32, "0").match(/.{8}/g).join(".");
function summarize(list) {
  const nets = list.map(c => { const [ip, p] = c.split("/"); return [toInt(ip), Number(p)]; })
    .sort((a, b) => a[0] - b[0]);
  const first = nets[0][0];
  let p = Math.min(...nets.map(n => n[1]));
  while (p > 0 && nets.some(([n]) => (n ^ first) >>> (32 - p) !== 0)) p--;
  const size = 2 ** (32 - p), sum = p === 0 ? 0 : first - (first % size);
  console.log(`\n${list.join(", ")}`);
  nets.forEach(([n]) => console.log(`  ${bin(n)}  ${toIp(n)}`));
  console.log(`  common prefix = ${p} bits -> summary ${toIp(sum)}/${p}` +
    ` (${toIp(sum)} - ${toIp(sum + size - 1)}, ${size} addresses)`);
  let at = sum, extra = 0;                      // walk the block, report the gaps
  for (const [n, q] of nets) {
    if (n > at) { console.log(`  WARNING also covers ${toIp(at)} - ${toIp(n - 1)}`); extra += n - at; }
    at = Math.max(at, n + 2 ** (32 - q));
  }
  if (at < sum + size) { console.log(`  WARNING also covers ${toIp(at)} - ${toIp(sum + size - 1)}`); extra += sum + size - at; }
  console.log(extra ? `  ${extra} extra addresses not in the list` : "  exact summary: nothing extra");
}
summarize(["172.16.4.0/24", "172.16.5.0/24", "172.16.6.0/24", "172.16.7.0/24"]);
summarize(["192.168.1.0/24", "192.168.2.0/24", "192.168.3.0/24", "192.168.4.0/24"]);
summarize(["10.1.1.0/24", "10.1.6.0/24"]);

আউটপুট:

172.16.4.0/24, 172.16.5.0/24, 172.16.6.0/24, 172.16.7.0/24
  10101100.00010000.00000100.00000000  172.16.4.0
  10101100.00010000.00000101.00000000  172.16.5.0
  10101100.00010000.00000110.00000000  172.16.6.0
  10101100.00010000.00000111.00000000  172.16.7.0
  common prefix = 22 bits -> summary 172.16.4.0/22 (172.16.4.0 - 172.16.7.255, 1024 addresses)
  exact summary: nothing extra

192.168.1.0/24, 192.168.2.0/24, 192.168.3.0/24, 192.168.4.0/24
  11000000.10101000.00000001.00000000  192.168.1.0
  11000000.10101000.00000010.00000000  192.168.2.0
  11000000.10101000.00000011.00000000  192.168.3.0
  11000000.10101000.00000100.00000000  192.168.4.0
  common prefix = 21 bits -> summary 192.168.0.0/21 (192.168.0.0 - 192.168.7.255, 2048 addresses)
  WARNING also covers 192.168.0.0 - 192.168.0.255
  WARNING also covers 192.168.5.0 - 192.168.7.255
  1024 extra addresses not in the list

10.1.1.0/24, 10.1.6.0/24
  00001010.00000001.00000001.00000000  10.1.1.0
  00001010.00000001.00000110.00000000  10.1.6.0
  common prefix = 21 bits -> summary 10.1.0.0/21 (10.1.0.0 - 10.1.7.255, 2048 addresses)
  WARNING also covers 10.1.0.0 - 10.1.0.255
  WARNING also covers 10.1.2.0 - 10.1.5.255
  WARNING also covers 10.1.7.0 - 10.1.7.255
  1536 extra addresses not in the list

প্রথমটি নিখুঁত — stepper-এর /22, কোনো সতর্কবার্তা নেই। দ্বিতীয়টিতে prefix ২১ — ২,০৪৮টি ঠিকানার summary, যার মধ্যে তালিকার চারটি /24 মাত্র ১,০২৪; বাকি ১,০২৪টি (192.168.0.x আর 5.x–7.x) তালিকায় নেই। তৃতীয়টি সবচেয়ে বিপজ্জনক: মাত্র দুটি /24 (৫১২ ঠিকানা) জোড়া লাগাতে গিয়ে /21 — ২,০৪৮-এর মধ্যে ১,৫৩৬টি বাড়তি, তিন টুকরো ফাঁকে। কোডের মূল লাইন (n ^ first) >>> (32 - p): দুটি ঠিকানার XOR-এ যেখানে bit আলাদা সেখানে ১; ওপরের p-টি bit-এ কোনো ১ না থাকলে প্রথম p bit এক। Prefix এক এক করে কমিয়ে প্রথম যে p-তে সবাই মেলে, সেটিই দীর্ঘতম সাধারণ prefix.

! চট্টগ্রামের router: চারটি LAN-এর বদলে একটি summary ঘোষণা, আর নিজের কাছে
! যে অংশ নেই তার packet ফেলে দেওয়ার জন্য একটি discard (Null0) route
ip route 172.16.4.0 255.255.252.0 Null0
!
router ospf 1
 area 1 range 172.16.4.0 255.255.252.0     ! OSPF area সীমানায় summary (পর্ব ২৪)

এখানে Null0 route-টি একটি নিরাপত্তা-জাল: summary-র ভেতরের কোনো ঠিকানার জন্য আরও নির্দিষ্ট route না থাকলে packet সেখানেই ফেলে দেওয়া হয়, default route ধরে উল্টো ফেরত পাঠানো হয় না — নইলে দুই router-এর মাঝে packet ঘুরপাক খেতে পারে (routing loop). অনেক routing protocol summary বানালে নিজেই এমন discard route যোগ করে। এই নির্দিষ্ট route আর summary-র মাঝে কে জেতে, সেই longest prefix match-এর পুরো নিয়ম পর্ব ২২-এ।

৮ · Wildcard mask, মুখে মুখে হিসাবের টেবিল আর সাধারণ ভুল

Wildcard mask — উল্টো mask

Cisco IOS-এর ACL (access control list, পর্ব ৪৯) আর OSPF-এর network কমান্ডে mask-এর বদলে লেখা হয় wildcard mask: ২৫৫.২৫৫.২৫৫.২৫৫ থেকে subnet mask বিয়োগ। Wildcard-এ ০ মানে “এই bit মিলতে হবে”, ১ মানে “যা খুশি”. /27-এর mask 255.255.255.224 → wildcard 0.0.0.31; /20 → 0.0.15.255; /22 → 0.0.3.255.

access-list 10 permit 192.168.20.192 0.0.0.31     ! HR subnet (.192/27) অনুমোদিত
access-list 10 deny   any
!
router ospf 1
 network 192.168.20.0 0.0.0.255 area 0             ! এই /24-এর interface-গুলোতে OSPF

এটি vendor-নির্ভর প্রথা, সার্বজনীন standard নয়: Juniper, MikroTik বা Linux-এর nftables সাধারণত সরাসরি 192.168.20.192/27 লেখে। আর Cisco-র ACL-এ wildcard-এর ১ আর ০ একটানা না-ও হতে পারে (যেমন শুধু জোড় ঠিকানা মেলানো) — এটি subnet mask-এর সাথে মেলে না, তাই সাধারণ নকশায় এড়ানোই ভালো।

মুখে মুখে হিসাবের টেবিল

নিচের টেবিল মুখস্থ না করে বুঝে রাখুন — প্রতিটি সারি আগের সারির অর্ধেক। চতুর্থ octet-এর এই block size-গুলোই তৃতীয় octet-এ /16–/23 আর দ্বিতীয় octet-এ /8–/15-এর জন্য হুবহু একই (/17 → ১২৮, /20 → ১৬, /23 → ২…); শুধু host-সংখ্যায় ডানের octet-গুলোর bit যোগ হয়।

PrefixMaskBlockব্যবহারযোগ্য host/24-এ কয়টিWildcard
/24255.255.255.025625410.0.0.255
/25255.255.255.12812812620.0.0.127
/26255.255.255.192646240.0.0.63
/27255.255.255.224323080.0.0.31
/28255.255.255.2401614160.0.0.15
/29255.255.255.24886320.0.0.7
/30255.255.255.25242640.0.0.3
/31255.255.255.25422 (শুধু point-to-point, RFC 3021)1280.0.0.1
/32255.255.255.25511 (একটি host-এর route)2560.0.0.0

Mask-এর octet-এর মানগুলোও একটি সিঁড়ি: ১২৮, ১৯২, ২২৪, ২৪০, ২৪৮, ২৫২, ২৫৪, ২৫৫ — প্রতিবার বাঁ থেকে আরেকটি ১ যোগ (১২৮ + ৬৪ + ৩২ + …)। এই আটটি সংখ্যা আর “block = ২৫৬ − mask” — পরীক্ষার হলে এটুকুই যথেষ্ট।

Calculator ছাড়াও হিসাবটি একদম সাধারণ shell-এ করা যায়। নিচের script শুধু bash-এর নিজের পূর্ণসংখ্যার অঙ্ক $(( )) ব্যবহার করে — shift (<<), AND (&), OR (|), NOT (~) — কোনো বাইরের টুল লাগে না; শুধু শেষে দেখে নেয় ipcalc আছে কি না।

# Subnet math with bash arithmetic $(( )) only - no external tool needed.
ip2int() { local IFS=.; set -- $1; echo $(( ($1 << 24) | ($2 << 16) | ($3 << 8) | $4 )); }
int2ip() { local n=$1; echo "$(( (n >> 24) & 255 )).$(( (n >> 16) & 255 )).$(( (n >> 8) & 255 )).$(( n & 255 ))"; }
for cidr in 192.168.10.77/27 172.16.45.200/20; do
  ip=${cidr%/*}; p=${cidr#*/}
  x=$(ip2int "$ip")
  mask=$(( (0xFFFFFFFF << (32 - p)) & 0xFFFFFFFF ))
  net=$(( x & mask ))
  bc=$(( net | (~mask & 0xFFFFFFFF) ))
  echo "$cidr"
  echo "  mask      $(int2ip $mask)   wildcard $(int2ip $(( ~mask & 0xFFFFFFFF )))"
  echo "  network   $(int2ip $net)"
  echo "  broadcast $(int2ip $bc)"
  echo "  usable    $(int2ip $(( net + 1 ))) - $(int2ip $(( bc - 1 )))   hosts=$(( (1 << (32 - p)) - 2 ))"
done
if command -v ipcalc >/dev/null; then
  echo "ipcalc found - cross-check: ipcalc 192.168.10.77/27"
else
  echo "ipcalc not installed - bash arithmetic was enough"
fi

আসল রানের আউটপুট:

192.168.10.77/27
  mask      255.255.255.224   wildcard 0.0.0.31
  network   192.168.10.64
  broadcast 192.168.10.95
  usable    192.168.10.65 - 192.168.10.94   hosts=30
172.16.45.200/20
  mask      255.255.240.0   wildcard 0.0.15.255
  network   172.16.32.0
  broadcast 172.16.47.255
  usable    172.16.32.1 - 172.16.47.254   hosts=4094
ipcalc not installed - bash arithmetic was enough

ip2int-এ IFS=. দিয়ে ঠিকানাকে চার টুকরো করে প্রতিটিকে তার জায়গায় shift করে OR — 192 << 24 | 168 << 16 | …. bash-এর অঙ্ক ৬৪ bit-এর, তাই ~mask-এর ওপরের ৩২ bit-ও ১ হয়ে যায়; & 0xFFFFFFFF দিয়ে শুধু নিচের ৩২ bit রাখা হয়েছে। Wildcard কলামটি সরাসরি ~mask — 0.0.0.31 আর 0.0.15.255, ঠিক ওপরের টেবিলের মতো। ফলাফল JavaScript calculator-এর সাথে হুবহু এক।

সাধারণ ভুল আর নিজে যাচাইয়ের উপায়

ভুলউদাহরণকীভাবে ধরবেন
−২ ভুলে যাওয়া“/27-এ ৩২টি host”Host = block − ২; /31 আর /32 আলাদা নিয়ম
Block-এর সীমানা না মানা“192.168.20.100/27 একটি network”Network-এর আগ্রহের octet block-এর গুণিতক হতেই হবে; ১০০ ÷ ৩২ পূর্ণ সংখ্যা নয় — আসল network .96
ওভারল্যাপ192.168.20.0/25 আর 192.168.20.64/26 একসাথেসব subnet শুরু অনুযায়ী সাজিয়ে দেখুন: প্রতিটির broadcast পরেরটির network-এর চেয়ে ছোট কি না (/25 চলে .127 পর্যন্ত, .64 তার ভেতরে)
ভুল octet-এ হিসাব/20-এ চতুর্থ octet-এ block খোঁজাPrefix ÷ ৮: /20 তৃতীয় octet-এ শেষ
“শেষ octet ০ মানেই network”/20-এ 172.16.40.0-কে network ভাবাপুরো prefix দিয়ে AND করুন; /20-এ network .32.0
Broadcast-কে gateway বানানো/28 subnet .224-এ gateway .239Gateway ব্যবহারযোগ্য পরিসরে (.225–.238) হতে হবে
Host যোগ করে আঁটবে ধরা১০০ + ১০০ + ৫০ = ২৫০ ≤ ২৫৬Block-এর মাপ যোগ করুন: ১২৮ + ১২৮ + ৬৪ = ৩২০

তিনটি দ্রুত আত্মযাচাই: (১) network-এর আগ্রহের octet ÷ block = পূর্ণ সংখ্যা; (২) broadcast + ১ = পরের subnet-এর network; (৩) block = ২-এর ঘাত, আর host = block − ২. তারপর যন্ত্র দিয়ে মিলিয়ে নিন — যেমন Python-এর standard library:

$ python3 -c "import ipaddress as i; n=i.ip_interface('192.168.10.77/27').network; print(n, n.broadcast_address, n.num_addresses-2)"
192.168.10.64/27 192.168.10.95 30

IPv6-এ কী হয়? IPv6-এ ঠিকানা ১২৮ bit, আর একটি LAN subnet প্রায় সবসময় /64 — host-এর সংখ্যা গোনার প্রশ্নই ওঠে না, broadcast-ও নেই। সেখানে subnetting মানে মূলত prefix-এর /48 থেকে /64-এর মাঝের ১৬ bit কীভাবে শাখা আর VLAN-এ ভাগ হবে। বিস্তারিত পর্ব ২১-এ।

আরও গভীরে: Router প্রতিটি packet-এর জন্য “কোন prefix-এ পড়ে” খুঁজতে AND আর তুলনা লক্ষ লক্ষবার করে; বড় router-এ এই কাজ হয় TCAM নামের বিশেষ memory-তে বা trie-জাতীয় তথ্য-কাঠামোয় (Linux kernel-এর fib_trie, যা /proc/net/fib_trie-এ দেখা যায়; DSA-তে trie). Linux-এ একটি interface-এ 192.168.10.77/27 দিলে kernel নিজেই 192.168.10.64/27-এর একটি “connected” route বানায় আর broadcast .95 হিসাব করে নেয়। Public IPv4-এ বিশ্বজুড়ে routing table-এ সাধারণত /24-এর চেয়ে নির্দিষ্ট prefix গ্রহণ করা হয় না — এটি লিখিত standard নয়, বহু নেটওয়ার্কের প্রচলিত নীতি — তাই summarisation আর prefix-এর মাপ বাস্তবে ঠিক করে ইন্টারনেটে কতটা ছোট ব্লক “দেখা” যাবে।

পরীক্ষা ও ইন্টারভিউতে এই বিষয়ে প্রায়ই যা জিজ্ঞেস করা হয়:

  • /26-এ কতটি ব্যবহারযোগ্য host? — ২৬ − ২ = ৬২।
  • 172.16.45.200/20-এর network আর broadcast? — তৃতীয় octet-এ block ১৬: 172.16.32.0 আর 172.16.47.255.
  • VLSM-এ বড় subnet আগে কেন? — ২-এর ঘাতের block বড় থেকে ছোট বসালে প্রতিটি আপনা থেকে aligned হয়; উল্টো ক্রমে ফাঁক আর টুকরো তৈরি হয়।
  • 10.0.8.0/24 থেকে 10.0.11.0/24 summarise করুন। — 10.0.8.0/22 (৮ = 000010 00, ১১ = 000010 11, ২২ bit মিল)।
  • /27-এর wildcard mask? — 0.0.0.31 (২৫৫ − ২২৪ = ৩১)।

৯ · AI-এর যুগে subnetting — হিসাব আপনার, যাচাইও আপনার

AI-কে “192.168.20.0/24-এ ১২০, ৬০, ২৮, ১২ host-এর VLSM করে দিন” বললে কয়েক সেকেন্ডে একটি সুন্দর টেবিল পাবেন। ভাষার মডেল কিন্তু অঙ্ক কষে না — সম্ভাব্য লেখা তৈরি করে। তাই subnet-এর টেবিল দেখতে নিখুঁত হলেও তাতে একটি broadcast এক ঘর সরে যেতে পারে, বা দুটি subnet নিঃশব্দে ওভারল্যাপ করতে পারে। আর সেই টেবিল দিয়ে DHCP আর router কনফিগার করলে সমস্যা ধরা পড়ে সপ্তাহ পরে, যখন দুটি যন্ত্র একই ঠিকানা পায়।

AI-এর ভুলকেন ভুলকীভাবে ধরবেন
“/27-এ ৩২টি host” বা broadcast এক ঘর এদিক-ওদিক−২ বাদ, বা “পরের network − ১” ভুলঅংশ ৪-এর calculator বা ipcalc/Python দিয়ে প্রতিটি সারি আবার হিসাব
ছোট subnet আগে বসিয়ে, সীমানা না মেনে VLSMBlock ভুল ঠিকানায় শুরু হয় বা ওভারল্যাপ করে; সীমানা মানলেও মাঝে ফাঁক থাকেপ্রতিটি network ÷ তার block = পূর্ণ সংখ্যা কি না দেখুন
“এই চারটি /24 মিলে /22” সব ক্ষেত্রেশুরু ৪-এর গুণিতকে না হলে /22 হয় নাঅংশ ৭-এর summariser-এ বাড়তি ঠিকানার সতর্কবার্তা দেখুন
Cisco-র কমান্ড “সব router-এর জন্য”Wildcard, ip subnet-zero — vendor-নির্ভরনিজের যন্ত্রের vendor-এর ডকুমেন্টেশন
Linux-এ ifconfig eth0 netmask …পুরোনো net-tools; আধুনিক পদ্ধতি ip addr add 192.168.20.1/25 dev eth0man ip-address
বানানো RFC নম্বর (“/31-এর RFC 3201”)বিশ্বাসযোগ্য শোনায় কিন্তু ভুল; আসলটি RFC 3021rfc-editor.org-এ খুলে শিরোনাম মেলান
Public ঠিকানা দিয়ে উদাহরণ বা কনফিগারেশনঅন্য কারও ঠিকানা; ল্যাবে ব্যবহার করলে বিভ্রান্তিPrivate (RFC 1918) বা documentation ঠিকানা (192.0.2.0/24, RFC 5737) ব্যবহার করুন

AI-কে ঠিকানা-পরিকল্পনার কাজ দিলে যাচাইযোগ্য আকারে উত্তর চান:

আমার অফিসের জন্য 192.168.20.0/24 আছে। চাহিদা: Sales 120, Accounts 60, HR 28, Mgmt 12 host, আর তিনটি router-to-router link. ১. VLSM করো — বড় চাহিদা আগে, প্রতিটি block তার নিজের মাপের গুণিতকে শুরু হবে। ২. প্রতিটি সারিতে দাও: prefix, mask, network, প্রথম ও শেষ ব্যবহারযোগ্য, broadcast, বাড়তি ঠিকানা। ৩. প্রতিটি সারির জন্য দেখাও: network ÷ block size = পূর্ণ সংখ্যা, আর broadcast + 1 = পরের সারির network. ৪. কোনো দুটি subnet ওভারল্যাপ করে কি না নিজে পরীক্ষা করে লেখো, আর বাকি খালি অংশ কোথায় তা বলো। ৫. Link-এ /30 নাকি /31 ব্যবহার করবে, কারণসহ বলো; /31 আমার যন্ত্রে চলবে কি না নিশ্চিত না হলে স্পষ্ট বলো। ৬. শেষে Python-এর ipaddress module দিয়ে পুরো টেবিল যাচাইয়ের একটি ছোট script দাও।

AI-এর টেবিল ব্যবহারের আগে — চেকলিস্ট

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন।

প্র ০১Subnet-এর প্রথম আর শেষ ঠিকানা যন্ত্রকে দেওয়া হয় না কেন? তাহলে /31 কীভাবে এই নিয়ম ভাঙল?

প্রথম ঠিকানা (host-অংশ সব ০) হলো subnet-এর নিজের নাম। Routing table-এ লেখা থাকে “192.168.20.128/26 — ওই দিকে”; এখানে .128 কোনো যন্ত্র নয়, একটি পুরো মহল্লার পরিচয়। ঐতিহাসিকভাবে কিছু পুরোনো ব্যবস্থা (বিশেষত BSD-র পুরোনো সংস্করণ) সব-০ host-অংশকেও broadcast হিসেবে ব্যবহার করত, তাই এটি যন্ত্রকে দিলে বিভ্রান্তি হতো। শেষ ঠিকানা (host-অংশ সব ১) হলো directed broadcast — “এই subnet-এর সবাই”. কেউ 192.168.20.191-এ packet পাঠালে router তা পুরো Accounts subnet-এ ছড়িয়ে দিতে পারে। এটি যন্ত্রকে দিলে সেই যন্ত্রের জন্য পাঠানো প্রতিটি packet সবার কাছে যেত। RFC 950 আর পরে router-এর প্রয়োজনীয়তার দলিল RFC 1812 এই দুটি মানকে সংরক্ষিত রাখে।

এই নিয়মের একটি নিরাপত্তা-ইতিহাসও আছে। নব্বইয়ের দশকের শেষে “smurf” আক্রমণে আক্রমণকারী জাল উৎস-ঠিকানা দিয়ে কোনো নেটওয়ার্কের directed broadcast-এ ping পাঠাত; সেই subnet-এর শত শত যন্ত্র একসাথে শিকারের কাছে উত্তর পাঠাত। প্রতিরক্ষা হিসেবে RFC 2644 (১৯৯৯) বলে router ডিফল্টে বাইরে থেকে আসা directed broadcast ফরোয়ার্ড করবে না, আর আজকের router-এ এটি সাধারণত বন্ধ। Broadcast ঠিকানার ধারণা থেকে গেছে, কিন্তু তার অপব্যবহারের দরজা বন্ধ।

/31-এর ক্ষেত্রে যুক্তিটি সরল: দুই router-এর মাঝের তারে মাত্র দুটি প্রান্ত। “Subnet-এর সবাই” মানে শুধু অপর প্রান্ত — আলাদা broadcast ঠিকানার দরকারই নেই। অথচ /30-এ চারটির দুটি নষ্ট। বড় সেবাদাতার হাজার হাজার link-এ এই ৫০% অপচয় অনেক public ঠিকানা খায়। RFC 3021 (২০০০) তাই বলল, point-to-point link-এ /31-এর দুটি ঠিকানাই host, আর এমন link-এ broadcast পাঠাতে হলে 255.255.255.255 ব্যবহার হবে। নিয়মটি এক ধরনের ব্যতিক্রম, যা শুধু সেই নির্দিষ্ট প্রেক্ষাপটে বৈধ — LAN-এ /31 দিলে চলবে না।

মূল উপলব্ধি: “−২” কোনো গাণিতিক খেয়াল নয়; দুটি ঠিকানা দুটি আলাদা কাজের জন্য সংরক্ষিত — নাম আর সবাইকে ডাকা। যেখানে সেই কাজের দরকার নেই, সেখানে standard সচেতনভাবে ব্যতিক্রম দিয়েছে।

প্র ০২১৯৯৩ সালে class-ভিত্তিক ঠিকানা ছেড়ে CIDR-এ যেতে হলো কেন? এর সাথে subnetting আর summarisation-এর সম্পর্ক কী?

Class-এর যুগে প্রতিষ্ঠান ঠিকানা পেত তিন মাপে: class C (২৫৪ host), class B (৬৫,৫৩৪), class A (১ কোটি ৬৭ লাখের বেশি)। মাঝামাঝি কিছু নেই। ৩০০ যন্ত্রের একটি প্রতিষ্ঠানের জন্য C ছোট, তাই সে চাইত B — আর ৬৫ হাজারের বেশি ঠিকানার প্রায় সবটাই অব্যবহৃত পড়ে থাকত। নব্বইয়ের দশকের শুরুতে ইন্টারনেট দ্রুত বাড়তে থাকলে IETF-এ দুটি আশঙ্কা স্পষ্ট হলো: class B ঠিকানা কয়েক বছরের মধ্যে ফুরিয়ে যাবে, আর বিকল্প হিসেবে অনেক C দিলে ইন্টারনেটের মূল router-গুলোর routing table এত বড় হবে যে তখনকার router-এর memory আর CPU তা সামলাতে পারবে না।

CIDR (RFC 1519, ১৯৯৩) দুটি সমস্যার এক সমাধান দিল। প্রথমত, prefix যেকোনো দৈর্ঘ্যের — ৩০০ যন্ত্রের প্রতিষ্ঠান পায় একটি /23 (৫১০ host), পুরো B নয়। এটি আসলে subnetting-এর ধারণাকে প্রতিষ্ঠানের ভেতর থেকে পুরো ইন্টারনেটে নিয়ে যাওয়া। দ্বিতীয়ত, summarisation: একটি ISP একটি বড় ব্লক (ধরুন একটি /16) পেয়ে গ্রাহকদের তার ভেতরের ছোট ব্লক দেয়, আর বাকি ইন্টারনেটকে জানায় শুধু একটি লাইন — /16. শত গ্রাহক, routing table-এ একটি সারি। এর জন্যই ঠিকানা ভৌগোলিক বা সেবাদাতা অনুযায়ী ধারাবাহিক ব্লকে বিতরণ করার নীতি নেওয়া হয়।

CIDR সময় কিনেছিল, সমস্যা মেটায়নি। ১৯৯৬ সালের RFC 1918-এর private ঠিকানা আর NAT (পর্ব ১৯) আরও সময় দিল, আর দীর্ঘমেয়াদি উত্তর হলো IPv6 (পর্ব ২১)। তবু CIDR-এর ভাষাই আজ সর্বত্র — Linux-এর ip addr, cloud-এর VPC, firewall নিয়ম, সব জায়গায় /n. পরীক্ষায় class জানা দরকার ইতিহাস আর পুরোনো প্রশ্নের জন্য, কিন্তু বাস্তব হিসাবে class বলে কিছু নেই, আছে শুধু prefix-এর দৈর্ঘ্য।

মূল উপলব্ধি: CIDR একই সাথে ঠিকানা বাঁচানো (প্রয়োজনমতো মাপ) আর routing table ছোট রাখার (summarisation) কৌশল — দুটোরই গাণিতিক ভিত্তি এই পর্বের ২-এর ঘাতের block আর সাধারণ prefix.

প্র ০৩VLSM-এ “বড়টি আগে” না মানলে বাস্তবে কী ক্ষতি হয়? বছরের পর বছর ধরে বাড়তে থাকা একটি নেটওয়ার্কে এই সমস্যা কীভাবে দেখা দেয়?

কাগজের প্রশ্নে সব চাহিদা একসাথে জানা থাকে, তাই বড় থেকে ছোট সাজানো সহজ। বাস্তবে চাহিদা আসে ধীরে ধীরে: প্রথম বছরে একটি ছোট সার্ভার-রুম (/28), পরের বছর দুটি WAN link (/30), তারপর হঠাৎ ২০০ জনের নতুন কল সেন্টার (/24). প্রতিবার “পরের খালি জায়গা” থেকে বরাদ্দ দিলে পাঁচ বছর পরে মূল ব্লকটি দেখতে হয় একটি এলোমেলো দাবার বোর্ডের মতো। এর মধ্যে মোট খালি ঠিকানা হয়তো অনেক, কিন্তু কোনো একটানা, সঠিক সীমানায় থাকা বড় block আর নেই — একে বলে fragmentation. অপারেটিং সিস্টেমের memory-তেও ঠিক একই সমস্যা হয়, আর buddy allocator-এর সমাধানও একই: ২-এর ঘাত আর aligned block.

ক্ষতি তিন রকম। প্রথমত, নতুন বড় subnet-এর জন্য আরেকটি ব্লক নিতে হয়, যা আগেরটির সাথে মিলিয়ে summarise করা যায় না — প্রধান router-এর routing table-এ একটি শাখার জন্য অনেক লাইন। দ্বিতীয়ত, firewall নিয়ম জটিল হয়: “পুরো শাখা” বোঝাতে এক লাইনের বদলে দশ লাইন, আর প্রতিটি নতুন লাইনে ভুলের সুযোগ। তৃতীয়ত, renumbering-এর খরচ: পরে গুছিয়ে নিতে চাইলে যন্ত্রের ঠিকানা বদলাতে হয়, DHCP, DNS, firewall, প্রিন্টার, ক্যামেরা — সব জায়গায় একসাথে।

অভিজ্ঞ নেটওয়ার্ক পরিকল্পনাকারীরা তাই আগে থেকে জায়গা ভাগ করে রাখেন: মূল ব্লকের প্রথম অর্ধেক ব্যবহারকারী LAN-এর জন্য, পরের এক-চতুর্থাংশ সার্ভারের জন্য, শেষ ছোট অংশ link আর loopback ঠিকানার জন্য — প্রতিটি অংশের ভেতরে প্রবৃদ্ধির জন্য ফাঁকা জায়গা রেখে। আর প্রতিটি বরাদ্দ লিখে রাখেন একটি IPAM (IP Address Management) টুল বা অন্তত একটি স্প্রেডশিটে। Private ঠিকানায় (যেমন 10.0.0.0/8) জায়গা প্রচুর, তাই সেখানে প্রতিটি VLAN-কে একটি পূর্ণ /24 দেওয়া সাধারণ প্রথা — কিছু ঠিকানা অপচয় হয়, কিন্তু হিসাব সহজ আর বৃদ্ধি নিয়ে চিন্তা কম। Public IPv4-এ সেই বিলাসিতা নেই।

মূল উপলব্ধি: VLSM-এর “বড়টি আগে” নিয়মটি শুধু পরীক্ষার কৌশল নয়, দীর্ঘমেয়াদি নকশার নীতি: আগে জায়গা ভাগ করুন, সীমানা মানুন, বৃদ্ধির জায়গা রাখুন, আর সব লিখে রাখুন।

প্র ০৪Summarisation routing table ছোট রাখে — তাহলে ২০০৮ সালের YouTube-এর ঘটনায় একটি আরও নির্দিষ্ট prefix কীভাবে সারা বিশ্বে সমস্যা তৈরি করল?

Summarisation-এর লাভ বিশাল: কম route মানে router-এর কম memory, দ্রুত খোঁজা, আর ভেতরের একটি LAN বারবার চালু-বন্ধ হলেও (route flapping) বাইরের router-গুলোকে বারবার হিসাব বদলাতে হয় না — সমস্যা summary-র আড়ালে থেকে যায়। কিন্তু router যখন একটি গন্তব্যের জন্য একাধিক মিলে যাওয়া route পায়, তখন সে বেছে নেয় সবচেয়ে লম্বা prefix-এর route-টি (longest prefix match, পর্ব ২২)। এই নিয়মটিই summary-কে নিরাপদ করে — summary-র ভেতরের কোনো অংশ অন্য কোথাও থাকলে সেই নির্দিষ্ট route জিতে যায়। আবার এই নিয়মই অপব্যবহারের পথও খোলে।

২০০৮ সালের ফেব্রুয়ারিতে পাকিস্তান সরকার দেশের ভেতরে YouTube বন্ধের নির্দেশ দেয়। Pakistan Telecom দেশের ভেতরে YouTube-এর ঠিকানার traffic আটকাতে একটি আরও নির্দিষ্ট route (একটি /24) তৈরি করে, যা YouTube-এর নিজের ঘোষিত বড় ব্লকের ভেতরে পড়ে। ভুলবশত সেই route BGP (পর্ব ২৫) দিয়ে তাদের upstream সেবাদাতার কাছে চলে যায়, আর সেখান থেকে সারা বিশ্বে ছড়ায়। বিশ্বের router-গুলো দেখল দুটি route: YouTube-এর বড় summary আর Pakistan Telecom-এর নির্দিষ্ট /24 — longest prefix match অনুযায়ী জিতল /24. প্রায় দুই ঘণ্টা বিশ্বের বড় একটি অংশের YouTube-এর traffic চলে গেল ভুল জায়গায়। YouTube নিজেও আরও নির্দিষ্ট route ঘোষণা করে আর upstream সেবাদাতা ভুল ঘোষণাটি সরিয়ে নিলে পরিস্থিতি ঠিক হয়।

এই ঘটনা দেখায় summarisation একা নিরাপত্তা দেয় না। প্রতিরক্ষা এসেছে কয়েক স্তরে: সেবাদাতারা গ্রাহকের কাছ থেকে শুধু তাদের নিজস্ব prefix গ্রহণ করে (prefix filter), RPKI দিয়ে যাচাই হয় কোন প্রতিষ্ঠান কোন prefix ঘোষণার অধিকারী, আর অনেক নেটওয়ার্ক বিশ্বব্যাপী /24-এর চেয়ে নির্দিষ্ট IPv4 prefix গ্রহণ করে না। প্রতিষ্ঠানের ভেতরেও একই শিক্ষা: summary বানানোর আগে জেনে নিন তার ভেতরের কোন অংশ আসলে কোথায়, আর না-থাকা অংশের জন্য discard route রাখুন।

মূল উপলব্ধি: Summary আর নির্দিষ্ট route-এর সম্পর্ক “বড় বস্তা আর ছোট খাম”-এর মতো — ছোট খামের ঠিকানা সবসময় জেতে। এটিই নমনীয়তার উৎস, আর এটিই ভুল বা অপব্যবহারের পথ; তাই কে কোন prefix ঘোষণা করতে পারবে, তার নিয়ন্ত্রণ জরুরি।

প্র ০৫একটি বাংলাদেশি প্রতিষ্ঠান — ধরুন ঢাকায় প্রধান কার্যালয় আর জেলায় জেলায় ৪০টি শাখা — তার ঠিকানা-পরিকল্পনা কীভাবে সাজাবে যাতে দশ বছর পরেও কাজ চলে?

প্রথম সিদ্ধান্ত: ভেতরের নেটওয়ার্ক private ঠিকানায় (RFC 1918), সবচেয়ে বড় ব্লক 10.0.0.0/8 থেকে — ১ কোটি ৬৭ লাখের বেশি ঠিকানা, তাই কৃপণ হওয়ার দরকার নেই। 192.168.0.0/16 এড়ানো ভালো, কারণ কর্মীদের বাসার router-ও প্রায়ই 192.168.0.x বা 192.168.1.x ব্যবহার করে; বাসা থেকে VPN-এ যুক্ত হলে একই subnet দুই দিকে থাকলে routing গুলিয়ে যায়।

দ্বিতীয় সিদ্ধান্ত: অঞ্চল ধরে summarise করার মতো কাঠামো। ধরুন প্রতিটি বিভাগকে একটি /16: ঢাকা বিভাগ 10.1.0.0/16, চট্টগ্রাম 10.2.0.0/16, রাজশাহী 10.3.0.0/16… প্রতিটি শাখা তার বিভাগের ভেতরে একটি /20 (৪,০৯৪ host-এর জায়গা, বা ১৬টি /24 VLAN) — একটি /16-এ ১৬টি শাখার জায়গা। শাখার ভেতরে প্রতিটি VLAN একটি /24, আর VLAN নম্বর তৃতীয় octet-এর সাথে মিলিয়ে। ফলে প্রধান কার্যালয়ের router-এ প্রতিটি বিভাগ মাত্র এক লাইন, আর ঠিকানা দেখেই বোঝা যায় যন্ত্রটি কোন বিভাগের কোন শাখার কোন VLAN-এর।

তৃতীয়: আলাদা ব্লক আলাদা কাজের জন্য — WAN link (/30 বা /31) আর router-এর loopback (/32) একটি নির্দিষ্ট ছোট ব্লকে, সার্ভার আর data center আরেকটিতে, VPN ব্যবহারকারী আরেকটিতে। এতে firewall-এর নিয়ম লেখা যায় “সব শাখার ব্যবহারকারী → সার্ভার ব্লক” এক লাইনে। চতুর্থ: বৃদ্ধির জায়গা — প্রতিটি স্তরে অর্ধেক খালি রেখে শুরু করা। শাখা ৪০ থেকে ৮০ হলেও কাঠামো বদলাতে হয় না। পঞ্চম: প্রতিটি বরাদ্দ লিখে রাখা — কোন ব্লক কার, কবে, কোন VLAN — IPAM টুলে। আর সমান্তরালে IPv6-এর পরিকল্পনাও শুরু করা ভালো, যেখানে প্রতিটি শাখা একটি /48 বা /56 আর প্রতিটি VLAN একটি /64 পায় (পর্ব ২১)।

মূল উপলব্ধি: ভালো ঠিকানা-পরিকল্পনা সংগঠনের কাঠামোর প্রতিচ্ছবি — বিভাগ, শাখা, VLAN — যাতে প্রতিটি স্তর এক লাইনে summarise হয়, আর ভবিষ্যতের বৃদ্ধি আগেই জায়গা পায়। Subnetting-এর অঙ্ক এক মিনিটের; পরিকল্পনার ভুল সারাতে বছর লাগে।

অনুশীলন

খাতা-কলম নিন — পরীক্ষার হলের মতো, calculator ছাড়া। তারপর ওপরের কোড দিয়ে মিলিয়ে নিন।

  1. পূর্ণ হিসাব (তৃতীয় octet): একটি host-এর ঠিকানা 172.20.137.85/19. (ক) subnet mask, (খ) network address, (গ) broadcast address, (ঘ) প্রথম ও শেষ ব্যবহারযোগ্য ঠিকানা, (ঙ) ব্যবহারযোগ্য host-এর সংখ্যা, (চ) 172.20.0.0/16-কে /19-এ ভাগ করলে কতটি subnet হয়?

    (ক) /19 = ৮ + ৮ + ৩; তৃতীয় octet-এ 11100000 = ২২৪, তাই mask 255.255.224.0.

    (খ) তৃতীয় octet-এ block = ২৫৬ − ২২৪ = ৩২। সিঁড়ি 0, 32, 64, 96, 128, 160… — ১৩৭ আছে ১২৮ আর ১৬০-এর মাঝে। Network 172.20.128.0. (Binary যাচাই: ১৩৭ = 10001001, AND 11100000 = 10000000 = ১২৮।)

    (গ) পরের network 172.20.160.0 − ১ = 172.20.159.255.

    (ঘ) প্রথম 172.20.128.1, শেষ 172.20.159.254.

    (ঙ) h = ৩২ − ১৯ = ১৩; ২১৩ − ২ = ৮,১৯০.

    (চ) /16 থেকে /19 — s = ৩, তাই ২৩ = ৮টি subnet (subnet zero ব্যবহার করে)।

  2. সমান মাপের subnetting: একটি কোম্পানি 192.168.100.0/24 পেয়েছে। যত বেশি সম্ভব subnet চাই, প্রতিটিতে অন্তত ২৫টি host. (ক) prefix আর mask কত, কতটি subnet? (খ) পঞ্চম subnet-এর network, ব্যবহারযোগ্য পরিসর আর broadcast কত? (গ) 192.168.100.200 ঠিকানাটি কোন subnet-এ, আর সেটি কি ওই subnet-এর gateway হিসেবে ব্যবহার করা যায়?

    (ক) ২h − ২ ≥ ২৫ → h = ৫ (৩০টি host); prefix ৩২ − ৫ = /27, mask 255.255.255.224, s = ৩ → ৮টি subnet.

    (খ) Block ৩২: subnet-গুলো .0, .32, .64, .96, .128… প্রথমটিকে ১ ধরে গুনলে পঞ্চমটি 192.168.100.128/27; ব্যবহারযোগ্য .129–.158, broadcast .159.

    (গ) ২০০ আছে ১৯২ আর ২২৪-এর মাঝে → 192.168.100.192/27 (সপ্তম subnet), ব্যবহারযোগ্য .193–.222, broadcast .223. .200 ব্যবহারযোগ্য পরিসরে, তাই হ্যাঁ — gateway হতে পারে, যদিও রীতি অনুযায়ী প্রায়ই প্রথমটি (.193) gateway করা হয়। (সাবধান: প্রশ্নে “পঞ্চম” যদি ০ থেকে গোনা হয়, উত্তর হবে .160 — পরীক্ষায় কোন গণনা ধরলেন তা লিখে দিন।)

  3. আউটপুট অনুমান করুন (VLSM): অংশ ৬-এর vlsm_planner.js-এর শেষ দুটি plan(…) লাইন মুছে লেখা হলো plan("10.10.0.0/22", [["Staff", 500], ["Lab", 200], ["Library", 100], ["Admin", 50], ["Link-1", 2], ["Link-2", 2]]);. চালানোর আগে প্রতিটি সারির prefix, network, broadcast আর শেষ লাইনটি খাতায় লিখুন।
    Base 10.10.0.0/22 = 1024 addresses
      Staff     500 hosts -> 10.10.0.0/23  usable 10.10.0.1-10.10.1.254  bc 10.10.1.255  spare 10
      Lab       200 hosts -> 10.10.2.0/24  usable 10.10.2.1-10.10.2.254  bc 10.10.2.255  spare 54
      Library   100 hosts -> 10.10.3.0/25  usable 10.10.3.1-10.10.3.126  bc 10.10.3.127  spare 26
      Admin      50 hosts -> 10.10.3.128/26  usable 10.10.3.129-10.10.3.190  bc 10.10.3.191  spare 12
      Link-1      2 hosts -> 10.10.3.192/30  usable 10.10.3.193-10.10.3.194  bc 10.10.3.195  spare 0
      Link-2      2 hosts -> 10.10.3.196/30  usable 10.10.3.197-10.10.3.198  bc 10.10.3.199  spare 0
      used 968 of 1024; free from 10.10.3.200

    যুক্তি: ৫০০ → ২৯ − ২ = ৫১০ ≥ ৫০০, তাই /23 (৫১২ ঠিকানা, তৃতীয় octet-এ block ২: 10.10.0.0–10.10.1.255). ২০০ → /24 (২৫৪), শুরু 10.10.2.0. ১০০ → /25, 10.10.3.0. ৫০ → /26 (৬২), 10.10.3.128. দুটি /30: .192 আর .196. মোট ৫১২ + ২৫৬ + ১২৮ + ৬৪ + ৮ = ৯৬৮; বাকি ৫৬টি ঠিকানা 10.10.3.200 থেকে। খেয়াল করুন /23-এর ভেতরে 10.10.0.255 আর 10.10.1.0 সাধারণ host ঠিকানা — broadcast নয়। Lab-এর বাড়তি ৫৪টি দেখাচ্ছে ২০০ জনের জন্য /24 কিছুটা ঢিলে, কিন্তু /25-এর ১২৬ যথেষ্ট নয়।

  4. Summarisation আর wildcard: একটি শাখা router-এর পেছনে আটটি LAN: 192.168.32.0/24 থেকে 192.168.39.0/24. (ক) একটি summary route লিখুন, mask আর wildcard mask-সহ। (খ) 192.168.40.5 কি এই summary-র ভেতরে? (গ) পরে 192.168.39.0/24 অন্য শাখায় সরিয়ে নেওয়া হলো, কিন্তু এই শাখা একই summary ঘোষণা করছে — কী ঘটবে, আর দুটি সমাধান বলুন।

    (ক) তৃতীয় octet: ৩২ = 00100000, ৩৯ = 00100111. প্রথম ৫ bit (00100) সবার এক, তাই prefix ৮ + ৮ + ৫ = /21. Summary 192.168.32.0/21, mask 255.255.248.0, wildcard 0.0.7.255. যাচাই: block ৮ (২৫৬ − ২৪৮), ৩২ = ৪ × ৮ ✔; ঢাকে 32.0–39.255 = ২,০৪৮ = ৮ × ২৫৬ — নিখুঁত।

    (খ) ৪০ = 00101000; প্রথম ৫ bit 00101 ≠ 00100. না — ৪০ পরের /21 block-এর (40–47) শুরু।

    (গ) Summary এখনো 39.x-এর traffic এই শাখার দিকে টানবে। নতুন শাখা যদি 192.168.39.0/24 আলাদাভাবে ঘোষণা করে, longest prefix match-এ /24 জিতবে আর traffic ঠিক জায়গায় যাবে (পর্ব ২২); না করলে packet এই শাখায় এসে হারাবে (বা discard route থাকলে ফেলে দেওয়া হবে)। সমাধান ১: এই শাখার summary বদলে 192.168.32.0/22 + 192.168.36.0/23 + 192.168.38.0/24 — তিনটি নিখুঁত লাইন। সমাধান ২: summary রেখে নতুন শাখা থেকে নির্দিষ্ট /24 ঘোষণা নিশ্চিত করা। পরিচ্ছন্নতার জন্য প্রথমটিই ভালো।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমএকটি মূল ব্লক থেকে VLSM পরিকল্পনা — ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. প্রতিটি চাহিদার জন্য সবচেয়ে ছোট block বের করা, যাতে ২h − ২ ≥ host
  2. Block-গুলোকে বড় থেকে ছোট সাজানো
  3. মূল ব্লকের শুরু থেকে সবচেয়ে বড় block বসানো
  4. পরের block-কে আগেরটির broadcast-এর ঠিক পরে, নিজের মাপের গুণিতকে বসানো
  5. ওভারল্যাপ নেই আর শেষ broadcast মূল ব্লকের ভেতরে — যাচাই করে খালি অংশ লিখে রাখা

একটি /27 subnet-এ কতটি ঠিকানা যন্ত্রকে দেওয়া যায়?

  • ৩২
  • ৩০
  • ৬২
  • ২৭

একটি host-এর ঠিকানা 192.168.10.77/27. এর network address কোনটি?

  • 192.168.10.0
  • 192.168.10.95
  • 192.168.10.64
  • 192.168.10.96

172.16.45.200/20 ঠিকানাটি যে subnet-এ, তার broadcast address কোনটি?

  • 172.16.47.255
  • 172.16.45.255
  • 172.16.48.0
  • 172.16.255.255

দুটি যন্ত্র: 10.1.1.10 আর 10.1.2.20, দুজনেরই mask /22. নিচের কোনটি সঠিক?

  • তৃতীয় octet আলাদা (১ আর ২), তাই তারা আলাদা subnet-এ
  • তারা একই subnet-এ, কিন্তু কথা বলতে gateway লাগবে
  • দুজনের network 10.1.1.0 আর 10.1.2.0
  • তারা একই subnet 10.1.0.0/22-এ, router ছাড়াই সরাসরি কথা বলবে

10.0.8.0/24, 10.0.9.0/24, 10.0.10.0/24 আর 10.0.11.0/24 — চারটি নেটওয়ার্কের সবচেয়ে ছোট নিখুঁত summary কোনটি?

  • 10.0.0.0/16
  • 10.0.8.0/22
  • 10.0.8.0/21
  • 10.0.8.0/23

VLSM-এ একটি LAN-এ ৫০টি যন্ত্র আছে। অপচয় সবচেয়ে কম রেখে কোন prefix দেওয়া উচিত?

  • /27
  • /25
  • /26
  • /28

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. s-টি bit ধার → ২sটি subnet; h-টি host bit → ২h − ২টি host. −২ = network (সব ০) আর broadcast (সব ১); ব্যতিক্রম শুধু /31 (point-to-point, RFC 3021) আর /32.
  2. Block = ২৫৬ − mask-এর আগ্রহের octet. Host যে দুই গুণিতকের মাঝে, নিচেরটি network, পরেরটি − ১ broadcast. Binary AND একই উত্তর দেয় — একটি দিয়ে হিসাব, অন্যটি দিয়ে যাচাই।
  3. তৃতীয় বা দ্বিতীয় octet-এ একই নিয়ম, ডানের octet network-এ ০, broadcast-এ ২৫৫; শূন্যে শেষ ঠিকানা মানেই network নয়।
  4. VLSM: বড় block আগে, প্রতিটি নিজের মাপের গুণিতকে। Host নয়, block-এর মাপ যোগ করে দেখুন আঁটে কি না।
  5. Summary = দীর্ঘতম সাধারণ prefix; মাপ মিলিয়ে দেখুন বাড়তি ঠিকানা ঢুকল কি না। Wildcard = ২৫৫.২৫৫.২৫৫.২৫৫ − mask, Cisco-ধাঁচের ACL/OSPF-এ।

পরের পর্বে: ঠিকানা-পরিকল্পনা তো হলো — এবার যন্ত্র নিজের ঠিকানা পায় কীভাবে? DHCP-র চার ধাপ (DORA), আর একই subnet-এর যন্ত্রের MAC খুঁজে বের করার ARP — এই পর্বের “একই subnet কি না” প্রশ্নের পরের ধাপ।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান