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

Link state routing — Dijkstra আর OSPF

Link-State Routing — LSA Flooding, Dijkstra's Shortest Paths and OSPF in Practice

Taught in Bangla, this lesson covers link-state routing: neighbour discovery with hellos, link costs, LSAs with sequence numbers and age, and reliable flooding into an identical database. It works Dijkstra's algorithm step by step with the exam-style N', D(v), p(v) table to build a shortest path tree and forwarding table, then shows OSPF in practice: protocol 89, timers, neighbour states, areas and DR election.

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

  • Link state-এর মূল ধারণা আর চারটি ধাপ — hello, cost, LSA আর sequence number-সহ flooding
  • Dijkstra-র algorithm হাতে চালানো: N′/D(v),p(v) টেবিল থেকে forwarding table — পরীক্ষার ধরনে, প্রমাণসহ
  • জটিলতা O(n²) আর O((E+V) log V), আর load-নির্ভর cost-এ oscillation কেন হয়
  • OSPF বাস্তবে: timer, neighbour state, DR/BDR নির্বাচন, cost-এর হিসাব, area, ABR, ASBR, LSA type আর authentication
  • IS-IS, distance vector-এর সাথে তুলনা, আর SDN-এর কেন্দ্রীয় হিসাবের সাথে সম্পর্ক

১ · মূল ধারণা — প্রতিটি router-এর হাতে পুরো মানচিত্র

পর্ব ২২-এ দেখেছেন, routing-এর কাজ প্রতিটি router-এর routing table ভরা — কোন গন্তব্যের packet কোন next hop-এ যাবে। কাজটি স্বয়ংক্রিয়ভাবে করার দুটি বড় ঘরানা আছে। পর্ব ২৩-এর distance vector-এ প্রতিটি router শুধু প্রতিবেশীদের কাছ থেকে শোনে, “আমার হিসাবে অমুক জায়গা এত দূরে”. পুরো নেটওয়ার্ক কেমন, তা কেউ জানে না। এই পর্বের ঘরানাটি উল্টো: প্রতিটি router পুরো নেটওয়ার্কের মানচিত্র জানে, তারপর নিজে নিজে সবচেয়ে ছোট পথ হিসাব করে। এর নাম link state routing.

ধরুন ঢাকার প্রতিটি ট্রাফিক বক্সে পুলিশ বসে আছেন। Distance vector পদ্ধতিতে পাশের মোড়ের পুলিশ ওয়াকিটকিতে বলেন, “আমার এখান থেকে গুলশান ১৫ মিনিট”. আপনি সেই কথা বিশ্বাস করে নিজের হিসাব বানান — পুরো শহর না দেখেই। Link state পদ্ধতিতে প্রতিটি বক্স শুধু নিজের চারপাশের রাস্তার খবর ছাপিয়ে সব বক্সে পাঠায়: “আমার মোড় থেকে বনানীর রাস্তা খোলা, ৫ মিনিট; মহাখালীর রাস্তা বন্ধ”. সব বক্সের নোটিশ জোড়া দিলে প্রত্যেকের হাতে পুরো শহরের একই মানচিত্র। তারপর প্রতিটি বক্স নিজেই মানচিত্রে আঙুল রেখে সবচেয়ে কম সময়ের পথ বের করে।

নেটওয়ার্ককে graph হিসেবে দেখা

Routing algorithm-এর চোখে নেটওয়ার্ক একটি graph: প্রতিটি router একটি node, প্রতিটি link একটি edge, আর প্রতিটি edge-এর একটি সংখ্যা — link cost. Cost কী দিয়ে ঠিক হবে, তা নেটওয়ার্ক প্রশাসকের সিদ্ধান্ত: গতি কম হলে বেশি cost, দামি বা দূরের link হলে বেশি cost, অথবা সব link-এর cost ১ (তখন “সবচেয়ে ছোট পথ” মানে সবচেয়ে কম hop). একটি পথের cost = পথের সব link-এর cost-এর যোগফল। Graph-এর মৌলিক ধারণা DSA কোর্সের Graph পর্বে আছে।

পুরো পর্বে আমরা এই ৬টি router-এর নেটওয়ার্ক ব্যবহার করব (পাঠ্যবইয়ে বহুল ব্যবহৃত একটি উদাহরণ; প্রতিটি সংখ্যা link-এর cost, আর link দুই দিকেই একই cost):

        ┌──────────── 5 ────────────┐
        │                           │
        │      v ─────── 3 ──────── w
        │     ╱ │                ╱  │ ╲
        │    2  │ 2           3     │ 1 ╲ 5
        │   ╱   │          ╱        │     ╲
        u       │       ╱           │       z
          ╲     │    ╱              │     ╱
           1    │ ╱                 │   2
             ╲  │╱                  │ ╱
                x ─────── 1 ─────── y

 Link: u-v 2, u-x 1, u-w 5, v-x 2, v-w 3, x-w 3, x-y 1, w-y 1, w-z 5, y-z 2

প্রশ্ন: u থেকে প্রতিটি router-এ যাওয়ার সবচেয়ে কম cost-এর পথ কোনটি, আর তাই u-এর forwarding table-এ কোন গন্তব্যের জন্য কোন link? Link state routing এই প্রশ্নের উত্তর দেয় দুই ভাগে — আগে মানচিত্র জোগাড় (অংশ ২), তারপর হিসাব (অংশ ৩)।

মূল ধারণা

Distance vector: “প্রতিবেশীকে পুরো নেটওয়ার্ক সম্পর্কে নিজের মত বলা”. Link state: “পুরো নেটওয়ার্ককে শুধু নিজের প্রতিবেশীদের খবর বলা”. প্রথমটিতে অল্প খবর যায় অল্প দূরে, দ্বিতীয়টিতে ছোট খবর যায় সবার কাছে। এই এক বাক্যেই দুই ঘরানার পার্থক্য।

২ · মানচিত্র জোগাড়ের চার ধাপ — hello, cost, LSA আর flooding

প্রতিটি router-কে চারটি কাজ করতে হয়, তারপর পঞ্চম কাজ হিসাব:

১. প্রতিবেশী খোঁজা

প্রতিটি interface-এ নিয়মিত ছোট hello বার্তা পাঠানো। অন্য প্রান্তের router-ও hello পাঠালে বোঝা যায় সেখানে একজন প্রতিবেশী আছে। নির্দিষ্ট সময় hello না এলে ধরা হয় প্রতিবেশী বা link মরে গেছে।

“কেউ আছেন?”

২. Link cost ঠিক করা

প্রতিটি link-এর একটি সংখ্যা। বাস্তবে প্রায় সবসময় প্রশাসকের বসানো বা গতি থেকে হিসাব করা স্থির মান (OSPF-এ bandwidth থেকে, অংশ ৬)। বর্তমান ভিড় দেখে cost বদলানো বিপজ্জনক — অংশ ৪-এ দেখবেন কেন।

কোন রাস্তা কত “দামি”

৩. LSA বানানো

নিজের নাম (router ID), একটি sequence number, একটি age, আর প্রতিটি প্রতিবেশী ও তার link-এর cost — এই নিয়ে একটি ছোট বার্তা: link-state advertisement. Link-এর অবস্থা বদলালে নতুন LSA, নতুন sequence number.

“আমার চারপাশ এমন”

৪. Reliable flooding

LSA প্রতিটি router-এর কাছে পৌঁছাতে হবে — একটিও বাদ গেলে তার মানচিত্র ভুল। প্রতিটি router নতুন LSA পেলে রাখে, প্রেরককে ack পাঠায়, আর বাকি সব প্রতিবেশীকে পাঠায়; পুরোনো বা একই LSA ফেলে দেয়।

সবার কাছে, নিশ্চিতভাবে

পঞ্চম ধাপ: যখন সব LSA জমা হয়, প্রতিটি router-এর link-state database (LSDB)-তে পুরো graph থাকে। তখন প্রতিটি router নিজেকে উৎস ধরে Dijkstra চালায় (অংশ ৩)। লক্ষ করুন, একটি LSA-তে কী থাকে — router x-এর LSA দেখতে মোটামুটি এমন:

┌─────────────────────────────────────────────┐
│ Advertising router : x                      │
│ Sequence number    : 0x80000005             │
│ Age                : 0 s  (বাড়তে থাকবে)       │
├─────────────────────────────────────────────┤
│ Neighbour u  cost 1                         │
│ Neighbour v  cost 2                         │
│ Neighbour w  cost 3                         │
│ Neighbour y  cost 1                         │
└─────────────────────────────────────────────┘

৬টি router-এর ৬টি এমন LSA জোড়া দিলেই অংশ ১-এর পুরো ছবি। প্রতিটি link দুই প্রান্তের দুটি LSA-তেই আসে; বাস্তবে দুই দিকের ঘোষণা মিললে তবেই link-টি হিসাবে ধরা হয়।

Flooding-এর নিয়ম — sequence number কেন লাগে

Flooding শুনতে সরল: নতুন কিছু পেলে সবাইকে জানানো। কিন্তু জালের মতো নেটওয়ার্কে একই LSA অনেক পথে ঘুরে একই router-এ বারবার আসে। আবার পথে দেরি হওয়া একটি পুরোনো কপি নতুনটির পরে পৌঁছাতে পারে। Router কীভাবে জানবে কোনটি নতুন? উত্তর sequence number: প্রতিটি router নিজের প্রতিটি নতুন LSA-তে নম্বর এক বাড়ায়। গ্রাহক router-এর নিয়ম মাত্র তিনটি:

আগত LSA-র sequence, নিজের কপির তুলনায়কী করেকেন
বড় (বা কপিই নেই)Database-এ রাখে, প্রেরককে ack, আসা interface বাদে সব প্রতিবেশীকে পাঠায়, Dijkstra আবার চালায়নতুন খবর — সবার জানা দরকার
সমানফেলে দেয় (শুধু ack)একই খবরের আরেক কপি; আবার পাঠালে অনন্তকাল ঘুরত
ছোটফেলে দেয়, আর নিজের নতুন কপিটি প্রেরককে ফেরত পাঠায়প্রেরকের কাছে পুরোনো খবর — তাকে হালনাগাদ করা

অফিসের নোটিশ বোর্ডের কথা ভাবুন। প্রতিটি নোটিশে একটি স্মারক নম্বর। নতুন নোটিশ এলে আপনি দেখেন বোর্ডে যেটি আছে তার নম্বর কত। নতুনটির নম্বর বড় হলে পুরোনোটি সরিয়ে নতুনটি লাগান, আর পাশের বিভাগেও একটি কপি পাঠান। একই নম্বরের কপি আবার এলে ফেলে দেন। আর কেউ পুরোনো নম্বরের নোটিশ নিয়ে এলে তাঁকে বলেন, “এটি বাতিল, নতুনটি এই নিন।”

Reliable শব্দটির মানে: প্রতিটি LSA পাঠানোর পর প্রেরক ack-এর অপেক্ষা করে; নির্দিষ্ট সময়ে ack না এলে আবার পাঠায় (OSPF-এ এই সময় ডিফল্টে ৫ সেকেন্ড — vendor অনুযায়ী বদলানো যায়)। এটি পর্ব ১০-এর ARQ-র ধারণাই, শুধু প্রতিটি প্রতিবেশীর সাথে আলাদাভাবে।

Age কেন লাগে

প্রতিটি LSA-র একটি age (বয়স) থাকে, যা database-এ বসে থাকতে থাকতে বাড়ে। OSPF-এ সর্বোচ্চ বয়স (MaxAge) ৩,৬০০ সেকেন্ড, অর্থাৎ এক ঘণ্টা। এর দুটি কাজ: (১) কোনো router হঠাৎ বন্ধ হয়ে গেলে তার পুরোনো LSA চিরকাল database-এ থাকবে না — বয়স MaxAge-এ পৌঁছালে মুছে যায়। (২) তাই প্রতিটি router নিজের LSA নিয়মিত (OSPF-এ প্রতি ৩০ মিনিটে) নতুন sequence number দিয়ে আবার ছাড়ে, কিছু না বদলালেও। কোনো LSA ইচ্ছা করে তুলে নিতে চাইলে router তার বয়স MaxAge বসিয়ে flood করে — সবাই সেটি মুছে দেয়।

Sequence number-এর একটি ফাঁদ: রিবুটের পর router নিজের শেষ নম্বর ভুলে ছোট নম্বরে LSA পাঠাতে পারে। সমাধান তৃতীয় নিয়মেই — নিচের stepper-এর শেষ দুই ধাপ দেখুন।

Mesh: A–B, A–C, B–C, B–D, C–E, D–E. সবার কাছে A-র LSA-র sequence ৪. এবার A-র একটি link বদলাল।

প্রতিটি router-এর database-এ A-র LSA-র sequence
A
B
C
D
E
এই ধাপের বার্তা
মোট LSA বার্তা
  1. A নতুন LSA বানাল। A-র একটি link-এর cost বদলেছে, তাই A sequence ৪ থেকে ৫ করে নতুন LSA বানিয়ে দুই প্রতিবেশী B আর C-কে পাঠাল। বাকিদের কাছে এখনো ৪.
  2. B নিল আর ছড়াল। B-র কাছে ছিল ৪, এসেছে ৫ — বড়, তাই নতুন। B রাখল, A-কে ack পাঠাল, আর যেখান থেকে এসেছে (A) সেটি বাদে বাকি দুই প্রতিবেশী C আর D-কে পাঠাল।
  3. C-ও নিল আর ছড়াল। A থেকে C-তে seq ৫ পৌঁছাল — C-র কাছে ৪, তাই নিল, ack দিল, আর B আর E-কে পাঠাল। এখন B→C আর C→B — দুটি কপি একে অপরের দিকে যাচ্ছে।
  4. নকল কপি থেমে গেল। B-র পাঠানো কপি C-তে পৌঁছাল, কিন্তু C-র কাছে আগেই ৫ — সমান, তাই ফেলে দিল, শুধু ack. C-র কপি B-তেও একই ভাগ্য। Sequence number না থাকলে এই দুটি কপি B আর C-র মাঝে চিরকাল ঘুরত।
  5. D আর E নিল। B থেকে D আর C থেকে E — দুজনেই ৫ পেল, নিল, আর একে অপরকে পাঠাল (D→E, E→D).
  6. সব database এক। D-র কপি E-তে আর E-র কপি D-তে পৌঁছে নকল হিসেবে ফেলে দেওয়া হলো। ৫টি router-ই এখন seq ৫ রাখে। মোট ৮টি LSA বার্তা গেল ৬টি link দিয়ে — প্রতিটি link-এ অন্তত একবার, দুটি link-এ দুই দিকে একবার করে।
  7. পুরোনো কপির ঘটনা — A রিবুট। A বন্ধ হয়ে চালু হলো আর নিজের নম্বর ভুলে seq ১ দিয়ে LSA পাঠাল। B আর C-র কাছে ৫ — আগত কপি ছোট, তাই ফেলে দিয়ে নিজেদের seq ৫-এর কপি A-কে ফেরত পাঠাল। A নিজের LSA-ই ৫ নম্বরে দেখে বুঝল, পুরোনো নম্বর আরও বড় ছিল।
  8. A লাফ দিয়ে ৬. A এখন seq ৬ দিয়ে নতুন LSA ছাড়ল, যা সবার ৫-এর চেয়ে বড়। প্রথম ঘটনার মতোই ৮টি বার্তায় সবাই ৬ পেল। এভাবে পুরোনো খবর কখনো নতুনকে মুছতে পারে না, আর রিবুটের পরও খবর ঠিক থাকে।

একই তিন নিয়ম কোডে। Simulator বার্তাগুলো একটি সারিতে (queue) রাখে আর পাঠানোর ক্রমে একে একে পৌঁছায়, প্রতিটি পৌঁছানোয় router কী করল তা ছাপে:

// Reliable flooding of router A's LSA over a small mesh, using sequence numbers.
const nbr = { A: ["B","C"], B: ["A","C","D"], C: ["A","B","E"], D: ["B","E"], E: ["C","D"] };
const db = { A: 4, B: 4, C: 4, D: 4, E: 4 };   // seq of A's LSA each router holds now
let queue = [], sent = 0, nextSeq = 0;
const send = (from, to, seq) => { queue.push({ from, to, seq }); sent++; };
function receive({ from, to, seq }) {
  const mine = db[to];
  let what;
  if (to === "A" && seq > mine) {                 // my OWN LSA came back newer than mine
    nextSeq = seq + 1;
    what = `my own LSA is newer than mine -> must re-originate with seq ${nextSeq}`;
  } else if (seq > mine) {                        // newer: install, ack, pass it on
    db[to] = seq;
    const out = nbr[to].filter(n => n !== from);
    out.forEach(n => send(to, n, seq));
    what = `ACCEPT (had ${mine}), ack ${from}, forward to ${out.join(",") || "-"}`;
  } else if (seq === mine) what = "duplicate -> discard, ack only";
  else {                                          // older: discard, send newer copy back
    send(to, from, mine);
    what = `STALE (have ${mine}) -> discard, send seq ${mine} back to ${from}`;
  }
  console.log(`  ${from}->${to} seq ${seq}: ${what}`);
}
function flood(title, origin, seq) {
  console.log(title); queue = []; sent = 0;
  db[origin] = seq;
  nbr[origin].forEach(n => send(origin, n, seq));
  while (queue.length) receive(queue.shift());
  console.log(`  messages: ${sent}, databases: ${JSON.stringify(db)}\n`);
}
flood("1) A's link changed: A floods seq 5", "A", 5);
flood("2) A rebooted, forgot its counter, floods seq 1", "A", 1);
flood(`3) A jumps to seq ${nextSeq} and floods again`, "A", nextSeq);

আউটপুট:

1) A's link changed: A floods seq 5
  A->B seq 5: ACCEPT (had 4), ack A, forward to C,D
  A->C seq 5: ACCEPT (had 4), ack A, forward to B,E
  B->C seq 5: duplicate -> discard, ack only
  B->D seq 5: ACCEPT (had 4), ack B, forward to E
  C->B seq 5: duplicate -> discard, ack only
  C->E seq 5: ACCEPT (had 4), ack C, forward to D
  D->E seq 5: duplicate -> discard, ack only
  E->D seq 5: duplicate -> discard, ack only
  messages: 8, databases: {"A":5,"B":5,"C":5,"D":5,"E":5}

2) A rebooted, forgot its counter, floods seq 1
  A->B seq 1: STALE (have 5) -> discard, send seq 5 back to A
  A->C seq 1: STALE (have 5) -> discard, send seq 5 back to A
  B->A seq 5: my own LSA is newer than mine -> must re-originate with seq 6
  C->A seq 5: my own LSA is newer than mine -> must re-originate with seq 6
  messages: 4, databases: {"A":1,"B":5,"C":5,"D":5,"E":5}

3) A jumps to seq 6 and floods again
  A->B seq 6: ACCEPT (had 5), ack A, forward to C,D
  A->C seq 6: ACCEPT (had 5), ack A, forward to B,E
  B->C seq 6: duplicate -> discard, ack only
  B->D seq 6: ACCEPT (had 5), ack B, forward to E
  C->B seq 6: duplicate -> discard, ack only
  C->E seq 6: ACCEPT (had 5), ack C, forward to D
  D->E seq 6: duplicate -> discard, ack only
  E->D seq 6: duplicate -> discard, ack only
  messages: 8, databases: {"A":6,"B":6,"C":6,"D":6,"E":6}

ঘটনা ১ stepper-এর প্রথম ছয় ধাপ: ৪টি ACCEPT (B, C, D, E প্রত্যেকে একবার) আর ৪টি duplicate. মোট বার্তা ৮ — link ৬টি, তাই প্রতিটি link-এ অন্তত একবার, আর B–C ও D–E link-এ দুই দিকেই একবার। একটি LSA-র flooding-এ বার্তার সংখ্যা সবসময় E থেকে 2E-এর মধ্যে থাকে (E = link-এর সংখ্যা)। ঘটনা ২-এ A-র seq ১ দুই প্রতিবেশীর কাছে STALE — তারা seq ৫ ফেরত পাঠাল, তাই database-এ A-র কাছে এখনো ১ আর বাকিদের ৫: মানচিত্র এক মুহূর্তের জন্য মেলে না। ঘটনা ৩-এ A seq ৬-এ লাফ দিতেই সব ঠিক। নিজে চেষ্টা করুন: nbr-এ A-র তালিকায় "D" আর D-র তালিকায় "A" যোগ করে (নতুন link A–D) চালান — বার্তার সংখ্যা কি ৭ থেকে ১৪-এর মধ্যে থাকল?

Sequence number-এর পরিসর নিয়ে সাবধান: নম্বর যদি শেষ সীমায় পৌঁছে আবার শূন্য থেকে ঘুরে আসে (circular), তবে “কোনটি বড়” প্রশ্নের উত্তর গোলমেলে হতে পারে। ১৯৮০ সালে ARPANET-এর একটি বড় বিপর্যয় ঠিক এ কারণেই হয়েছিল (ভাবনার প্রশ্ন ১)। তাই OSPFv2 (RFC 2328) রৈখিক (linear) পরিসর ব্যবহার করে: শুরু 0x80000001 থেকে, শেষ 0x7FFFFFFF পর্যন্ত — signed ৩২ bit সংখ্যা হিসেবে ছোট থেকে বড়; শেষে পৌঁছালে আগে পুরোনো LSA-টি MaxAge দিয়ে মুছে তারপর আবার শুরু থেকে।

৩ · Dijkstra — প্রতিটি router-এ একই হিসাব

Flooding শেষে সবার LSDB এক। এবার প্রতিটি router নিজেকে উৎস ধরে Dijkstra-র algorithm চালায় — ওলন্দাজ কম্পিউটার বিজ্ঞানী Edsger W. Dijkstra ১৯৫৬ সালে এটি ভাবেন আর ১৯৫৯ সালে প্রকাশ করেন। Routing-এর জগতে একে প্রায়ই SPF (Shortest Path First) বলা হয় — OSPF নামের “SPF” অংশ এখান থেকেই। Algorithm-টির সাধারণ রূপ, heap দিয়ে বাস্তবায়ন আর বিস্তারিত বিশ্লেষণ DSA কোর্সের Dijkstra পর্বে আছে; এখানে আমরা দেখব routing-এ এটি কীভাবে ব্যবহার হয়, আর পরীক্ষায় টেবিলটি কীভাবে লিখতে হয়।

চিহ্নগুলো

  • c(x,y): x আর y-এর মাঝের link-এর cost; সরাসরি link না থাকলে ∞.
  • D(v): এখন পর্যন্ত জানা উৎস থেকে v-এর সবচেয়ে কম cost.
  • p(v): সেই পথে v-এর ঠিক আগের node (predecessor).
  • N′: যেসব node-এর সবচেয়ে ছোট পথ নিশ্চিতভাবে জানা হয়ে গেছে।
প্রাথমিক অবস্থা:
  N' = {u}
  প্রতিটি node v-এর জন্য:
    v যদি u-র প্রতিবেশী হয়:  D(v) = c(u,v),  p(v) = u
    নইলে:                    D(v) = ∞
লুপ:
  N'-এর বাইরে যে w-এর D(w) সবচেয়ে ছোট, তাকে বাছাই
  w-কে N'-এ যোগ
  w-এর প্রতিটি প্রতিবেশী v, যা N'-এ নেই:
    D(w) + c(w,v) < D(v) হলে:  D(v) = D(w) + c(w,v),  p(v) = w
সব node N'-এ না আসা পর্যন্ত লুপ চলবে

দুটি নিয়ম আমরা আগে থেকে ঠিক করে রাখি, কারণ পরীক্ষায় এ নিয়ে দ্বিধা হয়: (১) দুটি node-এর D সমান হলে বর্ণক্রমে আগেরটি আগে বাছাই হবে; (২) নতুন পথের cost পুরোনোটির সমান হলে p(v) বদলাবে না — শুধু কঠোরভাবে ছোট হলে বদলায়। (কোনো বই অন্য নিয়ম নেয়; চূড়ান্ত cost একই থাকে। পরীক্ষায় নিজের নিয়মটি লিখে দেওয়া নিরাপদ।)

N′ আর D(·),p(·) — প্রতি ধাপের পর
N′
D(v),p(v)
D(w),p(w)
D(x),p(x)
D(y),p(y)
D(z),p(z)
  1. ধাপ ০: শুরু। N′ = {u}. u-র সরাসরি প্রতিবেশী v, x, w — তাদের D = link-এর cost (২, ১, ৫), p = u. y আর z সরাসরি যুক্ত নয়, তাই ∞.
  2. ধাপ ১: x যোগ হলো। N′-এর বাইরে সবচেয়ে ছোট D(x) = ১. x-এর প্রতিবেশী দিয়ে হালনাগাদ: v-তে ১ + ২ = ৩, যা ২-এর চেয়ে বড় — বদল নেই। w-তে ১ + ৩ = ৪ < ৫ → D(w) = ৪, p(w) = x. y-তে ১ + ১ = ২ → D(y) = ২, p(y) = x.
  3. ধাপ ২: v যোগ হলো। এখন D(v) = ২ আর D(y) = ২ — সমান; বর্ণক্রমের নিয়মে v আগে। v-এর প্রতিবেশী w-তে ২ + ৩ = ৫, বর্তমান ৪-এর চেয়ে বড় — বদল নেই। (অনেক বইয়ে এখানে y আগে আসে; শেষ ফল একই।)
  4. ধাপ ৩: y যোগ হলো। D(y) = ২. y-এর প্রতিবেশী: w-তে ২ + ১ = ৩ < ৪ → D(w) = ৩, p(w) = y. z-তে ২ + ২ = ৪ → D(z) = ৪, p(z) = y. লক্ষ করুন, w-এর মান দুবার কমল: ৫ → ৪ → ৩.
  5. ধাপ ৪: w যোগ হলো। D(w) = ৩, বাকি শুধু z (৪)। w থেকে z-তে ৩ + ৫ = ৮ > ৪ — বদল নেই।
  6. ধাপ ৫: z যোগ হলো। D(z) = ৪. সব node N′-এ — হিসাব শেষ। চূড়ান্ত cost: v ২, w ৩, x ১, y ২, z ৪.
  7. Forwarding table. p(·) উল্টো দিকে অনুসরণ করে পথ: z-এর আগে y, y-এর আগে x, x-এর আগে u — তাই u-x-y-z. Forwarding table-এ পুরো পথ লাগে না, শুধু প্রথম link: v-এর জন্য (u,v), বাকি চারটির জন্য (u,x).

পরীক্ষার খাতায় একই হিসাব একটি টেবিলে লেখা হয় — প্রতি সারি একটি ধাপ, আর যে node N′-এ ঢুকে গেছে তার ঘর পরের সারি থেকে ফাঁকা। নিচের simulator হুবহু সেই টেবিল ছাপে, তারপর forwarding table. Graph বদলে (যেমন একটি link-এর cost) নিজের অনুশীলনের উত্তর মেলাতে পারবেন।

// Link-state database (identical in every router): 6 routers, 10 links, cost on each link.
const links = [["u","v",2],["u","x",1],["u","w",5],["v","x",2],["v","w",3],
               ["x","w",3],["x","y",1],["w","y",1],["w","z",5],["y","z",2]];
const nodes = ["u","v","w","x","y","z"], src = "u";
const cost = {};                       // cost[a][b] = link cost (both directions)
for (const n of nodes) cost[n] = {};
for (const [a, b, c] of links) { cost[a][b] = c; cost[b][a] = c; }
const D = {}, p = {}, Np = [src];      // D = distance, p = predecessor, Np = N'
for (const v of nodes) if (v !== src) { D[v] = cost[src][v] ?? Infinity; p[v] = src; }
const others = nodes.filter(v => v !== src);
const cell = v => Np.includes(v) ? "" : D[v] === Infinity ? "inf" : D[v] + "," + p[v];
const row = s => console.log(String(s).padEnd(5) + Np.join("").padEnd(8) +
  others.map(v => cell(v).padEnd(10)).join(""));
console.log("step N'      " + others.map(v => `D(${v}),p(${v})`.padEnd(10)).join(""));
row(0);
for (let step = 1; step < nodes.length; step++) {
  // pick w not in N' with the smallest D (tie -> alphabetical order)
  const w = others.filter(v => !Np.includes(v))
                  .sort((a, b) => D[a] - D[b] || a.localeCompare(b))[0];
  Np.push(w);
  for (const v in cost[w])             // relax every neighbour of w not yet in N'
    if (!Np.includes(v) && D[w] + cost[w][v] < D[v]) { D[v] = D[w] + cost[w][v]; p[v] = w; }
  row(step);
}
console.log("\nForwarding table of " + src + "\ndest  cost  path      next hop (link)");
for (const v of others) {
  const path = [v];
  while (path[0] !== src) path.unshift(p[path[0]]);
  console.log(`${v}     ${D[v]}     ${path.join("-").padEnd(9)} (${src},${path[1]})`);
}

আউটপুট:

step N'      D(v),p(v) D(w),p(w) D(x),p(x) D(y),p(y) D(z),p(z)
0    u       2,u       5,u       1,u       inf       inf
1    ux      2,u       4,x                 2,x       inf
2    uxv               4,x                 2,x       inf
3    uxvy              3,y                           4,y
4    uxvyw                                           4,y
5    uxvywz

Forwarding table of u
dest  cost  path      next hop (link)
v     2     u-v       (u,v)
w     3     u-x-y-w   (u,x)
x     1     u-x       (u,x)
y     2     u-x-y     (u,x)
z     4     u-x-y-z   (u,x)

টেবিলটি stepper-এর সাথে হুবহু মেলে: ধাপ ১-এ w ৫ থেকে ৪ (x দিয়ে), ধাপ ৩-এ ৪ থেকে ৩ (y দিয়ে); z প্রথম দেখা দেয় ধাপ ৩-এ (৪,y), আর ধাপ ৪-এ w দিয়ে ৮ হওয়ায় বদলায় না। Forwarding table-এর শিক্ষা: পাঁচটি গন্তব্যের চারটির জন্যই প্রথম link (u,x) — x-এর দিকের link-টি u-র “প্রধান সড়ক”. u থেকে w-তে সরাসরি link (cost ৫) থাকা সত্ত্বেও packet যায় তিন hop ঘুরে (cost ৩) — routing hop গোনে না, cost গোনে। নিজে চেষ্টা করুন: src = "u" বদলে "z" করে চালান; z থেকে u-র cost-ও ৪ আসবে (link দুই দিকেই সমান cost বলে), কিন্তু পথ কি একই?

Dijkstra কেন সঠিক — ছোট একটি প্রমাণ

দাবি: কোনো node w যখন N′-এ যোগ হয়, তখন D(w) সত্যিই u থেকে w-এর সবচেয়ে ছোট cost. প্রমাণের ধারণা (বিপরীত ধরে নিয়ে):

  1. ধরুন w-ই প্রথম node যার ক্ষেত্রে দাবিটি মিথ্যা — অর্থাৎ u থেকে w-এ একটি পথ P আছে যার cost D(w)-এর চেয়ে কম।
  2. P শুরু হয় u-তে (N′-এর ভেতরে) আর শেষ হয় w-তে (তখনো বাইরে)। তাই পথে প্রথমবার N′ ছেড়ে বাইরে যাওয়ার একটি link আছে: a থেকে b, যেখানে a ∈ N′ আর b ∉ N′.
  3. a আগেই N′-এ যোগ হয়েছে, সঠিক D(a) নিয়ে (w-ই প্রথম ভুল)। a যোগ হওয়ার সময় তার প্রতিবেশী b হালনাগাদ হয়েছিল, তাই D(b) ≤ D(a) + c(a,b) = P-এর u থেকে b পর্যন্ত অংশের cost.
  4. সব cost অঋণাত্মক, তাই P-এর বাকি অংশ (b থেকে w) cost কমাতে পারে না: P-এর u থেকে b অংশ ≤ P-এর পুরো cost < D(w).
  5. অর্থাৎ D(b) < D(w), অথচ algorithm বাইরের node-গুলোর মধ্যে সবচেয়ে ছোট D হিসেবে w-কে বেছেছে — বিরোধ। তাই দাবি সত্য। ∎

ধাপ ৪-এ “cost অঋণাত্মক” শর্তটি অপরিহার্য। ঋণাত্মক cost থাকলে Dijkstra ভুল উত্তর দিতে পারে — সেখানে লাগে Bellman-Ford (DSA কোর্সের Bellman-Ford পর্ব)। Routing-এ link cost সবসময় ধনাত্মক, তাই সমস্যা নেই।

৪ · খরচের হিসাব আর একটি বিপদ — জটিলতা ও oscillation

Dijkstra-র সময়

n টি node-এর নেটওয়ার্কে (উৎস বাদে n টি অন্য node ধরে) সাধারণ array দিয়ে বাস্তবায়নে প্রথম ধাপে n টি node দেখে সবচেয়ে ছোটটি খুঁজতে হয়, পরের ধাপে n − ১টি, এভাবে শেষ পর্যন্ত। মোট তুলনা n + (n − ১) + … + ১ = n(n + ১) ÷ ২ — অর্থাৎ O(n²). সবচেয়ে ছোট D খোঁজার কাজটি binary heap (priority queue) দিয়ে করলে প্রতিটি node তোলা আর প্রতিটি link-এর হালনাগাদ O(log V) সময় নেয়, তাই মোট O((E + V) log V), যেখানে V = node, E = link. Router-এর নেটওয়ার্কে প্রতিটি router-এর প্রতিবেশী অল্প (E অনেক ছোট V²-এর তুলনায়), তাই heap-এর রূপটি বাস্তবে দ্রুত।

Flooding-এর বার্তা

অংশ ২-এ দেখেছেন, একটি LSA-র flooding-এ E থেকে 2E বার্তা। প্রতিটি router একটি করে LSA ছাড়লে মোট O(V × E) বার্তা। হাজার হাজার router-এর একটি সমতল নেটওয়ার্কে প্রতিটি link-এর ওঠানামায় সবার কাছে flooding আর সবার Dijkstra চালানো বোঝা হয়ে দাঁড়ায়। এ কারণেই OSPF-এ area (অংশ ৭)।

Oscillation — যখন cost = বর্তমান ভিড়

ধরুন link cost ঠিক হয় বর্তমান ভিড় দেখে — যত বেশি traffic, তত বেশি cost. শুনতে বুদ্ধিমানের মতো: ভিড়ের রাস্তা এড়িয়ে চলা। কিন্তু একটি সরল উদাহরণ ভাবুন: একটি গন্তব্যে যাওয়ার দুটি পথ — ঘড়ির কাঁটার দিকে আর উল্টো দিকে। শুরুতে দুটিই ফাঁকা; সবাই একটি বেছে নিল (ধরুন ঘড়ির দিকে)। এখন সেই পথে সব traffic, তাই তার cost বেড়ে গেল। পরের হিসাবে সবাই একসাথে দেখল উল্টো দিক সস্তা — সবাই সেদিকে চলে গেল। তারপর সেটি ভারী, আবার সবাই ফিরে এল… পথ দোলনার মতো দুলতেই থাকে, আর প্রতিবার পথ বদলের সময় packet হারায় বা আগে-পরে পৌঁছায়।

ঢাকায় সকাল ৯টায় সবার ফোনের ম্যাপ যদি একই মুহূর্তে বলে “মিরপুর রোড ফাঁকা”, পাঁচ মিনিটে মিরপুর রোডে জ্যাম। তখন ম্যাপ সবাইকে একসাথে বলে “এবার প্রগতি সরণি” — সেখানেও জ্যাম। সমস্যা ম্যাপের তথ্য নয়; সবাই একই তথ্য দেখে একই সময়ে একই সিদ্ধান্ত নিচ্ছে।

সমাধানের দুটি পথ: (১) cost-কে ভিড়ের ওপর নির্ভর না করানো — OSPF আর IS-IS-এ cost স্থির, প্রশাসকের বসানো; (২) সব router যেন একসাথে হিসাব না করে, তাই LSA পাঠানো আর হিসাবের সময়ে এলোমেলো বিরতি। ইতিহাসে ARPANET-এর delay-নির্ভর metric-এ এমন অস্থিরতা দেখা গিয়েছিল, আর ১৯৮০-এর দশকের শেষে metric সংশোধন করে ওঠানামার সীমা বেঁধে দেওয়া হয়। ভিড় বুঝে traffic সরানোর কাজ আজ সাধারণত আলাদা ব্যবস্থায় হয় — MPLS traffic engineering বা SDN controller (পর্ব ৫৩)।

৫ · OSPF — বাস্তবের link state protocol

OSPF (Open Shortest Path First) একটি প্রতিষ্ঠানের ভেতরের নেটওয়ার্কে (একটি autonomous system-এর ভেতরে) সবচেয়ে বেশি ব্যবহৃত link state protocol — অর্থাৎ একটি IGP (পর্ব ২২)। প্রতিষ্ঠানের বাইরে, এক ISP থেকে আরেক ISP-তে, চলে BGP (পর্ব ২৫)। “Open” মানে খোলা মান — কোনো এক কোম্পানির মালিকানা নয়।

বিষয়OSPFv2OSPFv3
কোন IP-র routeIPv4মূলত IPv6 (পরে IPv4-ও বহন করতে পারে)
মানRFC 2328 (১৯৯৮)RFC 5340 (২০০৮)
বার্তা কিসের ওপরসরাসরি IPv4, protocol number 89 — TCP বা UDP নয়সরাসরি IPv6, next header 89
সব OSPF router-এর multicast224.0.0.5 (AllSPFRouters)FF02::5
DR আর BDR-এর multicast224.0.0.6 (AllDRouters)FF02::6
Authenticationনিজস্ব (MD5, পরে HMAC-SHA)মূলত IPsec, পরে নিজস্ব authentication trailer

TCP বা UDP-তে না চলায় OSPF নিজেই নিজের নির্ভরযোগ্যতা সামলায় — অংশ ২-এর ack আর retransmission. বার্তা যায় multicast ঠিকানায়, আর IP header-এর TTL সাধারণত ১ — অর্থাৎ শুধু একই link-এর প্রতিবেশীর জন্য, router পেরিয়ে যায় না। OSPF-এর পাঁচ ধরনের packet:

Typeনামকাজ
1Helloপ্রতিবেশী খোঁজা আর বেঁচে থাকার খবর; DR/BDR নির্বাচনের তথ্যও বহন করে
2Database Description (DBD)নিজের LSDB-তে কোন কোন LSA আছে তার সূচি (শুধু header) — “আমার কাছে এগুলো আছে”
3Link State Request (LSR)“এই LSA-গুলো আমার কাছে নেই বা পুরোনো, পাঠান”
4Link State Update (LSU)আসল LSA বহন করে — flooding এভাবেই হয়
5Link State Acknowledgment (LSAck)LSU পাওয়ার স্বীকৃতি — “reliable” অংশ

Hello আর dead timer

প্রতিটি OSPF interface নিয়মিত hello পাঠায়। Ethernet-এর মতো broadcast নেটওয়ার্ক আর point-to-point link-এ সাধারণ ডিফল্ট: hello interval ১০ সেকেন্ড, dead interval ৪০ সেকেন্ড (hello-র চার গুণ) — RFC 2328-এর নমুনা মান আর বেশিরভাগ vendor-এর ডিফল্ট; কিছু পুরোনো ধরনের নেটওয়ার্কে (যেমন NBMA) ৩০ আর ১২০. ৪০ সেকেন্ড কোনো hello না এলে প্রতিবেশীকে মৃত ধরা হয়। দুই প্রতিবেশীর মধ্যে hello আর dead interval, area নম্বর, subnet mask (broadcast নেটওয়ার্কে), authentication আর কয়েকটি option মিলতে হয় — না মিললে তারা কখনো প্রতিবেশী হয় না। বাস্তবের ভুলের বড় অংশ এখানেই।

৪০ সেকেন্ড অনেক সময়: একটি link কাটার পর ৪০ সেকেন্ড পর্যন্ত packet কালো গর্তে পড়তে পারে। তাই বাস্তবে দুটি উপায়: (১) physical link নিভে গেলে interface নিজেই সাথে সাথে খবর দেয় — তখন timer-এর অপেক্ষা লাগে না; (২) মাঝের কোনো যন্ত্র নষ্ট হলে দ্রুত ধরতে BFD (Bidirectional Forwarding Detection) নামের হালকা protocol মিলিসেকেন্ডের ঘরে বার্তা পাঠিয়ে মৃত্যু ধরে আর OSPF-কে জানায়।

Neighbour state — Down থেকে Full

দুটি OSPF router পরিচিত হয়ে database মেলানো পর্যন্ত কয়েকটি অবস্থা পার হয়। Troubleshooting-এ “কোন state-এ আটকে আছে” দেখেই সমস্যা অনেকটা বোঝা যায়:

  1. Downhello নেইশুরু
  2. Initএকদিকে শোনাhello এলো
  3. 2-Wayদুই দিকেDR নির্বাচন
  4. ExStartmaster/slaveDBD শুরু
  5. ExchangeDBD সূচিকী কী আছে
  6. LoadingLSR → LSUযা নেই আনা
  7. FullLSDB একadjacency
  1. Down. R1 এখনো R2-এর কোনো hello শোনেনি (বা dead interval পেরিয়ে গেছে)। R1 নিজের hello 224.0.0.5-এ পাঠাতে থাকে, প্রতি ১০ সেকেন্ডে।
  2. Init. R2-এর একটি hello R1-এ পৌঁছেছে, কিন্তু সেই hello-র প্রতিবেশী-তালিকায় R1-এর router ID নেই — অর্থাৎ R2 এখনো R1-কে শোনেনি। যোগাযোগ এখনো একমুখী।
  3. 2-Way. R1 এবার R2-এর hello-তে নিজের router ID দেখল — দুই দিকে যোগাযোগ নিশ্চিত। Multi-access LAN-এ DR/BDR নির্বাচন এই পর্যায়ে হয়। দুটি সাধারণ router (DROther) পরস্পরের সাথে এখানেই থেমে থাকে — এটি ত্রুটি নয় (অংশ ৬)।
  4. ExStart. Database মেলানোর প্রস্তুতি: কে master আর কে slave, তা ঠিক হয় — যার router ID বড়, সে master; master DBD-র sequence নম্বর ঠিক করে। দুই প্রান্তের MTU না মিললে router প্রায়ই এখানে বা পরের ধাপে আটকে থাকে — পরিচিত বাস্তব সমস্যা।
  5. Exchange. দুজনে DBD packet-এ নিজেদের LSDB-র সূচি (প্রতিটি LSA-র header: কার, কোন sequence, কত age) বিনিময় করে। পুরো LSA নয়, শুধু তালিকা — বইয়ের দোকানে পুরো বই না দেখিয়ে আগে ক্যাটালগ মেলানোর মতো।
  6. Loading. সূচি মিলিয়ে যা নেই বা যার নিজের কপি পুরোনো, তার জন্য LSR পাঠায়; উত্তরে LSU-তে আসল LSA আসে, আর প্রতিটির জন্য LSAck.
  7. Full. দুজনের LSDB এখন হুবহু এক — একে বলে পূর্ণ adjacency. এখন থেকে নতুন LSA এই সম্পর্ক দিয়েই flood হবে, আর দুজনেই Dijkstra চালাতে পারে।

Cisco-ধাঁচের router-এ show ip ospf neighbor এই state দেখায়। একটি LAN-এর R1-এর দৃষ্টিতে (উদাহরণ আউটপুট, কাল্পনিক নেটওয়ার্ক):

R1# show ip ospf neighbor          ← উদাহরণ, Cisco IOS-ধাঁচ

Neighbor ID     Pri   State           Dead Time   Address         Interface
3.3.3.3         100   FULL/DR         00:00:36    10.0.0.3        GigabitEthernet0/0
10.0.0.5          1   FULL/BDR        00:00:33    10.0.0.5        GigabitEthernet0/0
2.2.2.2           1   2WAY/DROTHER    00:00:38    10.0.0.2        GigabitEthernet0/0
9.9.9.9           0   2WAY/DROTHER    00:00:31    10.0.0.4        GigabitEthernet0/0

R1 নিজে একটি DROther: DR (3.3.3.3) আর BDR (10.0.0.5)-এর সাথে FULL, অন্য দুই DROther-এর সাথে 2WAY. “Dead Time” ৪০ থেকে উল্টো গোনে, প্রতিটি hello এলে আবার ৪০ হয়। Linux-এ একই কাজ করে FRRouting-এর ospfd (কমান্ড vtysh -c "show ip ospf neighbor") বা BIRD — আউটপুটের ধরন একটু আলাদা।

৬ · DR/BDR নির্বাচন আর cost-এর হিসাব

LAN-এ DR কেন লাগে

একটি Ethernet switch-এ ৫টি OSPF router যুক্ত — সবাই সবার প্রতিবেশী। প্রত্যেকে প্রত্যেকের সাথে পূর্ণ adjacency করলে জোড়া হয় n(n − ১) ÷ ২ = ৫ × ৪ ÷ ২ = ১০টি; প্রতিটি নতুন LSA এই সব জোড়া দিয়ে বারবার flood হয়, আর প্রতিটি router LSDB-তে LAN-টিকে ১০টি আলাদা link হিসেবে দেখে। ২০টি router হলে ১৯০টি জোড়া। সমাধান: LAN-এর জন্য একজন প্রতিনিধি — Designated Router (DR), আর DR নষ্ট হলে সাথে সাথে দায়িত্ব নিতে একজন Backup DR (BDR). বাকিরা (DROther) পূর্ণ adjacency করে শুধু DR আর BDR-এর সাথে: প্রতিটি DROther-এর ২টি, আর DR–BDR নিজেদের ১টি — মোট (n − ২) × ২ + ১ = 2n − 3, অর্থাৎ মোটামুটি 2n. DR LAN-টির পক্ষে একটি Network LSA (type 2, অংশ ৭) বানায়, যাতে graph-এ LAN-টি একটি “ছদ্ম node” হয়ে যায়।

ক্লাসের ৬০ জন যদি প্রত্যেকে প্রত্যেকের সাথে নোট মেলাতে বসে, জোড়া হবে ১,৭৭০টি। তার বদলে সবাই নোট মেলায় ক্লাস ক্যাপ্টেন আর সহকারী ক্যাপ্টেনের সাথে। কেউ নতুন কিছু জানলে ক্যাপ্টেনকে বলে, ক্যাপ্টেন সবাইকে জানায়। ক্যাপ্টেন অনুপস্থিত হলে সহকারী সাথে সাথে দায়িত্ব নেয় — নতুন করে নোট মেলাতে হয় না, কারণ সহকারীর কাছে আগে থেকেই সব আছে।

Flooding-ও বদলায়: DROther নতুন LSA পাঠায় 224.0.0.6-এ (শুধু DR আর BDR শোনে), আর DR তা পুরো LAN-এ 224.0.0.5-এ ছড়িয়ে দেয়। Point-to-point link-এ (দুটি router, মাঝে আর কেউ নেই) DR/BDR নির্বাচন হয় না — প্রয়োজনই নেই।

নির্বাচনের নিয়ম

  1. প্রতিটি interface-এর একটি OSPF priority (০–২৫৫, ডিফল্ট ১)। Priority ০ মানে এই router কখনো DR বা BDR হবে না।
  2. সবচেয়ে বড় priority জেতে; সমান হলে সবচেয়ে বড় router ID (৩২ bit সংখ্যা, IPv4 ঠিকানার মতো করে লেখা — সংখ্যা হিসেবে তুলনা হয়, লেখা হিসেবে নয়)।
  3. নির্বাচন non-preemptive: একবার DR/BDR ঠিক হয়ে গেলে পরে বেশি priority-র router যোগ হলেও সে দখল নেয় না। DR নষ্ট হলে BDR DR হয়, আর নতুন BDR নির্বাচন হয়।

একটি LAN 10.0.0.0/24: R1 (priority ১, ID 1.1.1.1), R2 (১, 2.2.2.2), R3 (১০০, 3.3.3.3), R4 (০, 9.9.9.9), R5 (১, 10.0.0.5). পরে যোগ হবে R6 (২০০, 6.6.6.6).

প্রতিটি router-এর ভূমিকা
R1 (pri 1, 1.1.1.1)
R2 (pri 1, 2.2.2.2)
R3 (pri 100, 3.3.3.3)
R4 (pri 0, 9.9.9.9)
R5 (pri 1, 10.0.0.5)
R6 (pri 200, 6.6.6.6)
পূর্ণ adjacency
  1. Hello-র আদান-প্রদান। সবাই 224.0.0.5-এ hello পাঠায়, প্রতিটি hello-তে নিজের priority আর router ID. নতুন LAN-এ router-রা একটি অপেক্ষার সময় (dead interval-এর সমান, ৪০ সেকেন্ড) পর্যন্ত শোনে — হুট করে প্রথম জনকেই DR না বানাতে।
  2. Priority ০ বাদ। R4-এর router ID (9.9.9.9) বড় হলেও priority ০ — সে কখনো DR বা BDR হবে না। প্রশাসক দুর্বল বা প্রান্তের router-কে এভাবে বাদ রাখেন।
  3. DR: সবচেয়ে বড় priority. R3-এর priority ১০০, বাকিদের ১ — R3 DR. এখানে router ID দেখারই দরকার পড়েনি।
  4. BDR: সমান priority-তে router ID. R1, R2, R5 — তিনজনেরই priority ১. Router ID সংখ্যা হিসেবে: 10.0.0.5 > 2.2.2.2 > 1.1.1.1, তাই R5 BDR. (লেখা হিসেবে তুলনা করলে “2…” > “1…” ভেবে ভুল করে R2-কে বেছে নিতেন।) পূর্ণ adjacency ১০টির বদলে ৭টি।
  5. Adjacency-র ছবি। R1, R2, R4 প্রত্যেকে DR আর BDR-এর সাথে FULL; নিজেদের মধ্যে 2-Way. DR–BDR নিজেরাও FULL. LSA ছড়ায় DROther → 224.0.0.6 → DR → 224.0.0.5 → সবাই।
  6. R6 এলো — দখল নেই। R6-এর priority ২০০, সবার চেয়ে বেশি। তবু নির্বাচন non-preemptive, তাই R6 শুধু DROther হয়ে DR আর BDR-এর সাথে adjacency করল। এতে নতুন যন্ত্র যোগ করলেই পুরো LAN-এর adjacency ভেঙে আবার গড়তে হয় না।
  7. DR নষ্ট হলো। R3 বন্ধ। BDR R5 সাথে সাথে DR হলো — তার কাছে আগে থেকেই সবার সাথে FULL adjacency, তাই কোনো তথ্য হারায়নি। নতুন BDR নির্বাচনে বাকিদের মধ্যে R6-এর priority ২০০ সবচেয়ে বড় — R6 BDR.

Cost = reference bandwidth ÷ interface bandwidth

RFC 2328 শুধু বলে প্রতিটি interface-এর একটি cost থাকবে (১ থেকে ৬৫,৫৩৫); কীভাবে ঠিক হবে, তা বাস্তবায়নের ব্যাপার। প্রচলিত নিয়ম (Cisco-সহ অনেক vendor-এর ডিফল্ট):

cost = reference bandwidth ÷ interface bandwidth (পূর্ণসংখ্যা, কমপক্ষে ১)

অনেক vendor-এর ডিফল্ট reference bandwidth ১০০ Mbps — যখন এই নিয়ম চালু হয়, তখন ১০০ Mbps-ই ছিল দ্রুত link. আজ সমস্যা: ১০০ Mbps, ১ Gbps, ১০ Gbps, ১০০ Gbps — সবার cost ১! OSPF তখন একটি ১০০ Mbps link আর একটি ১০০ Gbps link-কে সমান ভাবে। তাই একটি নেটওয়ার্কের সব router-এ একই, বড় reference বসানো উচিত (যেমন ১০০ Gbps). নিচের calculator তা দেখায়, সাথে অংশ ৬-এর DR/BDR নির্বাচন আর adjacency-র হিসাব:

// (1) OSPF interface cost = reference bandwidth / interface bandwidth (integer, at least 1)
const ospfCost = (refMbps, bwMbps) => Math.max(1, Math.floor(refMbps / bwMbps));
const ifaces = [["T1 1.544M", 1.544], ["10M", 10], ["100M", 100], ["1G", 1000],
                ["10G", 10000], ["40G", 40000], ["100G", 100000]];
console.log("interface   ref=100M   ref=100G");
for (const [name, bw] of ifaces)
  console.log(name.padEnd(12) + String(ospfCost(100, bw)).padEnd(11) + ospfCost(100000, bw));

// (2) DR/BDR election on one Ethernet segment
const lan = [{ r: "R1", pri: 1, rid: "1.1.1.1" }, { r: "R2", pri: 1, rid: "2.2.2.2" },
             { r: "R3", pri: 100, rid: "3.3.3.3" }, { r: "R4", pri: 0, rid: "9.9.9.9" },
             { r: "R5", pri: 1, rid: "10.0.0.5" }];
const ridNum = s => s.split(".").reduce((a, o) => a * 256 + Number(o), 0); // compare as numbers
const ranked = lan.filter(x => x.pri > 0)            // priority 0 = never DR or BDR
  .sort((a, b) => b.pri - a.pri || ridNum(b.rid) - ridNum(a.rid));
console.log("\nrank  router  priority  router-id");
ranked.forEach((x, i) => console.log(`${i + 1}     ${x.r}      ${String(x.pri).padEnd(9)} ${x.rid}`));
console.log(`DR = ${ranked[0].r}, BDR = ${ranked[1].r}, ineligible: ` +
  lan.filter(x => x.pri === 0).map(x => x.r).join(","));
console.log(`string compare would say "2.2.2.2" > "10.0.0.5": ${"2.2.2.2" > "10.0.0.5"}`);

// (3) adjacencies on a LAN of n routers: full mesh vs. with DR + BDR
console.log("\n  n   full mesh n(n-1)/2   with DR/BDR 2n-3");
for (const n of [5, 10, 20, 50])
  console.log(String(n).padStart(3) + String(n * (n - 1) / 2).padStart(21) + String(2 * n - 3).padStart(19));

আউটপুট:

interface   ref=100M   ref=100G
T1 1.544M   64         64766
10M         10         10000
100M        1          1000
1G          1          100
10G         1          10
40G         1          2
100G        1          1

rank  router  priority  router-id
1     R3      100       3.3.3.3
2     R5      1         10.0.0.5
3     R2      1         2.2.2.2
4     R1      1         1.1.1.1
DR = R3, BDR = R5, ineligible: R4
string compare would say "2.2.2.2" > "10.0.0.5": true

  n   full mesh n(n-1)/2   with DR/BDR 2n-3
  5                   10                  7
 10                   45                 17
 20                  190                 37
 50                 1225                 97

Cost: ref ১০০ Mbps-এ ১০০M থেকে ১০০G — পাঁচটি সম্পূর্ণ আলাদা গতির link-এর cost একই, ১. পুরোনো T1 (১.৫৪৪ Mbps)-এ ১০০ ÷ ১.৫৪৪ = ৬৪.৭৭, পূর্ণসংখ্যায় ৬৪. Ref ১০০ Gbps-এ প্রতিটি গতি আলাদা cost পায় (১০০০, ১০০, ১০, ২, ১) — ৪০G-তে ২.৫ কেটে ২ হয়, তাই খুব কাছাকাছি গতিতে সামান্য অসমতা থাকে। নির্বাচন: stepper-এর মতোই R3 DR, R5 BDR, R4 বাদ। শেষ লাইনটি সতর্কবার্তা: JavaScript-এ লেখা হিসেবে "2.2.2.2" > "10.0.0.5" — true! তাই কোডে router ID-কে আগে সংখ্যায় বদলাতে হয় (ridNum). Adjacency: ৫০টি router-এর LAN-এ ১,২২৫টির বদলে ৯৭টি। নিজে চেষ্টা করুন: R1-এর priority ১০০ করে চালান — সমান priority-তে এবার DR কে হবে?

বাস্তবে একটি Cisco IOS-ধাঁচের কনফিগারেশন দেখতে মোটামুটি এমন (উদাহরণ; vendor আর software-এর সংস্করণভেদে কমান্ড আলাদা):

! উদাহরণ — Cisco IOS-ধাঁচ
router ospf 1
 router-id 3.3.3.3
 auto-cost reference-bandwidth 100000      ! Mbps-এ, অর্থাৎ 100 Gbps
 passive-interface GigabitEthernet0/2      ! ব্যবহারকারীদের LAN: hello পাঠাবে না
 network 10.0.0.0 0.0.0.255 area 0
 network 192.168.20.0 0.0.0.255 area 0
!
interface GigabitEthernet0/0
 ip ospf priority 100
 ip ospf cost 10                           ! চাইলে হাতে cost বসানো যায়

passive-interface-এর মানে: ওই interface-এর নেটওয়ার্কটি OSPF-এ ঘোষণা হবে, কিন্তু সেখানে hello যাবে না, তাই কোনো প্রতিবেশী তৈরি হবে না। ব্যবহারকারীদের LAN-এ এটি নিরাপত্তার জন্য জরুরি (অংশ ৭)। হাতে বসানো ip ospf cost সূত্রের হিসাবকে ছাপিয়ে যায়।

৭ · বড় নেটওয়ার্কে OSPF — area, ABR, ASBR, LSA type আর নিরাপত্তা

অংশ ৪-এর সমস্যা মনে করুন: একটি সমতল নেটওয়ার্কে প্রতিটি link-এর ওঠানামা সবার কাছে flood হয়, সবাই Dijkstra চালায়, সবার LSDB পুরো নেটওয়ার্কের সমান বড়। OSPF-এর সমাধান দুই স্তরের hierarchical routing: নেটওয়ার্ককে কয়েকটি area-তে ভাগ।

বাংলাদেশের প্রশাসনিক কাঠামো ভাবুন। একটি উপজেলা অফিস নিজের উপজেলার প্রতিটি গ্রামের রাস্তা চেনে। অন্য জেলার ভেতরের প্রতিটি গলি তার জানার দরকার নেই — শুধু জানলেই চলে “ওই জেলার যেকোনো জায়গায় যেতে জেলা সদর হয়ে, মোটামুটি এত দূর”. আর সব জেলা একটি কেন্দ্রীয় মহাসড়ক-ব্যবস্থায় যুক্ত। OSPF-এ উপজেলা হলো area, জেলা সদরের সংযোগস্থল ABR, আর কেন্দ্রীয় মহাসড়ক area 0.

              ┌─────────── Area 0 (backbone) ───────────┐
              │   R-core1 ─────────────── R-core2       │
              └─────┬──────────────────────────┬────────┘
                    │                          │
               ┌────┴────┐                ┌────┴────┐
               │  ABR-1  │                │  ABR-2  │        ASBR ── ISP
               └────┬────┘                └────┬────┘   (বাইরের route আনে)
         ┌──────────┴─────────┐     ┌──────────┴─────────┐
         │ Area 1 (ঢাকা অফিস) │     │ Area 2 (চট্টগ্রাম) │
         │  R11  R12  R13 …   │     │  R21  R22 …        │
         └────────────────────┘     └────────────────────┘
  • Backbone area (area 0): কেন্দ্র। প্রতিটি অন্য area-কে area 0-এর সাথে যুক্ত থাকতে হয়; এক area থেকে আরেক area-র traffic area 0 হয়ে যায়। (ব্যতিক্রমী জোড়াতালি “virtual link” আছে, তবে তা নকশার দুর্বলতার লক্ষণ।)
  • ABR (Area Border Router): যার interface area 0 আর অন্য কোনো area — দুটোতেই। প্রতিটি area-র আলাদা LSDB রাখে, আর এক area-র prefix-গুলো সারসংক্ষেপ করে অন্য area-তে জানায়।
  • ASBR (AS Boundary Router): যে router OSPF-এর বাইরের route (static route, ISP-র default route, BGP থেকে শেখা route) OSPF-এ ঢোকায় — একে বলে redistribution.

LSA-র প্রধান ধরন

Typeনামকে বানায়কী বলে, কতদূর যায়
1Router LSAপ্রতিটি routerনিজের link আর cost — অংশ ২-এর LSA; শুধু নিজের area-র ভেতরে
2Network LSAMulti-access LAN-এর DRLAN-টিতে কোন কোন router আছে; শুধু নিজের area-তে
3Summary LSAABRঅন্য area-র prefix আর সেখানে যাওয়ার cost; ভেতরের topology নয়
4ASBR summaryABRঅন্য area-র ASBR-এ পৌঁছানোর cost
5AS-external LSAASBRবাইরের route (যেমন ISP-র default); পুরো OSPF ডোমেইনে (stub area বাদে)

আরও কয়েকটি ধরন (যেমন type 7) এই পর্বের পরিসরের বাইরে। মূল কথা: area-র ভেতরে link state (type 1, 2 দিয়ে পুরো topology), কিন্তু area-র বাইরে শুধু “এই prefix, এত cost” (type 3) — যা অনেকটা distance vector-এর মতো আচরণ। এই কারণেই area 0-কে কেন্দ্র রাখার কঠোর নিয়ম: সব area-র সারসংক্ষেপ একটি কেন্দ্র দিয়ে গেলে distance vector-ধাঁচের loop তৈরি হতে পারে না।

ABR-এ route summarisation

Area 1-এ যদি 10.1.0.0/24, 10.1.1.0/24, 10.1.2.0/24, 10.1.3.0/24 — চারটি নেটওয়ার্ক থাকে, ABR-1 area 0-তে চারটি type 3 LSA না পাঠিয়ে একটি পাঠাতে পারে: 10.1.0.0/22 (পর্ব ১৭-এর route summarisation). লাভ দুটি: অন্য area-র টেবিল ছোট হয়, আর area 1-এর ভেতরে একটি /24 ওঠানামা করলেও বাইরের কেউ টের পায় না — সারসংক্ষেপ একই থাকে, তাই অন্য area-তে নতুন flooding বা হিসাব লাগে না। দাম: বাইরের router সবসময় সবচেয়ে ভালো পথ জানে না, আর ঠিকানা আগে থেকেই পরিকল্পিতভাবে ভাগ করতে হয়।

Authentication — ভুয়া প্রতিবেশী ঠেকানো

OSPF router সাধারণত যে কারও hello বিশ্বাস করে। কেউ নেটওয়ার্কে একটি যন্ত্র বসিয়ে OSPF চালালে ভুয়া LSA দিয়ে traffic নিজের দিকে টেনে নিতে বা নেটওয়ার্ক অচল করতে পারত। প্রতিরক্ষা:

  • Authentication: OSPFv2-এ শুরু থেকে তিন ধরন — কোনোটি নয়, সাধারণ পাসওয়ার্ড (তারে খোলা অবস্থায় যায়, তাই প্রায় অর্থহীন), আর MD5-ভিত্তিক cryptographic যাচাই। পরে RFC 5709 HMAC-SHA যোগ করে, যা আজ পছন্দের। OSPFv3 প্রথমে IPsec-এর ওপর নির্ভর করত; পরে RFC 7166 নিজস্ব authentication trailer যোগ করে। সব প্রতিবেশীতে একই চাবি আর পদ্ধতি লাগে।
  • Passive interface: ব্যবহারকারী বা সার্ভারের LAN-এ OSPF-এর hello বন্ধ (অংশ ৬)।

৮ · IS-IS, distance vector-এর সাথে তুলনা আর SDN

IS-IS — বড় ISP-র প্রিয় আরেকটি link state protocol

IS-IS (Intermediate System to Intermediate System) মূলত DEC কোম্পানির DECnet Phase V-এর জন্য নকশা করা, পরে ISO-র মান (ISO/IEC 10589). ১৯৯০ সালে RFC 1195 (“Integrated IS-IS”) একে IP route বহনের উপযোগী করে। মূল ধারণা OSPF-এর মতোই — LSP (OSPF-এর LSA-র সমতুল্য), flooding, Dijkstra. পার্থক্যগুলো:

  • IP-র ওপর চলে না: IS-IS-এর বার্তা সরাসরি data link স্তরে (Ethernet frame-এ) যায়, IP packet হিসেবে নয়। তাই IP-র ঠিকানা-ব্যবস্থার গোলমাল IS-IS-এর নিজের যোগাযোগে প্রভাব ফেলে না, আর IP দিয়ে দূর থেকে একে আক্রমণ করাও কঠিন।
  • Area-র বদলে level: Level 1 (area-র ভেতরে) আর Level 2 (area-গুলোর মাঝের backbone).
  • সহজে বাড়ানো যায়: বার্তার তথ্য TLV (type-length-value) আকারে; নতুন ধরনের তথ্য (যেমন IPv6, RFC 5308) নতুন TLV যোগ করেই বহন করা যায়, protocol-এর নতুন সংস্করণ লাগে না।

এসব কারণে অনেক বড় ISP-র backbone-এ IS-IS ব্যবহারের চল আছে, আর প্রতিষ্ঠানের (enterprise) নেটওয়ার্কে OSPF বেশি দেখা যায় — যদিও এটি একটি সাধারণ প্রবণতা, কোনো নিয়ম নয়।

Link state বনাম distance vector

বিষয়Link state (OSPF, IS-IS)Distance vector (RIP; পর্ব ২৩)
কে কী জানেসবাই পুরো topologyপ্রত্যেকে শুধু প্রতিবেশীর দেওয়া দূরত্ব
কী পাঠায়, কাকেনিজের link-এর খবর, সবাইকে (flooding)নিজের পুরো দূরত্ব-তালিকা, শুধু প্রতিবেশীকে
AlgorithmDijkstra, প্রতিটি router-এ আলাদাভাবেBellman-Ford, সবাই মিলে ধাপে ধাপে
Convergenceদ্রুত: flooding শেষ হলেই সবাই হিসাব করেধীর; খারাপ খবরে count-to-infinity সম্ভব
ভুলের ছড়ানোএক router-এর ভুল মূলত নিজের link-এর তথ্যে সীমিতভুল হিসাব অন্যদের হিসাবে ঢুকে ছড়ায়
মেমরি আর CPUবেশি — পুরো LSDB আর Dijkstraকম
বার্তাপরিবর্তনে flooding: O(V × E); স্থির অবস্থায় শুধু hello আর মাঝে মাঝে refreshপ্রতিবেশীর সাথে নিয়মিত পুরো তালিকা (RIP-এ প্রতি ৩০ সেকেন্ডে)
কনফিগারেশনজটিল (area, DR, cost)সরল

Count-to-infinity আর Bellman-Ford-এর বিস্তারিত পর্ব ২৩-এ (distance vector) — এখানে আর পুনরাবৃত্তি করছি না। Link state-এও পরিবর্তনের মুহূর্তে অল্প সময়ের loop (microloop) হতে পারে, কিন্তু flooding শেষ হলেই তা মিলিয়ে যায় (ভাবনার প্রশ্ন ২)।

SDN — কেন্দ্রীয় হিসাব, link state-এর আত্মীয়

Link state-এ প্রতিটি router একই হিসাব আলাদাভাবে করে। পুরো topology এক জায়গায় জমা করে একটি কেন্দ্রেই হিসাব করে সবাইকে টেবিল পাঠালে? এটিই SDN-এর কেন্দ্রীয় control plane-এর ধারণা (পর্ব ১৫-এ পরিচয়, বিস্তারিত পর্ব ৫৩)। পার্থক্য শুধু কোথায় হিসাব হয় — প্রতিটি যন্ত্রে নাকি এক কেন্দ্রে (ভাবনার প্রশ্ন ৫)।

আরও গভীরে: বাস্তব OSPF বাস্তবায়ন প্রতিটি LSA আসামাত্র Dijkstra চালায় না; একটি “SPF throttle” timer কয়েক মিলিসেকেন্ড অপেক্ষা করে একসাথে আসা পরিবর্তনগুলো জড়ো করে, আর বারবার পরিবর্তন হলে অপেক্ষা ধাপে ধাপে বাড়ায়। শুধু type 3 বা type 5 LSA বদলালে পুরো Dijkstra না চালিয়ে আংশিক হিসাবই যথেষ্ট (partial route calculation), আর কিছু বাস্তবায়নে incremental SPF শুধু বদলে যাওয়া অংশের গাছ নতুন করে বানায়। তারও আগে, ব্যর্থতার মুহূর্তে কয়েক মিলিসেকেন্ডে বিকল্প পথে যেতে router আগে থেকেই একটি “loop-free alternate” হিসাব করে রাখতে পারে (RFC 5286, আর আধুনিক TI-LFA). Linux-এ FRRouting-এর ospfd আর BIRD পুরো OSPF বাস্তবায়ন করে, আর হিসাবের ফল kernel-এর FIB-এ netlink দিয়ে বসায় — ip route-এ এগুলো proto ospf চিহ্নসহ দেখা যায়।

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

  • Link state আর distance vector-এর মূল পার্থক্য? — LS: সবাই পুরো topology জানে, নিজের link-এর খবর সবাইকে flood করে, Dijkstra চালায়; DV: শুধু প্রতিবেশীকে পুরো দূরত্ব-তালিকা, Bellman-Ford, ধীর convergence আর count-to-infinity.
  • LSA-তে sequence number আর age কেন? — Sequence: নতুন আর পুরোনো/নকল কপি আলাদা করা; age: মৃত router-এর পুরোনো LSA একসময় মুছে ফেলা আর নিয়মিত refresh.
  • OSPF কোন transport protocol ব্যবহার করে? — কোনোটিই নয়; সরাসরি IP-র ওপর, protocol number 89; multicast 224.0.0.5 আর 224.0.0.6.
  • DR/BDR কেন আর কীভাবে নির্বাচিত হয়? — Multi-access LAN-এ adjacency n(n−১)/২ থেকে 2n−3-এ নামাতে; সবচেয়ে বড় priority, সমান হলে সবচেয়ে বড় router ID; priority ০ বাদ; non-preemptive.
  • Area 0 কেন বাধ্যতামূলক? — Area-গুলোর মাঝে OSPF distance vector-এর মতো সারসংক্ষেপ বিনিময় করে; সব area একটি backbone দিয়ে যুক্ত থাকলে inter-area loop হতে পারে না।

৯ · AI-এর যুগে link state আর OSPF

AI দ্রুত OSPF কনফিগারেশন লেখে বা Dijkstra-র টেবিল বানায়, কিন্তু কিছু ভুল প্রায়ই করে, যা দেখতে নির্ভুল:

AI-এর ভুলকেন ভুলকীভাবে ধরবেন
Dijkstra-র টেবিলে কোনো ধাপে ভুল মান, অথচ শেষ উত্তর “ঠিক”AI প্রায়ই ধাপগুলো বানিয়ে লেখে; সমান মানের ক্ষেত্রে p(v) ইচ্ছামতো বদলায়অংশ ৩-এর simulator-এ একই graph চালিয়ে প্রতিটি সারি মেলান
“OSPF চলে TCP/UDP port 89-এ”89 একটি IP protocol number, port নয়RFC 2328 আর IANA-র protocol number-এর তালিকা দেখুন; packet capture-এ IP header-এর Protocol ঘর
“বেশি priority-র router যোগ করলেই সে DR হয়ে যাবে”নির্বাচন non-preemptiveল্যাবে নতুন router যোগ করে neighbour টেবিল দেখুন
Router ID লেখা (string) হিসেবে তুলনা32 bit সংখ্যা হিসেবে তুলনা হয়অংশ ৬-এর calculator
“OSPF cost সবসময় 108 ÷ bandwidth”এটি vendor-এর ডিফল্ট, মান নয়; reference বদলানো যায় আর বদলানো উচিতনিজের যন্ত্রের ডকুমেন্টেশন; show ip ospf interface-এ আসল cost
বানানো RFC নম্বর বা ভুল সংস্করণOSPFv2 = RFC 2328, OSPFv3 = RFC 5340rfc-editor.org-এ নম্বর খুলে শিরোনাম মেলান
Authentication ছাড়া, সব interface-এ OSPF চালু করা কনফিগারেশনব্যবহারকারীর LAN থেকে ভুয়া route ঢোকানো সম্ভবPassive interface আর HMAC-SHA authentication আছে কি না দেখুন

AI-কে routing-এর প্রশ্ন দিলে graph বা কনফিগারেশন হুবহু দিন, আর যাচাইয়ের শর্ত জুড়ে দিন:

নিচের graph-এ উৎস A থেকে Dijkstra চালাও। Link: A-B 4, A-C 2, B-C 1, B-D 5, C-D 8, C-E 10, D-E 2, D-F 6, E-F 2 (দুই দিকেই একই cost). ১. প্রতিটি ধাপের জন্য step, N', আর প্রতিটি node-এর D(v),p(v) — পরীক্ষার টেবিলের ধরনে দাও; N'-এ ঢুকে যাওয়া node-এর ঘর ফাঁকা রাখো। ২. সমান D হলে বর্ণক্রমে আগেরটি নেবে, আর সমান cost-এ p(v) বদলাবে না — এই নিয়ম মেনে চলো। ৩. শেষে A-র forwarding table: গন্তব্য, cost, পুরো পথ, প্রথম link. ৪. কোনো ধাপে নিশ্চিত না হলে স্পষ্ট বলো; অনুমান করে মান বসাবে না। ৫. OSPF-এর কোনো তথ্য দিলে (timer, LSA type, RFC) প্রতিটির সূত্র লেখো, আর কোনটি vendor-এর ডিফল্ট আর কোনটি মান, আলাদা করে বলো।

AI-এর উত্তর মানার আগে — চেকলিস্ট

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

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

প্র ০১১৯৮০ সালে ARPANET কয়েক ঘণ্টার জন্য প্রায় পুরোপুরি অচল হয়েছিল — কারণ ছিল link state-এর বার্তার sequence number. কী ঘটেছিল, আর OSPF-এর নকশায় তার শিক্ষা কোথায়?

ARPANET-এর প্রথম routing ছিল distance vector ধাঁচের। ধীর convergence আর loop-এর কারণে ১৯৭৯–৮০ সালের দিকে BBN-এর প্রকৌশলীরা (John McQuillan-সহ) নতুন একটি পদ্ধতি চালু করেন: প্রতিটি packet switch (তখনকার নাম IMP) নিজের link-এর delay মেপে একটি update বার্তা পুরো নেটওয়ার্কে flood করত, আর প্রত্যেকে SPF হিসাব করত — আধুনিক link state-এর পূর্বসূরি। পুরোনো আর নতুন update আলাদা করতে বার্তায় ছিল ছোট একটি sequence number, যা শেষ সীমায় পৌঁছে আবার শুরুতে ফিরে আসত (circular). তুলনার নিয়ম ছিল মোটামুটি “বৃত্তে যেটি সামনে, সেটি নতুন”.

১৯৮০ সালের ২৭ অক্টোবর একটি IMP-এর hardware ত্রুটিতে একই উৎসের তিনটি update তৈরি হয়, যাদের sequence number-গুলোর মধ্যে এমন সম্পর্ক ছিল যে বৃত্তাকার নিয়মে A-র চেয়ে B নতুন, B-র চেয়ে C নতুন, আবার C-র চেয়ে A নতুন! প্রতিটি IMP প্রতিটি কপিকে “নতুন” ধরে রাখত আর আবার flood করত। তিনটি বার্তা অনন্তকাল নেটওয়ার্কে ঘুরতে থাকল, IMP-গুলোর মেমরি আর লাইন দখল করে। স্বাভাবিক কোনো ব্যবস্থায় এরা থামছিল না — শেষে IMP-গুলোকে বন্ধ করে নতুন করে চালু করতে হয়েছিল, আর পুরো নেটওয়ার্ক কয়েক ঘণ্টা কার্যত অচল ছিল। ঘটনার বিশ্লেষণ Eric Rosen লেখেন RFC 789-এ (১৯৮১), যা আজও নেটওয়ার্ক-প্রকৌশলের ব্যর্থতা-বিশ্লেষণের একটি ধ্রুপদী দলিল।

OSPF-এর নকশায় এর শিক্ষা স্পষ্ট। প্রথমত, sequence number রৈখিক (অংশ ২-এর সতর্কবার্তা) — 0x80000001 থেকে 0x7FFFFFFF পর্যন্ত শুধু বাড়ে, তাই “কোনটি বড়” সবসময় একটি নিশ্চিত উত্তর। দ্বিতীয়ত, age — প্রতিটি LSA এক ঘণ্টায় মরে যায় যদি উৎস তাকে নবায়ন না করে, তাই কোনো অদ্ভুত বার্তা চিরকাল টিকে থাকতে পারে না। তৃতীয়ত, প্রতিটি LSA-র নিজস্ব checksum, যাতে hardware-এর ত্রুটিতে বিকৃত বার্তা ধরা পড়ে।

মূল উপলব্ধি: বিতরণকৃত ব্যবস্থায় “কোন খবর নতুন” প্রশ্নটি দেখতে তুচ্ছ, কিন্তু এর উত্তরে সামান্য অস্পষ্টতা পুরো নেটওয়ার্ক অচল করতে পারে। রৈখিক sequence, age আর checksum — তিনটি মিলে নিশ্চিত করে যে পুরোনো বা বিকৃত খবর একসময় মরবেই।

প্র ০২প্রতিটি router যদি একই database থেকে নিজে নিজে Dijkstra চালায়, তাহলে router-গুলোর সিদ্ধান্ত পরস্পরের সাথে মেলে কেন? আর মেলা জরুরিই বা কেন?

Routing-এ প্রতিটি router শুধু ঠিক করে packet-কে পরের hop-এ দেবে কাকে। পুরো পথটি তৈরি হয় অনেক router-এর আলাদা আলাদা সিদ্ধান্ত জোড়া দিয়ে। ধরুন u থেকে z-এ packet যাবে। u ঠিক করল packet যাবে x-এ। এখন x-কে নিজে ঠিক করতে হবে যে packet যাবে y-এ, তারপর y ঠিক করবে — z-এ। যদি x অন্য কোনো মানচিত্র দেখে ভাবত “u দিয়ে যাওয়াই ভালো”, তাহলে packet u আর x-এর মাঝে পিংপং বলের মতো ঘুরত — একটি routing loop, যতক্ষণ না TTL শেষ হয়।

Link state এটি এড়ায় একটি সুন্দর গাণিতিক বৈশিষ্ট্যে: সবচেয়ে ছোট পথের যেকোনো অংশও নিজে সবচেয়ে ছোট পথ (optimal substructure). u থেকে z-এর সবচেয়ে ছোট পথ যদি u-x-y-z হয়, তবে x থেকে z-এর সবচেয়ে ছোট পথ অবশ্যই x-y-z (নইলে x থেকে z-এর একটি ছোট পথ নিয়ে u-র পথটিও আরও ছোট করা যেত)। তাই x যখন নিজের database-এ Dijkstra চালায়, সে-ও z-এর জন্য y-কে বেছে নেয় — u-র হিসাবের সাথে মিলে যায়। শর্ত দুটি: সবার database হুবহু এক, আর সমান cost-এর পথের ক্ষেত্রে এমন tie-break যা loop তৈরি করে না (বাস্তবে সমান cost-এর একাধিক পথ থাকলে OSPF সবগুলোই ব্যবহার করতে পারে — ECMP — আর তাতেও loop হয় না, কারণ প্রতিটি পথই সবচেয়ে ছোট)।

সমস্যা হয় ঠিক পরিবর্তনের মুহূর্তে। একটি link কাটলে কাছের router খবরটি আগে পায় আর আগে হিসাব করে; দূরের router তখনো পুরোনো মানচিত্রে। এই কয়েক মিলিসেকেন্ড থেকে কয়েকশো মিলিসেকেন্ডে দুটি router-এর database আলাদা — তখন microloop হতে পারে। এজন্যই flooding দ্রুত হওয়া জরুরি। Distance vector-এ এই অসমতা অনেক বেশি সময় থাকে, কারণ খবর এক hop এক hop করে এগোয়।

মূল উপলব্ধি: Link state-এ সমন্বয় আসে বার্তা-বিনিময় থেকে নয়, “একই তথ্য + একই algorithm = একই সিদ্ধান্ত” থেকে। তাই database-কে সবার কাছে এক রাখাই পুরো protocol-এর আসল কাজ।

প্র ০৩OSPF আর IS-IS প্রায় একই ধারণার ওপর দাঁড়িয়ে, তবু কেন বিশ্বের অনেক বড় ISP IS-IS বেছে নেয়, আর প্রতিষ্ঠানের নেটওয়ার্কে OSPF বেশি দেখা যায়?

১৯৮০-এর দশকের শেষে দুটি ধারা পাশাপাশি চলছিল। একদিকে ISO-র OSI protocol-সমষ্টি, যাকে তখন অনেক সরকার আর বড় কোম্পানি ভবিষ্যৎ ভাবত; DEC-এর DECnet Phase V-এর জন্য নকশা করা IS-IS এই ধারার routing protocol হিসেবে ISO-র মান হয়। অন্যদিকে IETF-এর TCP/IP. IETF-এ John Moy-র নেতৃত্বে OSPF তৈরি হয় — প্রথম সংস্করণ RFC 1131 (১৯৮৯), তারপর OSPFv2, শেষে RFC 2328 (১৯৯৮)। একই সময়ে Ross Callon RFC 1195 (১৯৯০)-এ দেখান, IS-IS দিয়েই একসাথে OSI আর IP দুটোর route বহন করা যায় — “Integrated IS-IS”.

নব্বইয়ের দশকের শুরুতে অনেক বড় আমেরিকান ISP দ্রুত বাড়ছিল, আর তখন কয়েকটি বড় router নির্মাতার IS-IS বাস্তবায়ন বেশি পরিপক্ক ও স্থিতিশীল বলে বিবেচিত হতো। একবার একটি বড় backbone একটি protocol-এ চললে বদলানোর ঝুঁকি কেউ নিতে চায় না। প্রযুক্তিগত কারণও আছে। IS-IS সরাসরি data link স্তরে চলে, তাই IP ঠিকানার ভুল কনফিগারেশন বা IP-ভিত্তিক আক্রমণ তার নিজের যোগাযোগে কম প্রভাব ফেলে। TLV-ভিত্তিক বার্তা নতুন তথ্য যোগ করা সহজ করে: IPv6 এলে IS-IS-এ শুধু নতুন TLV যোগ হলো, অথচ OSPF-কে IPv6-এর জন্য প্রায় নতুন একটি সংস্করণ (OSPFv3) বানাতে হলো।

আজ দুটোই পরিপক্ক, আর অনেক আধুনিক বৈশিষ্ট্য (segment routing, দ্রুত reroute) দুটোতেই আছে। পছন্দটি প্রায়ই প্রযুক্তির চেয়ে ইতিহাস, দলের অভিজ্ঞতা আর যন্ত্রের সমর্থনের ওপর নির্ভর করে — এটি একটি সাধারণ প্রবণতা, কোনো কঠোর নিয়ম নয়।

মূল উপলব্ধি: প্রযুক্তির জয়-পরাজয় শুধু নকশার গুণে হয় না; কখন, কারা, কোন বাস্তবায়ন দিয়ে শুরু করেছিল — তাও ঠিক করে দেয় দশকের পর দশক কোন protocol চলবে।

প্র ০৪OSPF-এ area ভাগ করলে প্রতিটি router-এর কাজ কমে — তাহলে পুরো নেটওয়ার্ককে যতটা সম্ভব ছোট ছোট area-তে ভাগ করা কি সবসময় ভালো? Hierarchical routing-এর দাম কী?

Area-র লাভ সহজে মাপা যায়। একটি area-র ভেতরের router শুধু নিজের area-র topology রাখে, তাই LSDB ছোট, Dijkstra দ্রুত, আর ABR সারসংক্ষেপ করে রাখলে অন্য area-র link ওঠানামা সে প্রায় টেরই পায় না। একটি area-র ঝামেলা (যেমন বারবার ওঠানামা করা link — flapping) পুরো নেটওয়ার্ককে ব্যস্ত রাখে না।

কিন্তু দাম আছে। প্রথম দাম সর্বোত্তম পথ হারানো: area-র বাইরের router অন্য area-র ভেতরের খুঁটিনাটি দেখে না, শুধু ABR-এর দেওয়া “এই prefix, এত cost” দেখে। দুটি ABR থাকলে কোনটি দিয়ে গেলে গন্তব্যের সবচেয়ে কাছে, তা সারসংক্ষেপের কারণে সবসময় ঠিকভাবে বোঝা যায় না, ফলে কখনো লম্বা পথ বাছাই হয়। দ্বিতীয় দাম কাঠামোর বাধ্যবাধকতা: সব area-কে area 0-এর সাথে যুক্ত থাকতে হবে, আর area-র মাঝের traffic area 0 দিয়ে যাবে — বাস্তব তার-বিন্যাস সবসময় এর সাথে মেলে না। তৃতীয় দাম জটিলতা: বেশি area মানে বেশি ABR, বেশি সারসংক্ষেপের নিয়ম, আর ভুলের বেশি সুযোগ। আর সারসংক্ষেপ একটি সূক্ষ্ম বিপদও আনে: ভেতরের একটি নেটওয়ার্ক পুরোপুরি হারিয়ে গেলেও ABR সারসংক্ষেপটি ঘোষণা করে যেতে পারে, ফলে বাইরের traffic এসে ABR-এ গিয়ে ফেলে দেওয়া হয়।

আগের যুগের দুর্বল CPU আর অল্প মেমরির কারণে একসময় area ছোট রাখার কঠোর পরামর্শ দেওয়া হতো। আজকের router-এ একটি area-তে কয়েকশো router নিয়েও অনেক নেটওয়ার্ক স্বচ্ছন্দে চলে, তাই আধুনিক নকশায় প্রায়ই কম কিন্তু বড় area দেখা যায়।

মূল উপলব্ধি: Hierarchy মাপযোগ্যতা দেয়, বিনিময়ে নেয় তথ্য আর নমনীয়তা। ভালো নকশা প্রয়োজনের চেয়ে বেশি ভাগ করে না — যন্ত্রের সামর্থ্য বাড়ার সাথে সাথে সেই প্রয়োজনও বদলায়।

প্র ০৫Link state-এ প্রতিটি router একই হিসাব আলাদাভাবে করে — অপচয় মনে হয়। SDN-এর মতো একটি কেন্দ্রে হিসাব করলে কী পাওয়া যায়, কী হারানো যায়? বাস্তবে বড় কোম্পানিগুলো কী করছে?

Link state-এর বিতরণকৃত হিসাবের সবচেয়ে বড় গুণ স্বাধীনতা। প্রতিটি router নিজের database থেকে নিজে সিদ্ধান্ত নেয়; কোনো কেন্দ্র নেই, তাই কোনো কেন্দ্র নষ্টও হতে পারে না। “একই হিসাব বারবার” আসলে সস্তা: আধুনিক CPU-তে কয়েকশো node-এর Dijkstra মিলিসেকেন্ডের কাজ।

কেন্দ্রীয় হিসাবের লাভ অন্য জায়গায়। Dijkstra শুধু “প্রতিটি গন্তব্যের সবচেয়ে কম cost-এর পথ” দেয় — প্রতিটি router স্বার্থপরভাবে নিজের সেরা পথ বেছে নেয়, আর সবাই একই সস্তা link-এ ভিড় করতে পারে। একটি কেন্দ্র পুরো নেটওয়ার্কের traffic-এর চাহিদা জেনে সামগ্রিকভাবে হিসাব করতে পারে: কোন traffic কোন পথে গেলে কোনো link উপচে পড়বে না, কোন কম জরুরি traffic রাতে সরানো যায়।

বাস্তবে Google ২০১৩ সালে প্রকাশ করে, তাদের data center-গুলোর মাঝের WAN (B4) কেন্দ্রীয় traffic engineering দিয়ে link-গুলোকে প্রচলিত নেটওয়ার্কের চেয়ে অনেক বেশি ব্যবহারে চালায়। তবে এমন নকশাতেও controller-এর সাথে যোগাযোগ কাটলে switch-গুলো শেষ জানা টেবিলে চলতে থাকে — কেন্দ্র নষ্ট হলেও নেটওয়ার্ক যেন চলে। অনেক ISP-ও আজ মিশ্র পথে চলে: IS-IS বা OSPF মৌলিক reachability দেয়, আর একটি কেন্দ্রীয় controller (যেমন segment routing-এর পথ হিসাব করে এমন একটি PCE) বিশেষ traffic-এর জন্য বিশেষ পথ বসায়।

মূল উপলব্ধি: বিতরণকৃত link state স্থিতিস্থাপকতা দেয়, কেন্দ্রীয় হিসাব সামগ্রিক দক্ষতা দেয়। আধুনিক বড় নেটওয়ার্ক দুটিকে স্তরে স্তরে মেলায় — নিচে বিশ্বস্ত link state, ওপরে বুদ্ধিমান controller.

অনুশীলন

খাতা-কলম নিন — প্রতিটি টেবিল নিজে বানিয়ে তারপর উত্তর মেলান। নিয়ম: সমান D-তে বর্ণক্রমে আগেরটি; সমান cost-এ p(v) বদলায় না।

  1. Dijkstra-র টেবিল (পরীক্ষার ধরন): ৬টি router, link-এর cost: A–B ৪, A–C ২, B–C ১, B–D ৫, C–D ৮, C–E ১০, D–E ২, D–F ৬, E–F ২ (দুই দিকেই একই)। উৎস A. সম্পূর্ণ N′/D(v),p(v) টেবিল আর A-র forwarding table লিখুন।
    step N'      D(B),p(B) D(C),p(C) D(D),p(D) D(E),p(E) D(F),p(F)
    0    A       4,A       2,A       inf       inf       inf
    1    AC      3,C                 10,C      12,C      inf
    2    ACB                         8,B       12,C      inf
    3    ACBD                                  10,D      14,D
    4    ACBDE                                           12,E
    5    ACBDEF
    
    dest  cost  path          next hop (link)
    B     3     A-C-B         (A,C)
    C     2     A-C           (A,C)
    D     8     A-C-B-D       (A,C)
    E     10    A-C-B-D-E     (A,C)
    F     12    A-C-B-D-E-F   (A,C)

    ধাপ ১ (C যোগ, D = ২): B-তে ২ + ১ = ৩ < ৪ → ৩,C; D-তে ২ + ৮ = ১০ → ১০,C; E-তে ২ + ১০ = ১২ → ১২,C. ধাপ ২ (B, ৩): D-তে ৩ + ৫ = ৮ < ১০ → ৮,B. ধাপ ৩ (D, ৮): E-তে ৮ + ২ = ১০ < ১২ → ১০,D; F-তে ৮ + ৬ = ১৪ → ১৪,D. ধাপ ৪ (E, ১০): F-তে ১০ + ২ = ১২ < ১৪ → ১২,E. ধাপ ৫: F. লক্ষ করুন, A–B-এর সরাসরি link (৪) হেরে গেল C দিয়ে ঘোরা পথের (৩) কাছে, আর সব গন্তব্যের প্রথম link (A,C). অংশ ৩-এর simulator-এ links আর nodes বদলে আপনি নিজেই এই টেবিল মেলাতে পারবেন।

  2. আউটপুট অনুমান করুন: অংশ ৩-এর dijkstra_table.js-এ শুধু ["x","y",1] বদলে ["x","y",4] করা হলো। নতুন টেবিল আর forwarding table কী হবে? বিশেষ করে ভাবুন: কোন ধাপে একটি “সমান cost” পরিস্থিতি আসে, আর তখন p(·) কী থাকে?
    step N'      D(v),p(v) D(w),p(w) D(x),p(x) D(y),p(y) D(z),p(z)
    0    u       2,u       5,u       1,u       inf       inf
    1    ux      2,u       4,x                 5,x       inf
    2    uxv               4,x                 5,x       inf
    3    uxvw                                  5,x       9,w
    4    uxvwy                                           7,y
    5    uxvwyz
    
    v     2     u-v       (u,v)
    w     4     u-x-w     (u,x)
    x     1     u-x       (u,x)
    y     5     u-x-y     (u,x)
    z     7     u-x-y-z   (u,x)

    ধাপ ১-এ y = ১ + ৪ = ৫ (x দিয়ে)। এবার w (৪) y-এর (৫) আগে N′-এ ঢোকে (ধাপ ৩)। w থেকে y-তে ৪ + ১ = ৫ — বর্তমান ৫-এর সমান, তাই নিয়ম অনুযায়ী p(y) = x থেকে যায় (কোডে <, <= নয়)। একই ধাপে z = ৪ + ৫ = ৯ (w দিয়ে), পরে ধাপ ৪-এ y দিয়ে ৫ + ২ = ৭ < ৯ → ৭,y. সমান cost-এর ক্ষেত্রে কোনো বই p(y) = w লিখলেও cost একই (৫) — দুটি পথই সমান ভালো; বাস্তব OSPF এমন ক্ষেত্রে দুটি পথে traffic ভাগ করতে পারে (ECMP).

  3. OSPF cost-এর হিসাব: R1 থেকে R4-এ তিনটি পথ: পথ ক — R1–R2 (১ Gbps), R2–R4 (১ Gbps); পথ খ — R1–R3 (১০ Gbps), R3–R4 (১০ Gbps); পথ গ — R1–R4 সরাসরি (১০০ Mbps). (ক) ডিফল্ট reference ১০০ Mbps-এ প্রতিটি পথের cost কত, আর OSPF কোন পথ বাছবে? (খ) সব router-এ reference ১০০ Gbps করলে? (গ) এই ফলাফল থেকে একটি নকশার শিক্ষা লিখুন।

    (ক) ref ১০০ Mbps-এ ১ Gbps, ১০ Gbps আর ১০০ Mbps — সবার cost ১ (১০০ ÷ ১০০০ = ০.১ → কমপক্ষে ১)। পথ ক = ১ + ১ = ২, পথ খ = ১ + ১ = ২, পথ গ = ১. OSPF বাছবে পথ গ — সবচেয়ে ধীর, ১০০ Mbps-এর link! দুটি ১০ Gbps link-এর পথ অব্যবহৃত পড়ে থাকবে।

    (খ) ref ১০০,০০০ Mbps-এ: ১ Gbps = ১০০, ১০ Gbps = ১০, ১০০ Mbps = ১০০০. পথ ক = ১০০ + ১০০ = ২০০, পথ খ = ১০ + ১০ = ২০, পথ গ = ১০০০. OSPF বাছবে পথ খ — যা আমরা চাই।

    (গ) ডিফল্ট reference আধুনিক গতিতে সব দ্রুত link-কে সমান করে দেয়, ফলে hop-সংখ্যাই সিদ্ধান্ত নেয়। তাই নেটওয়ার্কের সব router-এ একই, সবচেয়ে দ্রুত link-এর সমান বা বড় reference বসানো উচিত (অথবা গুরুত্বপূর্ণ link-এ হাতে cost). শুধু কয়েকটিতে বদলালে router-গুলো ভিন্ন মাপে cost ঘোষণা করবে — পথ বাছাই অপ্রত্যাশিত হবে।

  4. DR/BDR, adjacency আর LSA — একটি ঘটনা ধরে: একটি Ethernet LAN-এ ৬টি OSPF router: P (priority ১, ID 192.168.1.1), Q (০, 192.168.1.9), R (৫, 10.0.0.1), S (৫, 10.0.0.20), T (১, 172.16.0.1), U (১, 192.168.1.2). (ক) DR আর BDR কে? (খ) পূর্ণ adjacency কয়টি, আর DR না থাকলে কয়টি হতো? (গ) DR নষ্ট হলে নতুন DR আর BDR কে? (ঘ) এই LAN-এর জন্য type 2 LSA কে বানায়, আর LAN-টি যদি area 1-এ থাকে, area 0-এর router-রা এর prefix কোন LSA type-এ জানবে?

    (ক) Q বাদ (priority ০)। সবচেয়ে বড় priority ৫ — R আর S. সমান, তাই router ID সংখ্যা হিসেবে: 10.0.0.20 > 10.0.0.1 → S = DR. BDR: বাকিদের মধ্যে R-এর priority ৫ সবচেয়ে বড় → R = BDR. (নতুন LAN-এ একসাথে চালু হলে; non-preemptive হওয়ায় চালু হওয়ার ক্রম ভিন্ন হলে ফল ভিন্ন হতে পারে।)

    (খ) n = ৬: DR/BDR-সহ 2n − 3 = ৯টি; সবাই সবার সাথে হলে ৬ × ৫ ÷ ২ = ১৫টি।

    (গ) S নষ্ট → BDR R হয় DR. নতুন BDR: বাকি P, T, U-এর priority ১ (Q বাদ) — router ID সংখ্যা হিসেবে 192.168.1.2 > 192.168.1.1 > 172.16.0.1, তাই U = BDR.

    (ঘ) Type 2 (Network LSA) বানায় LAN-এর DR, আর তা থাকে শুধু area 1-এর ভেতরে। Area 0-এর router-রা এর prefix জানবে area 1-এর ABR-এর পাঠানো type 3 (Summary LSA)-তে — ভেতরের topology ছাড়া, শুধু prefix আর cost.

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

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

ক্রমএকটি link state router নতুন নেটওয়ার্কে চালু হলো — ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. প্রতিটি interface-এ hello পাঠিয়ে প্রতিবেশী খোঁজা
  2. প্রতিটি প্রতিবেশীর link-এর cost ঠিক করা
  3. নিজের link আর cost দিয়ে sequence number-সহ LSA বানানো
  4. LSA সব router-এ flood করা আর অন্যদের LSA জমা করা
  5. সম্পূর্ণ database-এ নিজেকে উৎস ধরে Dijkstra চালানো
  6. প্রতিটি গন্তব্যের প্রথম link দিয়ে forwarding table বসানো

একটি নেটওয়ার্কে link-এর cost: A–B ১, A–C ৪, B–C ২, B–D ৫, C–D ১ (দুই দিকেই একই)। A থেকে D-এর সবচেয়ে কম cost আর A-র forwarding table-এ D-এর জন্য প্রথম link কোনটি?

  • cost ৫, প্রথম link (A,C)
  • cost ৪, প্রথম link (A,B)
  • cost ৬, প্রথম link (A,B)
  • cost ৩, প্রথম link (A,C)

একটি router-এর database-এ router X-এর LSA আছে sequence ২০ নিয়ে। এক প্রতিবেশী থেকে X-এর LSA এলো sequence ১৮ নিয়ে। Link state flooding-এর নিয়মে router কী করবে?

  • ১৮-কে রেখে বাকি সব প্রতিবেশীকে পাঠাবে
  • শুধু ফেলে দেবে, আর কিছু করবে না
  • ১৮-কে ফেলে দেবে আর নিজের sequence ২০-এর কপি প্রেরককে পাঠাবে
  • দুটিই রেখে Dijkstra আবার চালাবে

OSPFv2-এর বার্তা কিসের ওপর দিয়ে যায়?

  • TCP port 89
  • UDP port 520
  • TCP port 179
  • সরাসরি IP-র ওপর, IP protocol number 89

একটি Ethernet LAN-এ চারটি OSPF router একসাথে চালু হলো: R1 (priority ১, router ID 10.1.1.1), R2 (priority ০, ID 10.9.9.9), R3 (priority ৫, ID 10.0.0.3), R4 (priority ৫, ID 10.0.0.30). DR আর BDR কে?

  • DR = R4, BDR = R3
  • DR = R3, BDR = R4
  • DR = R2, BDR = R4
  • DR = R4, BDR = R1

ডিফল্ট reference bandwidth ১০০ Mbps থাকলে একটি ১ Gbps আর একটি ১০ Gbps interface-এর OSPF cost কত, আর এতে কী সমস্যা হয়?

  • ০.১ আর ০.০১; কোনো সমস্যা নেই
  • দুটিই ১; OSPF দুটি link-কে সমান ভাবে
  • ১০ আর ১০০; ধীর link বেশি পছন্দ হয়
  • দুটিই ০; link দুটি ব্যবহার হয় না

OSPF-এ এক area-র prefix-গুলো অন্য area-তে Summary LSA (type 3) হিসেবে কে পাঠায়?

  • LAN-এর DR
  • ASBR
  • ABR (Area Border Router)
  • Area-র ভেতরের যেকোনো router

শব্দকোষ

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

মনে রাখুন

  1. Link state = সবার হাতে পুরো মানচিত্র: প্রতিটি router নিজের link-এর খবর (LSA) সবাইকে flood করে; সবার LSDB এক, আর প্রত্যেকে নিজে Dijkstra চালায় — একই তথ্য, একই algorithm, তাই সিদ্ধান্ত মেলে।
  2. Flooding-এর তিন নিয়ম: বড় sequence — রাখা, ack আর বাকিদের পাঠানো; সমান — ফেলে দেওয়া; ছোট — ফেলে দিয়ে নিজের নতুন কপি ফেরত। Age (MaxAge ১ ঘণ্টা, refresh ৩০ মিনিট) পুরোনো খবর মুছে দেয়।
  3. Dijkstra: N′-এর বাইরে সবচেয়ে ছোট D বাছাই, যোগ, প্রতিবেশী হালনাগাদ; টেবিলে N′, D(v),p(v); forwarding table-এ শুধু প্রথম link. O(n²), heap দিয়ে O((E+V) log V); cost অঋণাত্মক হতে হবে।
  4. OSPF: IP protocol 89, multicast 224.0.0.5/6, hello ১০ আর dead ৪০ সেকেন্ড (broadcast-এ সাধারণ ডিফল্ট), Down → Init → 2-Way → ExStart → Exchange → Loading → Full; DR/BDR: বড় priority, তারপর বড় router ID, non-preemptive, adjacency 2n − 3.
  5. Cost আর area: cost = reference ÷ bandwidth — ডিফল্ট ১০০ Mbps আজ খুব ছোট, সব router-এ বাড়ানো দরকার। Area 0 কেন্দ্র, ABR সারসংক্ষেপ (type 3) করে, ASBR বাইরের route (type 5) আনে; authentication আর passive interface ভুয়া প্রতিবেশী ঠেকায়।

পরের পর্বে: OSPF আর IS-IS একটি প্রতিষ্ঠানের ভেতরে পথ বের করে। কিন্তু হাজার হাজার আলাদা প্রতিষ্ঠানের নেটওয়ার্ক জুড়ে যে ইন্টারনেট, সেখানে কেউ কাউকে নিজের পুরো মানচিত্র দেখায় না — সেখানে চলে নীতি আর চুক্তির protocol BGP, autonomous system, peering আর IXP.

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

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