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

Routing-এর ভিত্তি — routing table, static route আর longest prefix match

Routing Fundamentals — Routing Tables, Static Routes, Longest Prefix Match, Administrative Distance and ECMP

Taught in Bangla, this lesson frames routing as a least-cost graph problem, then reads routing tables on Cisco, Linux and Windows: prefix, next hop, interface, metric and source. It covers longest prefix match, administrative distance and metric tie-breaking, binary trie, Patricia trie and TCAM lookups, static and floating static routes, loops caught by TTL, ECMP, policy-based routing and IGP versus EGP classification.

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

  • নেটওয়ার্ককে graph হিসেবে দেখা, least-cost path আর optimality principle — কেন প্রতিটি router-এ শুধু next hop রাখলেই চলে
  • Routing table-এর প্রতিটি ঘর পড়া — Cisco-র show ip route, Linux-এর ip route আর Windows-এর route print
  • Longest prefix match, তারপর AD, তারপর metric — হাতে, stepper-এ আর একটি চালানো যায় এমন routing-table engine-এ
  • Binary trie, Patricia trie আর TCAM — lookup-এর পেছনের data structure
  • Static, default, floating static আর null route লেখা; routing loop, ECMP, policy-based routing আর dynamic routing-এর শ্রেণিবিভাগ

১ · Routing একটি graph-এর সমস্যা — সবচেয়ে কম খরচের পথ

পর্ব ১৫-এ দেখেছেন, router-এর দুটি কাজ: forwarding (প্রতিটি packet-কে টেবিল দেখে সঠিক port-এ পাঠানো, data plane) আর routing (সেই টেবিল বানানো, control plane). এই মডিউলের পাঁচটি পর্ব দ্বিতীয় কাজটি নিয়ে। শুরু করি সবচেয়ে মৌলিক প্রশ্ন দিয়ে: “সবচেয়ে ভালো পথ” মানে আসলে কী?

ঢাকার মানচিত্র ভাবুন। প্রতিটি মোড় একটি বিন্দু, দুই মোড়ের মাঝের রাস্তা একটি রেখা, আর প্রতিটি রাস্তার পাশে লেখা “এই রাস্তা পার হতে কত মিনিট লাগে”. মিরপুর থেকে মতিঝিল যাওয়ার সবচেয়ে কম সময়ের পথ কোনটি? এর উত্তর মানচিত্রের সব রাস্তার সময় যোগ করে বের করতে হয়। কিন্তু প্রতিটি মোড়ের ট্রাফিক পুলিশের কাছে পুরো পথ লেখা থাকার দরকার নেই — তাঁর শুধু জানা দরকার “মতিঝিলের গাড়ি এই মোড় থেকে কোন দিকে যাবে”. মোড় = router, রাস্তা = link, মিনিট = cost, আর ট্রাফিক পুলিশের হাতের নির্দেশ = routing table-এর next hop.

আনুষ্ঠানিক ভাষায়, নেটওয়ার্ক একটি graph G = (N, E): N হলো router-এর সেট (node), E হলো link-এর সেট (edge). প্রতিটি link (x, y)-এর একটি cost c(x, y) — এটি হতে পারে delay, link-এর গতির উল্টো (ধীর link মানে বেশি cost), টাকার খরচ, অথবা সরল hop গোনা (প্রতিটি link-এর cost ১)। একটি পথের cost তার সব link-এর cost-এর যোগফল, আর routing-এর লক্ষ্য প্রতিটি উৎস-গন্তব্য জোড়ার least-cost path খোঁজা। Graph-এর ভিত্তি DSA কোর্সের Graph পর্বে, আর সবচেয়ে কম খরচের পথের algorithm Dijkstra ও Bellman-Ford পর্বে।

A ──────2────── B ──────4────── D
 ╲              │             ╱ │
  ╲ 5           │ 1       1 ╱   │ 3
   ╲            │         ╱     │
    ╲────────── C ──────╱       │
                └───────6────── E
link-এর cost: A–B 2, A–C 5, B–C 1, B–D 4, C–D 1, D–E 3, C–E 6

A থেকে E-তে যাওয়ার কয়েকটি পথ আর তাদের মোট cost:

পথCost-এর যোগফলHop সংখ্যা
A → B → C → D → E২ + ১ + ১ + ৩ = ৭ (সবচেয়ে কম)৪
A → B → D → E২ + ৪ + ৩ = ৯৩
A → C → D → E৫ + ১ + ৩ = ৯৩
A → B → C → E২ + ১ + ৬ = ৯৩
A → C → E৫ + ৬ = ১১২ (সবচেয়ে কম hop)

লক্ষ করুন, “সবচেয়ে ভালো” নির্ভর করে কোন মাপকাঠি ধরছেন তার ওপর। Cost ধরলে জেতে চার hop-এর পথ (৭), hop গুনলে জেতে দুই hop-এর পথ (A → C → E). RIP-এর মতো পুরোনো protocol শুধু hop গোনে (পর্ব ২৩), OSPF সাধারণত link-এর গতি থেকে cost বানায় (পর্ব ২৪)। তাই একই নেটওয়ার্কে দুই protocol দুই পথ বাছতে পারে — অংশ ৪-এ দেখবেন এর ফল কী।

Optimality principle — কেন শুধু next hop রাখলেই চলে

A-র সবচেয়ে কম খরচের পথ A → B → C → D → E. এর যেকোনো অংশ, যেমন B → C → D, নিজেও B থেকে D-র সবচেয়ে কম খরচের পথ। প্রমাণ সহজ (“কেটে বসানো” যুক্তি): ধরুন B থেকে D-তে আরও সস্তা কোনো পথ Q আছে। তাহলে পুরো পথের B → C → D অংশ কেটে Q বসালে A থেকে E-র এমন একটি পথ পাওয়া যায় যার cost ৭-এর চেয়ে কম — কিন্তু ৭ তো সবচেয়ে কম ছিল। এই অসংগতি দেখায়, এমন Q থাকতে পারে না। (Q যদি মূল পথের কোনো node আবার ছুঁয়ে যায়, সেই চক্র বাদ দিলে cost আরও কমে বা সমান থাকে, কারণ cost ঋণাত্মক নয়।) একে বলে optimality principle (Bellman-এর নীতি)।

এর ফল গভীর: একটি গন্তব্যের দিকে সব router-এর সবচেয়ে কম খরচের পথ মিলে একটি গাছ (tree) তৈরি করে, যার শিকড় গন্তব্যে। তাই প্রতিটি router-কে পুরো পথ মনে রাখতে হয় না — শুধু “এই গন্তব্যের জন্য পরের hop কে”. A-র টেবিলে B, C, D, E — চারটি গন্তব্যেরই next hop B. A packet-কে B-র হাতে দেয়, B নিজের টেবিল দেখে C-কে দেয়, আর এভাবে hop-by-hop পুরো পথ তৈরি হয়। শর্ত একটাই: সব router-এর টেবিল যেন একই ছবি থেকে বানানো হয় — নইলে loop (অংশ ৭)।

মূল ধারণা

Routing = graph-এ least-cost path খোঁজা; forwarding table = সেই পথের শুধু প্রথম ধাপ। পথ কে খুঁজবে আর কীভাবে — মানুষ হাতে (static), সব router একসাথে পুরো মানচিত্র দেখে (link state, Dijkstra — পর্ব ২৪), নাকি প্রতিবেশীদের কাছ থেকে শুনে শুনে (distance vector, Bellman-Ford — পর্ব ২৩) — এটাই এই মডিউলের গল্প।

২ · Routing table-এর একটি সারি — prefix, next hop, interface, metric আর উৎস

পর্ব ১৫-এ দেখেছেন, router-এর ভেতরে দুটি টেবিল: routing protocol-গুলো যা শেখে তা জমে RIB-এ, আর সেখান থেকে সেরাগুলো দ্রুত খোঁজার আকারে যায় FIB-এ (forwarding table). প্রচলিত ভাষায় দুটিকেই routing table বলা হয়। একটি সারিতে সাধারণত এই ঘরগুলো থাকে:

ঘরমানেউদাহরণ
গন্তব্য prefixকোন ঠিকানার দলের জন্য এই সারি — network ঠিকানা আর prefix length (পর্ব ১৬–১৭)10.20.30.0/24
Next hopপরের router-এর IP ঠিকানা; গন্তব্য সরাসরি যুক্ত হলে থাকে নাvia 10.0.1.3
Outgoing interfaceকোন port দিয়ে বের হবে; next hop-এর MAC খুঁজতে ARP এই interface-এ হয় (পর্ব ১৮)eth1, Gi0/1
Metricএকই protocol-এর ভেতরে পথের “খরচ” — কম মানে ভালোOSPF cost ৩০, RIP hop ২
উৎস আর ADRoute কোথা থেকে এলো, আর সেই উৎস কতটা বিশ্বাসযোগ্য — কম AD মানে বেশি পছন্দেরstatic (১), OSPF (১১০)
Flag ও অন্যান্যচালু কি না, gateway দিয়ে কি না, কত আগে শেখা, কোন টেবিলেরLinux-এ U, G; Cisco-তে বয়স 00:12:41

Route কোথা থেকে আসে — পাঁচ রকম

Directly connected

Interface-এ ঠিকানা বসিয়ে চালু করলেই router নিজে সেই subnet-এর route যোগ করে, যেমন 10.0.1.0/24 → eth1. Next hop নেই — গন্তব্য একই link-এ, ARP করে সরাসরি পাঠানো। Interface বন্ধ হলে route উধাও।

AD ০ · নিজের চোখে দেখা

Local / host route

Router-এর নিজের ঠিকানার একটি /32 (IPv6-এ /128) route — “এই ঠিকানার packet আমার নিজের জন্য”. Cisco-তে L চিহ্ন, Linux-এ আলাদা local টেবিল (পর্ব ১৫-এর আউটপুট)।

নিজের দরজার নম্বর

Static

প্রশাসক হাতে লেখেন: “10.20.0.0/16-এর packet যাবে 10.0.1.2-এর হাতে”. নেটওয়ার্ক বদলালেও নিজে বদলায় না — মানুষকে বদলাতে হয় (অংশ ৬)।

হাতে লেখা · সাধারণত AD ১

Dynamic

OSPF, IS-IS, RIP, BGP-এর মতো routing protocol প্রতিবেশীদের সাথে বার্তা বিনিময় করে শেখে, আর link নষ্ট হলে নিজেই নতুন পথ বের করে (অংশ ৯)।

নিজে শেখে · নিজে বদলায়

Default route

0.0.0.0/0 (IPv6-এ ::/0) — prefix length ০, তাই সব ঠিকানার সাথে মেলে, কিন্তু সবচেয়ে ছোট বলে কেবল তখনই জেতে যখন আর কিছু মেলে না। Static হতে পারে, protocol থেকেও শেখা যায়।

“আর কিছু না মিললে এদিকে”

বাসার কম্পিউটারের default gateway (পর্ব ০৬) আসলে একটি default route-এর next hop. Cisco-র ভাষায় এর নাম gateway of last resort — “শেষ ভরসার দরজা”. যে router-এর default route নেই, সে অজানা গন্তব্যের packet ফেলে দিয়ে উৎসকে ICMP “Destination Unreachable” পাঠায় (পর্ব ২০)। ইন্টারনেটের কেন্দ্রের বড় router-এ ইচ্ছা করেই default থাকে না, টেবিলে থাকে পৃথিবীর সব prefix — এই এলাকার নাম “default-free zone”.

৩ · টেবিল পড়া — Cisco, Linux আর Windows

তিনটি জগতের টেবিল দেখতে আলাদা, কিন্তু ঘরগুলো একই। প্রথমে একটি Cisco IOS-ধাঁচের router-এর টেবিল (অন্য vendor-এর ধরন আলাদা)। এই router-কে পুরো পর্বে R1 বলব:

R1# show ip route
Codes: L - local, C - connected, S - static, R - RIP, O - OSPF, B - BGP
       * - candidate default
Gateway of last resort is 203.0.113.1 to network 0.0.0.0

S*    0.0.0.0/0 [1/0] via 203.0.113.1
      10.0.0.0/8 is variably subnetted, 5 subnets, 3 masks
C        10.0.1.0/24 is directly connected, GigabitEthernet0/1
L        10.0.1.1/32 is directly connected, GigabitEthernet0/1
S        10.20.0.0/16 [1/0] via 10.0.1.2
O        10.20.30.0/24 [110/30] via 10.0.1.3, 00:12:41, GigabitEthernet0/1
O        10.20.40.0/24 [110/20] via 10.0.1.3, 00:12:41, GigabitEthernet0/1
                       [110/20] via 10.0.1.5, 00:12:41, GigabitEthernet0/1
      203.0.113.0/24 is variably subnetted, 2 subnets, 2 masks
C        203.0.113.0/30 is directly connected, GigabitEthernet0/0
L        203.0.113.2/32 is directly connected, GigabitEthernet0/0
  • প্রথম অক্ষর উৎস: C connected, L local, S static, O OSPF. * মানে default-এর প্রার্থী।
  • [110/30] = [AD/metric]. OSPF-এর AD ১১০, এই পথের OSPF cost ৩০। Static route-এ [1/0].
  • 10.20.40.0/24-এর দুটি লাইন — একই prefix, একই [110/20], দুটি next hop: এটাই ECMP (অংশ ৮)।
  • যা নেই: R1 হয়তো RIP থেকেও 10.20.30.0/24 শুনেছে, কিন্তু টেবিলে আছে শুধু সেরাটি (OSPF) — অংশ ৪-এর stepper.

Linux-এ একই ধরনের তথ্য অন্যভাবে লেখা। একটি সাধারণ ল্যাপটপে (Wi-Fi আর একটি VPN চালু) ip route:

$ ip route
default via 192.168.0.1 dev wlan0 proto dhcp src 192.168.0.105 metric 600
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.2
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.105 metric 600
blackhole 10.99.0.0/16 proto static

default via 192.168.0.1 — default route, next hop বাসার router. dev হলো outgoing interface. proto বলে route-টি কে যোগ করেছে: dhcp (DHCP থেকে পাওয়া gateway, পর্ব ১৮), kernel (ঠিকানা বসানোর সময় kernel নিজে — connected route), static (প্রশাসক)। scope link মানে গন্তব্য এই link-এই; src হলো পাঠানোর সময় উৎস ঠিকানা। metric 600 — Linux kernel-এ AD নেই; একই prefix-এর কয়েকটি route থাকলে কম metric জেতে (NetworkManager সাধারণত Wi-Fi-কে ৬০০ আর তারের Ethernet-কে ১০০ দেয়)। শেষ লাইনটি একটি blackhole route — অংশ ৬-এ।

Windows-এ route print (বা PowerShell-এ Get-NetRoute) mask আলাদা ঘরে দেখায়, আর একই subnet-এর জন্য লেখে “On-link”:

PS> route print -4
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0      192.168.1.1    192.168.1.50     25
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    331
      192.168.1.0    255.255.255.0         On-link      192.168.1.50    281
     192.168.1.50  255.255.255.255         On-link      192.168.1.50    281
    192.168.1.255  255.255.255.255         On-link      192.168.1.50    281
===========================================================================
Persistent Routes:
  None

এখানে 0.0.0.0 / 0.0.0.0 = default route, Gateway ঘরে next hop, Interface ঘরে নিজের যে ঠিকানার interface দিয়ে বের হবে (নাম নয়, ঠিকানা)। 192.168.1.50 / 255.255.255.255 হলো নিজের ঠিকানার host route. Windows-এর metric = interface metric (link-এর গতি থেকে স্বয়ংক্রিয়) + route-এর metric, তাই সংখ্যাগুলো যন্ত্রভেদে আলাদা।

এবার এই পাতার কোড-চালানোর container-এ (rootless, বাইরের নেটওয়ার্ক নেই) আসল Linux টেবিল দেখি। ip route get kernel-কে জিজ্ঞেস করে “এই ঠিকানার জন্য কোন সারি জিতবে?” — কোনো packet না পাঠিয়েই। শেষে সাধারণ ব্যবহারকারী হিসেবে একটি route যোগ করার চেষ্টা:

if command -v ip >/dev/null; then
  echo "== ip route show =="
  ip route show
  echo "== ip route show default =="
  ip route show default
  echo "== ip route get: kernel's choice for each destination =="
  for d in 10.0.2.2 10.0.2.200 192.0.2.10 198.51.100.7 127.0.0.53; do
    ip route get "$d" | head -n 1
  done
  echo "== ip -6 route show =="
  ip -6 route show 2>&1 | head -n 8
  [ -z "$(ip -6 route show 2>/dev/null)" ] && echo "(no IPv6 routes here)"
  echo "== ip -6 route get 2001:db8::1 =="
  ip -6 route get 2001:db8::1 2>&1 | head -n 1
  echo "== try to add a static route as a normal user =="
  ip route add 198.51.100.0/24 via 10.0.2.2 2>&1 || echo "(exit code $?: root/CAP_NET_ADMIN needed)"
else
  echo "ip নেই — /proc/net/route আর /proc/net/ipv6_route দেখুন"
  cat /proc/net/route
  [ -r /proc/net/ipv6_route ] && head -n 5 /proc/net/ipv6_route
fi

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

== ip route show ==
default via 10.0.2.2 dev tap0
10.0.2.0/24 dev tap0 proto kernel scope link src 10.0.2.100
== ip route show default ==
default via 10.0.2.2 dev tap0
== ip route get: kernel's choice for each destination ==
10.0.2.2 dev tap0 src 10.0.2.100 uid 999
10.0.2.200 dev tap0 src 10.0.2.100 uid 999
192.0.2.10 via 10.0.2.2 dev tap0 src 10.0.2.100 uid 999
198.51.100.7 via 10.0.2.2 dev tap0 src 10.0.2.100 uid 999
local 127.0.0.53 dev lo src 127.0.0.1 uid 999
== ip -6 route show ==
fd00::/64 dev tap0 proto kernel metric 256 expires 86398sec pref medium
fe80::/64 dev tap0 proto kernel metric 256 pref medium
default via fe80::2 dev tap0 proto ra metric 1024 expires 1798sec hoplimit 64 pref medium
== ip -6 route get 2001:db8::1 ==
2001:db8::1 from :: via fe80::2 dev tap0 proto ra src fd00::a80a:54ff:fe04:b7fb metric 1024 hoplimit 64 pref medium
== try to add a static route as a normal user ==
RTNETLINK answers: Operation not permitted
(exit code 2: root/CAP_NET_ADMIN needed)

IPv4 টেবিলে দুটি সারি: connected 10.0.2.0/24 (proto kernel) আর default via 10.0.2.2 — একটি stub host-এর আদর্শ টেবিল। route get: 10.0.2.2 আর 10.0.2.200 connected /24-এ মেলে, তাই via নেই — সরাসরি ARP করে পাঠানো হবে, এমনকি gateway নিজের জন্যও। 192.0.2.10 আর 198.51.100.7-এর সাথে শুধু /0 মেলে, তাই via 10.0.2.2. 127.0.0.53 মেলে local টেবিলের 127.0.0.0/8-এ — loopback (local). uid 999 হলো কমান্ড চালানো ব্যবহারকারী।

IPv6: দুটি connected prefix — fd00::/64 (unique local, পর্ব ২১) আর link-local fe80::/64 — আর একটি default, যার উৎস proto ra: router advertisement থেকে শেখা, তাই এর মেয়াদ আছে (expires). Next hop একটি link-local ঠিকানা (fe80::2) — IPv6-এ এটাই স্বাভাবিক। Kernel-এর connected route-এর ডিফল্ট metric ২৫৬, আর RA থেকে শেখা default-এর ১০২৪; prefix আলাদা বলে এখানে তাদের মাঝে কোনো প্রতিযোগিতা নেই। 2001:db8::1 (documentation ঠিকানা)-এর জন্য kernel default বেছে নিল, আর উৎস হিসেবে নিজের fd00:: ঠিকানা। শেষ লাইন: সাধারণ ব্যবহারকারী route যোগ করতে পারেন না — kernel-এর netlink উত্তর “Operation not permitted”, ip-এর exit code ২। Routing table বদলাতে root বা CAP_NET_ADMIN ক্ষমতা লাগে, তাই কেউ চাইলেই আপনার যন্ত্রের পথ বদলাতে পারে না।

৪ · Longest prefix match গভীরে — তারপর AD, তারপর metric

পর্ব ১৫-এ longest prefix match-এর মূল নিয়ম আর একটি lookup simulator দেখেছেন: একাধিক সারি মিললে সবচেয়ে লম্বা prefix জেতে। বাস্তব router-এ প্রশ্নটি আরও জটিল, কারণ একই prefix কয়েকটি উৎস থেকে আসতে পারে — static থেকে, OSPF থেকে, RIP থেকে। তখন পুরো নিয়মটি তিন ধাপের:

  1. সবচেয়ে লম্বা prefix — বেশি নির্দিষ্ট route সবসময় আগে। এটি অন্য কোনো কিছু দিয়ে উল্টানো যায় না।
  2. একই prefix-এ সবচেয়ে কম AD — কোন উৎসকে বেশি বিশ্বাস। ভিন্ন protocol-এর metric তুলনা করা অর্থহীন (OSPF cost ৩০ আর RIP hop ২ — একক আলাদা), তাই আগে উৎস বাছা হয়।
  3. একই উৎসে সবচেয়ে কম metric — একই protocol-এর ভেতরে কোন পথ সস্তা। Metric-ও সমান হলে কয়েকটি পথ একসাথে রাখা যায় — ECMP.

বাস্তবে ধাপ ২ আর ৩ ঘটে route শেখার সময় — RIB প্রতিটি prefix-এর জন্য সেরাটি বেছে FIB-এ বসায়। আর ধাপ ১ ঘটে প্রতিটি packet আসার মুহূর্তে, FIB-এ। ফল একই, তাই হিসাবের সুবিধার জন্য একসাথে ভাবা যায়। নিচে R1-এর কাছে গন্তব্য 10.20.30.40-এর জন্য তিনটি মেলা route (default-কে বাদ রেখে):

গন্তব্য 10.20.30.40 — R1-এর তিনটি প্রার্থী
A · 10.20.0.0/16 · static [1/0] via 10.0.1.2
B · 10.20.30.0/24 · OSPF [110/30] via 10.0.1.3
C · 10.20.30.0/24 · RIP [120/2] via 10.0.1.4
এখন প্রার্থী
এই ধাপের নিয়ম
  1. প্রার্থী খোঁজা। 10.20.30.40-এর প্রথম ১৬ bit 10.20 — A মেলে। প্রথম ২৪ bit 10.20.30 — B আর C দুটোই মেলে। (Default 0.0.0.0/0-ও মেলে, কিন্তু সে সবার ছোট, তাই এখানে বাদ রাখলাম।)
  2. প্রথম নিয়ম: সবচেয়ে লম্বা prefix. A-র /16 হারল B আর C-র /24-এর কাছে — যদিও A static, AD মাত্র ১. এটাই সবচেয়ে প্রচলিত ভুল ধারণা ভাঙার জায়গা: AD শুধু একই prefix-এর route-এর মাঝে লড়াই মেটায়, ছোট prefix-কে বড় বানাতে পারে না।
  3. দ্বিতীয় নিয়ম: কম AD. B আর C একই prefix, ভিন্ন উৎস। Cisco-র ডিফল্টে OSPF ১১০, RIP ১২০ — B জিতল। কেন OSPF বেশি বিশ্বাসযোগ্য ধরা হয়? সে link-এর গতি বোঝে আর পুরো মানচিত্র দেখে পথ হিসাব করে; RIP শুধু hop গোনে (পর্ব ২৩–২৪)।
  4. তৃতীয় নিয়ম: metric — এখানে লাগেনি। C-র metric ২, B-র ৩০ — দেখে মনে হয় C সস্তা। কিন্তু ২ মানে “২ hop”, ৩০ মানে “OSPF cost ৩০” — দুটি আলাদা একক, তুলনা চলে না। Metric তুলনা হয় শুধু একই protocol-এর দুটি পথের মাঝে, যেমন দুটি OSPF পথ cost ৩০ আর ৫০।
  5. ফল FIB-এ। 10.20.30.0/24 → next hop 10.0.1.3, interface Gi0/1. C মুছে যায় না — RIP নিজের ডেটাবেসে রাখে। OSPF-এর route কোনো কারণে চলে গেলে RIB পরের সেরা, অর্থাৎ C-কে বসায়। একই কৌশল ইচ্ছা করে ব্যবহার করলে তা floating static route (অংশ ৬)।

এবার পুরো নিয়মটি কোডে। নিচের engine-এ R1-এর RIB — connected, দুটি default (একটি AD ১, একটি AD ২৫০ backup), একটি static /16, একই /24-এর জন্য দুটি OSPF পথ আর একটি RIP পথ, আর 10.20.40.0/24-এর জন্য সমান খরচের দুটি OSPF পথ। প্রতিটি গন্তব্যের জন্য সব প্রার্থী (/len উৎস AD/metric) ছাপে, তারপর তিনটি ধাপে ছাঁকে, আর বন্ধনীতে লেখে কোন নিয়মে বাছাই হলো। শেষে ECMP-র জন্য flow-এর hash:

// Router R1's RIB: [prefix, source, AD, metric, next hop]. AD = vendor-style default.
const rib = [
  ["10.0.1.0/24", "connected", 0, 0, "eth1"],
  ["0.0.0.0/0", "static", 1, 0, "203.0.113.1"],
  ["0.0.0.0/0", "static", 250, 0, "198.51.100.1"],   // floating backup
  ["10.20.0.0/16", "static", 1, 0, "10.0.1.2"],
  ["10.20.30.0/24", "ospf", 110, 30, "10.0.1.3"],
  ["10.20.30.0/24", "ospf", 110, 50, "10.0.1.5"],
  ["10.20.30.0/24", "rip", 120, 2, "10.0.1.4"],
  ["10.20.40.0/24", "ospf", 110, 20, "10.0.1.3"],
  ["10.20.40.0/24", "ospf", 110, 20, "10.0.1.5"],
].map(([p, src, ad, m, nh]) => ({ p, src, ad, m, nh, len: +p.split("/")[1] }));
const ip = s => s.split(".").reduce((a, o) => a * 256 + +o, 0);
const hit = (r, d) => r.len === 0 || (d >>> (32 - r.len)) === (ip(r.p.split("/")[0]) >>> (32 - r.len));
function lookup(dst) {
  let c = rib.filter(r => hit(r, ip(dst))), why = [];
  console.log(dst + "  candidates: " + c.map(r => `/${r.len} ${r.src} ${r.ad}/${r.m}`).join(", "));
  for (const [k, f] of [["prefix /", Math.max], ["AD ", Math.min], ["metric ", Math.min]]) {
    const key = k[0] === "p" ? "len" : k[0] === "A" ? "ad" : "m";
    const best = f(...c.map(r => r[key]));
    if (c.some(r => r[key] !== best)) why.push(k + best);
    c = c.filter(r => r[key] === best);
  }
  const ecmp = c.length > 1 ? `, ECMP x${c.length}` : "";
  console.log(`   -> ${c[0].p} via ${c.map(r => r.nh).join(" + ")}  [${why.join(", ") || "only match"}${ecmp}]`);
  return c;
}
["10.20.30.40", "10.20.99.1", "10.0.1.77", "192.0.2.50"].forEach(lookup);
// ECMP: hash the 5-tuple (FNV-1a) so every packet of one flow takes the same path.
const fnv = s => [...s].reduce((h, ch) => Math.imul(h ^ ch.charCodeAt(0), 16777619) >>> 0, 2166136261);
const paths = lookup("10.20.40.7");
for (const sp of [50001, 50002, 50003, 50001, 50004, 50002]) {
  const flow = `tcp 10.0.1.9:${sp} -> 10.20.40.7:443`;
  console.log(`  ${flow}  hash ${fnv(flow) % paths.length} -> ${paths[fnv(flow) % paths.length].nh}`);
}

আউটপুট:

10.20.30.40  candidates: /0 static 1/0, /0 static 250/0, /16 static 1/0, /24 ospf 110/30, /24 ospf 110/50, /24 rip 120/2
   -> 10.20.30.0/24 via 10.0.1.3  [prefix /24, AD 110, metric 30]
10.20.99.1  candidates: /0 static 1/0, /0 static 250/0, /16 static 1/0
   -> 10.20.0.0/16 via 10.0.1.2  [prefix /16]
10.0.1.77  candidates: /24 connected 0/0, /0 static 1/0, /0 static 250/0
   -> 10.0.1.0/24 via eth1  [prefix /24]
192.0.2.50  candidates: /0 static 1/0, /0 static 250/0
   -> 0.0.0.0/0 via 203.0.113.1  [AD 1]
10.20.40.7  candidates: /0 static 1/0, /0 static 250/0, /16 static 1/0, /24 ospf 110/20, /24 ospf 110/20
   -> 10.20.40.0/24 via 10.0.1.3 + 10.0.1.5  [prefix /24, ECMP x2]
  tcp 10.0.1.9:50001 -> 10.20.40.7:443  hash 1 -> 10.0.1.5
  tcp 10.0.1.9:50002 -> 10.20.40.7:443  hash 0 -> 10.0.1.3
  tcp 10.0.1.9:50003 -> 10.20.40.7:443  hash 1 -> 10.0.1.5
  tcp 10.0.1.9:50001 -> 10.20.40.7:443  hash 1 -> 10.0.1.5
  tcp 10.0.1.9:50004 -> 10.20.40.7:443  hash 0 -> 10.0.1.3
  tcp 10.0.1.9:50002 -> 10.20.40.7:443  hash 0 -> 10.0.1.3

প্রথম গন্তব্য তিনটি নিয়মই ব্যবহার করল: ছয়টি প্রার্থী থেকে /24 রাখল তিনটি, AD ১১০ রাখল দুটি OSPF, আর metric ৩০ বাছল 10.0.1.3. Stepper-এর ফলের সাথে মেলে, সাথে OSPF-এর ভেতরের metric-লড়াইও দেখা গেল। 10.20.99.1-এর জন্য কোনো /24 নেই (99 ≠ 30, 40), তাই static /16 জিতল শুধু prefix দিয়ে। 10.0.1.77 সরাসরি যুক্ত subnet-এ — via eth1, next hop নেই। 192.0.2.50-এর জন্য শুধু দুটি default মেলে, prefix সমান (/0), তাই সিদ্ধান্ত AD দিয়ে: ১ জিতল, ২৫০-এর backup অপেক্ষায়।

10.20.40.7-এ prefix, AD, metric সব সমান — দুটি পথই রইল (ECMP x2). তারপর ছয়টি packet: পোর্ট 50001-এর flow দুবার এলো, দুবারই 10.0.1.5; 50002 দুবারই 10.0.1.3. Hash শুধু flow-এর পরিচয় থেকে হিসাব হয়, তাই একই flow-এর সব packet একই পথে যায় — পথ বদলে আগে-পরে পৌঁছানোর ঝুঁকি থাকে না (অংশ ৮)। নিজে চেষ্টা করুন: RIP-এর AD ১২০ থেকে ১০০ করলে প্রথম গন্তব্যের ফল কী হবে — আগে খাতায় ভাবুন।

সাবধান — “AD কম, তাই static জিতবে” সবসময় সত্য নয়। উপরের আউটপুটে 10.20.30.40-এর জন্য static /16 (AD ১) হেরেছে OSPF /24 (AD ১১০)-এর কাছে। কাউকে যদি একটি নির্দিষ্ট subnet-এর traffic জোর করে অন্য পথে পাঠাতে হয়, তাহলে AD কমানো নয় — সমান বা আরও লম্বা prefix-এর route লাগবে।

কেন longest prefix জেতে — একটি বাস্তব কারণ

ধরুন একটি ISP তার পুরো ব্লক 198.51.100.0/24 একটি route হিসেবে ঘোষণা করে (route aggregation — পর্ব ১৭)। এর ভেতরের একটি ছোট অংশ, 198.51.100.128/25, এমন একজন গ্রাহকের যিনি দুটি ISP-র সাথে যুক্ত। দ্বিতীয় ISP সেই /25 আলাদা করে ঘোষণা করে, আর longest prefix match-এর কারণে গ্রাহকের packet যায় /25 দিয়ে — aggregation-এর ভেতরে একটি ব্যতিক্রম। আবার এই শক্তিই বিপদও: কেউ ভুল করে বা ইচ্ছা করে কারও ঠিকানার আরও নির্দিষ্ট prefix ঘোষণা করলে সে traffic টেনে নেয় (BGP hijack — পর্ব ২৫)।

৫ · Lookup-এর ভেতরের কাঠামো — binary trie, Patricia trie আর TCAM

পর্ব ১৫-এর simulator টেবিলের প্রতিটি সারি একে একে দেখেছিল। দশ লক্ষ সারির টেবিলে প্রতিটি packet-এর জন্য তা অসম্ভব — সময় লাগবে সারির সংখ্যার সমানুপাতিক। সমাধান হলো এমন কাঠামো, যেখানে খোঁজার সময় নির্ভর করে ঠিকানার দৈর্ঘ্যের ওপর, সারির সংখ্যার ওপর নয়।

Binary trie — প্রতিটি bit একটি মোড়

Binary trie একটি গাছ, যার প্রতিটি node থেকে দুটি শাখা: bit ০ হলে বামে, ১ হলে ডানে। একটি prefix ঢোকাতে তার bit ধরে নিচে নামতে হয়, আর শেষ node-এ লিখে রাখতে হয় “এখানে একটি prefix শেষ হয়েছে, তার next hop এই”. খোঁজার সময় গন্তব্য ঠিকানার bit ধরে নিচে নামতে নামতে যত prefix-চিহ্নিত node পার হয়, শেষেরটিই সবচেয়ে লম্বা মিল। আর পথ শেষ হলে (পরের bit-এর শাখা নেই) থামা। এটি DSA-র Trie-রই রূপ — শব্দের অক্ষরের বদলে ঠিকানার bit.

নিচের কোড ছয়টি prefix trie-তে ঢোকায়, node গোনে, তারপর পাঁচটি ঠিকানা খোঁজে। প্রতিটি খোঁজে ছাপে কোন গভীরতায় (depth, অর্থাৎ কতটি bit পড়া হয়েছে) থামল, পথে কোন কোন prefix দেখা গেল, আর সবশেষে সেরা মিল:

// Binary trie for longest prefix match: one node per bit, left = 0, right = 1.
const ip = s => s.split(".").reduce((a, o) => a * 256 + +o, 0);
const bit = (x, i) => (x >>> (31 - i)) & 1;          // i-th bit from the left
const root = { kids: [null, null], hop: null };
let nodes = 1;
function insert(prefix, hop) {
  const [net, len] = prefix.split("/"), x = ip(net);
  let n = root;
  for (let i = 0; i < +len; i++) {
    const b = bit(x, i);
    if (!n.kids[b]) { n.kids[b] = { kids: [null, null], hop: null }; nodes++; }
    n = n.kids[b];
  }
  n.hop = `${prefix} -> ${hop}`;
}
[["0.0.0.0/0", "A"], ["10.0.0.0/8", "B"], ["10.1.0.0/16", "C"], ["10.1.2.0/24", "D"],
 ["10.1.2.128/25", "E"], ["203.0.113.0/24", "F"]].forEach(([p, h]) => insert(p, h));
console.log(`6 prefixes -> ${nodes} trie nodes`);
function lookup(dst) {
  const x = ip(dst);
  let n = root, depth = 0, best = null, walk = [];
  while (n) {
    if (n.hop) { best = n.hop; walk.push(`d${depth}:${n.hop.split(" ")[0]}`); }
    if (depth === 32) break;
    n = n.kids[bit(x, depth)];
    if (n) depth++;
  }
  console.log(`${dst.padEnd(12)} stopped at depth ${String(depth).padStart(2)} | ` +
    `seen ${walk.join(" ")} | best ${best}`);
}
["10.1.2.200", "10.1.2.7", "10.1.3.4", "10.200.0.1", "192.0.2.1"].forEach(lookup);

আউটপুট:

6 prefixes -> 50 trie nodes
10.1.2.200   stopped at depth 25 | seen d0:0.0.0.0/0 d8:10.0.0.0/8 d16:10.1.0.0/16 d24:10.1.2.0/24 d25:10.1.2.128/25 | best 10.1.2.128/25 -> E
10.1.2.7     stopped at depth 24 | seen d0:0.0.0.0/0 d8:10.0.0.0/8 d16:10.1.0.0/16 d24:10.1.2.0/24 | best 10.1.2.0/24 -> D
10.1.3.4     stopped at depth 23 | seen d0:0.0.0.0/0 d8:10.0.0.0/8 d16:10.1.0.0/16 | best 10.1.0.0/16 -> C
10.200.0.1   stopped at depth  8 | seen d0:0.0.0.0/0 d8:10.0.0.0/8 | best 10.0.0.0/8 -> B
192.0.2.1    stopped at depth  4 | seen d0:0.0.0.0/0 | best 0.0.0.0/0 -> A

৫০টি node কেন? শিকড় ১টি; 10.1.2.128/25 পর্যন্ত পথে ২৫টি node (B, C, D সেই পথেই পড়ে, তাই আলাদা node লাগেনি); আর 203.0.113.0/24 প্রথম bit থেকেই আলাদা (10 = 00001010, 203 = 11001011), তাই নিজের ২৪টি। ১ + ২৫ + ২৪ = ৫০। 10.1.2.200 পথে পাঁচটি prefix পেল, সবশেষে /25 → E (stepper-এ ধাপে ধাপে)। 10.1.2.7-এর ২৫তম bit ০ (7 = 00000111), কিন্তু depth ২৪-এর node-এর শুধু ডান শাখা আছে — থামল, সেরা /24 → D. 10.1.3.4 থামল ২৩-এ: তৃতীয় byte 2 = 00000010 আর 3 = 00000011 — শেষ bit-এ পথ আলাদা হলো, সেখানে কোনো শাখা নেই। 192.0.2.1 থামল মাত্র ৪ bit পরে: 192 = 11000000 আর 203 = 11001011 — পঞ্চম bit-এ আলাদা, তাই শুধু default → A.

মূল কথা: সারি ছয়টি হোক বা দশ লক্ষ, IPv4-এ খোঁজা কখনো ৩২ ধাপের বেশি নয় (IPv6-এ ১২৮)। দাম হলো মেমরি — ছয়টি prefix-এর জন্যই ৫০টি node, যার বেশিরভাগের কাজ শুধু পরের bit-এর দিকে পথ দেখানো।

10.1.2.200 = 00001010 . 00000001 . 00000010 . 11001000
Depth (পড়া bit)
এইমাত্র পড়া bit
এই node-এ prefix?
এ পর্যন্ত সেরা মিল
পার হওয়া node
  1. শিকড়ে শুরু। শিকড়েই default 0.0.0.0/0-এর চিহ্ন, তাই শুরু থেকেই একটি মিল হাতে: A. কোনো bit পড়া হয়নি।
  2. প্রথম ৮ bit. প্রথম byte 10 = 00001010; প্রতিটি bit-এ বামে বা ডানে নেমে ৮টি node পার। Depth ৮-এর node-এ 10.0.0.0/8-এর চিহ্ন — সেরা মিল এখন B.
  3. পরের ৮ bit. দ্বিতীয় byte 1 = 00000001; আরও ৮ node নামা। Depth ১৬-এ 10.1.0.0/16 — সেরা C. পুরোনো মিলগুলো ভুলে যাওয়া যায়, কারণ নিচের মিল সবসময় বেশি লম্বা।
  4. তৃতীয় byte. 2 = 00000010; depth ২৪-এ 10.1.2.0/24 — সেরা D. এখান থেকে শুধু একটি শাখা আছে, ডানে (bit ১), কারণ টেবিলে এর নিচে কেবল .128/25.
  5. ২৫তম bit. 200 = 11001000 — প্রথম bit ১, ডান শাখা আছে। Depth ২৫-এ 10.1.2.128/25 — সেরা E.
  6. থামা। ২৬তম bit-ও ১, কিন্তু depth ২৫-এর node-এর কোনো সন্তান নেই। খোঁজা শেষ — শেষ মিল /25 → E. মোট ২৬টি node, টেবিলের সারি যতই হোক। ঠিকানা 10.1.2.7 হলে ধাপ ৫-এ বাম শাখা খুঁজে না পেয়ে D-তেই থামত।

Patricia trie আর TCAM

Patricia (path-compressed) trie

যে node-এর একটিই সন্তান আর নিজে কোনো prefix নয়, তাকে বাদ দিয়ে শাখায় লিখে রাখা হয় “এখানে কয়টি bit লাফ”. উপরের ছয়টি prefix-এর জন্য ৫০টি node-এর বদলে মাত্র ৬টি — শিকড় (/0), 10/8, 10.1/16, 10.1.2/24, .128/25 আর 203.0.113/24. সাধারণভাবে n টি prefix-এ node কখনো ২n − ১-এর বেশি লাগে না। BSD-র routing table-এ এর একটি রূপ (radix tree) ব্যবহার হয়; আজকের Linux-এর LC-trie-ও এই path compression-এর ওপর দাঁড়িয়ে।

কম মেমরি · software router

TCAM

বিশেষ hardware মেমরি: প্রতিটি সারির প্রতিটি bit ০, ১ বা “যা-ই হোক” (*). গন্তব্য ঠিকানা একসাথে সব সারির সাথে তুলনা হয়, এক clock-এ। সারিগুলো লম্বা prefix আগে রেখে সাজানো থাকে, আর মেলা সারির মধ্যে প্রথমটি নেওয়া হয় — তাই প্রথম মিল = সবচেয়ে লম্বা মিল। দ্রুততম, কিন্তু দামি আর প্রচুর বিদ্যুৎ খায়; টেবিল বড় হলে সীমা হয়ে দাঁড়ায়।

এক ধাপে · hardware router

৬ · Static route — কখন, কীভাবে, আর তার কৌশলগুলো

Static route মানে প্রশাসক নিজে লিখে দিচ্ছেন “এই prefix-এর জন্য এই next hop”. কোনো protocol নেই, কোনো বার্তা বিনিময় নেই, CPU বা bandwidth খরচ নেই। কিন্তু নেটওয়ার্ক বদলালে টেবিল নিজে বদলাবে না।

বিষয়StaticDynamic
কে লেখেমানুষRouting protocol
Link নষ্ট হলেনিজে কিছু করে না (বিকল্প আগে থেকে লেখা না থাকলে)নিজেই বিকল্প পথ খোঁজে
খরচপ্রায় শূন্যবার্তা, CPU, মেমরি, শেখার সময়
নিরাপত্তা ও পূর্বানুমানযা লেখা, ঠিক তাই — বাইরের কেউ বদলাতে পারে নাপ্রতিবেশীর ভুল বা ভুয়া বার্তা টেবিল বদলাতে পারে (প্রমাণীকরণ লাগে)
উপযুক্তছোট নেটওয়ার্ক, stub (বাইরে যাওয়ার একটিই পথ), ISP-র দিকে defaultঅনেক router, একাধিক পথ, ঘন ঘন বদল

একটি উদাহরণ নেটওয়ার্ক: R1 অফিসের মূল router. তার পেছনে LAN 10.0.1.0/24; সেখানে R2 (10.0.1.2) একটি শাখার দিকে, যেখানে 10.20.0.0/16. R1 ইন্টারনেটে যায় ISP-A দিয়ে (203.0.113.0/30 link, ISP-র router 203.0.113.1), আর backup হিসেবে আছে ISP-B (198.51.100.0/30 link, ISP-র router 198.51.100.1).

! ip route <prefix> <mask> <next hop বা interface> [AD]
ip route 10.20.0.0 255.255.0.0 10.0.1.2          ! শাখার নেটওয়ার্ক, R2 দিয়ে
ip route 0.0.0.0 0.0.0.0 203.0.113.1             ! default: ISP-A (AD 1)
ip route 0.0.0.0 0.0.0.0 198.51.100.1 250        ! floating default: ISP-B, শুধু ISP-A না থাকলে
ipv6 route ::/0 2001:db8:a::1                    ! IPv6 default (ঠিকানা documentation range থেকে)
$ sudo ip route add 10.20.0.0/16 via 10.0.1.2 dev eth1
$ sudo ip route add default via 203.0.113.1 metric 100
$ sudo ip route add default via 198.51.100.1 metric 200      # Linux-এ AD নেই — বেশি metric = backup
$ sudo ip -6 route add default via fe80::1 dev eth0          # IPv6-এ next hop প্রায়ই link-local
$ ip route get 10.20.5.9                                     # যাচাই: কোন সারি জিতবে

ip route add-এর route রিস্টার্টে মুছে যায়; স্থায়ী করতে netplan, NetworkManager বা systemd-networkd-এর কনফিগে লিখতে হয়। আর দূরের সার্ভারে default route বদলালে নিজের SSH সংযোগই কেটে যেতে পারে — আগে বর্তমান টেবিল সংরক্ষণ করুন।

Recursive lookup — next hop নিজেই দূরে থাকলে

Static route-এর next hop সরাসরি যুক্ত subnet-এ না-ও থাকতে পারে। ধরুন R1-এ লেখা আছে ip route 198.51.100.64 255.255.255.192 10.20.0.9. 10.20.0.9 কোনো connected subnet-এ নেই। তখন router দ্বিতীয়বার টেবিল খোঁজে — “10.20.0.9-এ কীভাবে যাব?” — পায় 10.20.0.0/16 via 10.0.1.2, আর 10.0.1.2 আছে connected 10.0.1.0/24-এ, eth1-এ। এই দুই-ধাপের খোঁজার নাম recursive lookup. BGP-তে এটি স্বাভাবিক (next hop প্রায়ই কয়েক hop দূরে); আধুনিক router FIB বানানোর সময়ই এই খোঁজা সেরে রাখে, তাই প্রতি packet-এ দুবার খুঁজতে হয় না।

Ethernet-এ next hop ছাড়া শুধু interface দিয়ে static route লিখলে router প্রতিটি গন্তব্যের জন্যই ARP করে, আর কাজ করে শুধু পাশের router proxy ARP দিলে (পর্ব ১৮)। তাই Ethernet-এ next hop লেখাই নিরাপদ; point-to-point link-এ শুধু interface দিলেও চলে।

Floating static route — backup যা ডুবে থাকে

Static route-এর AD ইচ্ছা করে বেশি দিলে (যেমন ২৫০), যতক্ষণ কম AD-র কোনো route একই prefix-এর জন্য থাকে, ততক্ষণ এটি টেবিলে বসে না — পানির নিচে ডুবে থাকে। মূল route চলে গেলে এটি “ভেসে ওঠে”. এজন্য নাম floating static. উপরের কনফিগে ISP-B-র default ঠিক এমন। বাস্তবে কী হয়, ধাপে ধাপে দেখি:

R1: Gi0/0 → ISP-A (203.0.113.1), Gi0/2 → ISP-B (198.51.100.1)
Gi0/0 (ISP-A)
Gi0/2 (ISP-B)
টেবিলে default
ইন্টারনেটের traffic
কারণ
  1. স্বাভাবিক অবস্থা। দুটি default route কনফিগে আছে, কিন্তু টেবিলে বসেছে শুধু AD ১-এরটি। AD ২৫০-এর route অপেক্ষায় — show ip route-এ তাকে দেখাই যায় না।
  2. ISP-A-র তার কাটা। Gi0/0-এর সংকেত চলে গেল। Router interface-কে down ঘোষণা করতে সামান্য সময় নেয়; এর মধ্যে পাঠানো packet হারায়।
  3. মূল route সরে গেল। Interface down হতেই তার connected route 203.0.113.0/30 মুছে যায়। Static route-এর next hop 203.0.113.1 এখন আর কোনো পথে পৌঁছানো যায় না (recursive lookup ব্যর্থ), তাই router সেই static route-কেও টেবিল থেকে সরায়।
  4. Backup ভেসে উঠল। 0.0.0.0/0-এর জন্য এখন একমাত্র প্রার্থী AD ২৫০-এর route — সেটি টেবিলে বসল, traffic চলল ISP-B দিয়ে। NAT থাকলে বাইরের ঠিকানা বদলে যায়, তাই চলতি TCP সংযোগগুলো (যেমন ভিডিও কল) সাধারণত নতুন করে শুরু করতে হয় (পর্ব ১৯)।
  5. Link ফিরল। Gi0/0 up, connected route ফিরল, AD ১-এর default আবার বৈধ — সে টেবিলে ফিরল আর ২৫০-এর route আবার ডুবে গেল। কারও কিছু করতে হলো না।
  6. লুকানো ব্যর্থতা। এবার তার ঠিক আছে, কিন্তু ISP-A-র router নিজে বন্ধ বা তার ওপারে সমস্যা। Gi0/0 up থাকায় route থাকে, আর সব traffic একটি মৃত next hop-এ যায়। Floating static শুধু “নিজের link down” ধরে। সমাধান: next hop-এ নিয়মিত পরীক্ষা চালিয়ে route-কে তার সাথে বাঁধা (Cisco-তে IP SLA আর track), দ্রুত ব্যর্থতা ধরার protocol BFD, অথবা ISP-র সাথে dynamic routing.

Linux-এ ধাপ ২-৩ একটু আলাদা: carrier চলে গেলে kernel route মুছে ফেলে না, শুধু linkdown চিহ্ন দেয়, আর ডিফল্টভাবে সেটি ব্যবহারও করতে পারে। net.ipv4.conf.all.ignore_routes_with_linkdown = 1 sysctl দিলে linkdown route এড়িয়ে পরের metric-এর route নেয়। এমন খুঁটিনাটি OS আর vendor-ভেদে আলাদা — তাই failover সবসময় পরীক্ষা করে দেখতে হয়, অনুমানে নয়।

Null route — summary-র ফাঁক বন্ধ করা

পর্ব ১৭-এ route summarisation দেখেছেন: শাখা router R2 তার চারটি LAN (10.20.0.0/24 থেকে 10.20.3.0/24) আলাদা না জানিয়ে একটি 10.20.0.0/22 হিসেবে জানায়। এতে মূল অফিসের টেবিলে চারটির বদলে একটি সারি — বড় নেটওয়ার্কে হাজার সারি থেকে কয়েকটিতে নামা যায়, lookup দ্রুত হয়, আর শাখার ভেতরের কোনো link ওঠানামা করলে বাকি নেটওয়ার্ককে জানাতে হয় না (route summarisation). কিন্তু ধরুন 10.20.2.0/24 এখনো ব্যবহার হয় না। 10.20.2.9-এর packet মূল অফিস summary দেখে R2-তে পাঠায়; R2-এর কাছে 10.20.2.0/24 নেই, মেলে শুধু তার default — যা মূল অফিসের দিকে। Packet ফিরে যায়, আবার আসে… ঠিক অংশ ৭-এর loop. সমাধান R2-তে একটি null route: Cisco-ধাঁচে ip route 10.20.0.0 255.255.252.0 Null0, Linux-এ ip route add blackhole 10.20.0.0/22. আসল LAN-গুলোর /24 route এর চেয়ে লম্বা, তাই সেগুলো আগের মতোই কাজ করে; শুধু summary-র অব্যবহৃত অংশ চুপচাপ ফেলে দেওয়া হয়। Linux-এ unreachable বা prohibit লিখলে ফেলে দেওয়ার সাথে উৎসকে ICMP-ও পাঠানো হয়।

৭ · ভুল static route-এ routing loop — TTL-এর রক্ষা

Dynamic protocol না থাকলে কেউ যাচাই করে না যে সব router-এর টেবিল মিলে একটি গাছ তৈরি করছে কি না। একটি টাইপো বা ভুলে যাওয়া route-ই যথেষ্ট: R2 বলে “এই গন্তব্য R3-এর দিকে”, আর R3 বলে “আমি জানি না, default ধরে R2-তে ফেরত”. Packet দুজনের মাঝে পিংপং বলের মতো ঘুরতে থাকে। এখানে বাঁচায় IP header-এর TTL: প্রতিটি router এক কমায়, আর যে router-এ পৌঁছে TTL আর কমানো যায় না (১ থাকে), সে packet ফেলে দিয়ে উৎসকে ICMP “Time Exceeded” পাঠায় (পর্ব ২০)। TTL না থাকলে loop-এর প্রতিটি packet চিরকাল ঘুরত, আর নতুন packet জমতে জমতে link পুরো ভরে যেত।

নিচের simulator চারটি router-কে একটি সারিতে রাখে: R1 – R2 – R3 – R4, আর LAN 10.4.0.0/24 আছে R4-এর পেছনে। প্রতিটি router নিজের static টেবিলে longest prefix match করে। Packet R1-এ আসে TTL ৮ নিয়ে (ছোট সংখ্যা যাতে আউটপুট ছোট থাকে; বাস্তবে সাধারণত ৬৪)। তিনটি পরীক্ষা: সঠিক কনফিগে LAN-এর একটি ঠিকানা, সঠিক কনফিগে অজানা একটি ঠিকানা, আর R3-এর একটি route হারিয়ে যাওয়ার পর।

// Static routes on 4 routers in a line: R1 - R2 - R3 - R4. LAN 10.4.0.0/24 sits behind R4.
const good = {
  R1: [["10.1.0.0/24", "connected"], ["0.0.0.0/0", "R2"]],
  R2: [["10.1.0.0/24", "R1"], ["10.4.0.0/24", "R3"]],          // no default route on R2
  R3: [["10.4.0.0/24", "R4"], ["0.0.0.0/0", "R2"]],
  R4: [["10.4.0.0/24", "connected"], ["0.0.0.0/0", "R3"]],
};
const ip = s => s.split(".").reduce((a, o) => a * 256 + +o, 0);
function lpm(table, dst) {
  let best = null;
  for (const [p, nh] of table) {
    const [net, len] = p.split("/");
    const ok = +len === 0 || (ip(dst) >>> (32 - len)) === (ip(net) >>> (32 - len));
    if (ok && (!best || +len > best.len)) best = { len: +len, nh, p };
  }
  return best;
}
function trace(name, routers, dst, ttl = 8) {
  let at = "R1", path = [];
  while (true) {
    const r = lpm(routers[at], dst);
    if (r && r.nh === "connected") { path.push(`${at}(deliver)`); console.log(`${name}: ${path.join(" > ")}  => DELIVERED`); return; }
    if (!r) { path.push(`${at}(no route)`); console.log(`${name}: ${path.join(" > ")}  => DROPPED, ICMP unreachable`); return; }
    if (ttl <= 1) { path.push(`${at}(TTL ${ttl})`); console.log(`${name}: ${path.join(" > ")}  => LOOP? TTL expired, ICMP time exceeded`); return; }
    path.push(`${at}(TTL ${ttl})`);
    ttl--; at = r.nh;
  }
}
trace("correct, 10.4.0.9 ", good, "10.4.0.9");
trace("correct, 10.9.9.9 ", good, "10.9.9.9");
const bad = { ...good, R3: [["0.0.0.0/0", "R2"]] };    // typo: R3 lost its route to R4
trace("broken R3, 10.4.0.9", bad, "10.4.0.9");

আউটপুট:

correct, 10.4.0.9 : R1(TTL 8) > R2(TTL 7) > R3(TTL 6) > R4(deliver)  => DELIVERED
correct, 10.9.9.9 : R1(TTL 8) > R2(no route)  => DROPPED, ICMP unreachable
broken R3, 10.4.0.9: R1(TTL 8) > R2(TTL 7) > R3(TTL 6) > R2(TTL 5) > R3(TTL 4) > R2(TTL 3) > R3(TTL 2) > R2(TTL 1)  => LOOP? TTL expired, ICMP time exceeded

বন্ধনীর TTL হলো সেই router-এ পৌঁছানোর সময়ের মান। প্রথম লাইন: R1-এর default → R2, R2-এর /24 → R3, R3-এর /24 → R4, আর R4-এ LAN সরাসরি যুক্ত — তিনটি router পার হয়ে পৌঁছাল। দ্বিতীয় লাইন: 10.9.9.9-এর জন্য R1 default ধরে R2-তে দিল, কিন্তু R2-এর কোনো default নেই আর কোনো prefix-ও মেলে না — ফেলে দিয়ে ICMP “Destination Unreachable”. এটি loop নয়, পরিষ্কার একটি ব্যর্থতা, আর উৎস সাথে সাথে জানতে পারে।

তৃতীয় লাইন: R3-এর 10.4.0.0/24 route মুছে গেছে, শুধু default → R2 আছে। R2 পাঠায় R3-তে, R3 ফেরত পাঠায় R2-তে — R2 আর R3-এর মাঝে packet ছয়বার হাতবদল হলো। R2-তে packet পৌঁছায় TTL ১ নিয়ে; আর কমালে ০ হবে, তাই ফেলে দিয়ে উৎসকে “Time Exceeded”. ৭টি link পার হলো (৮ থেকে ১) — একটি packet সাতবার জায়গা নিল যেখানে লাগার কথা ছিল তিনবার। এই অবস্থায় traceroute চালালে একই দুটি ঠিকানা পালা করে বারবার দেখা যায় — loop চেনার সবচেয়ে সহজ লক্ষণ (পর্ব ২০)। নিজে চেষ্টা করুন: bad-এ R3-এর টেবিলে ["10.4.0.0/24", "R2"] যোগ করলে কী বদলাবে?

দুই প্রতিবেশী একে অপরকে default দেখালে বিপদ। ISP-র দিকের router আর গ্রাহকের router — দুজনের default যদি পরস্পরের দিকে থাকে, যেকোনো অজানা গন্তব্যের packet দুজনের মাঝে ঘুরতে থাকে। নিয়ম: default সবসময় “বাইরের দিকে”, ইন্টারনেটের দিকে যায়; আর ভেতরের দিকে শুধু নির্দিষ্ট prefix-এর route, সাথে summary-র জন্য null route.

৮ · ECMP আর policy-based routing

ECMP — সমান দুই পথ, দুটোই ব্যবহার

একই prefix, একই AD, একই metric-এর একাধিক পথ থাকলে router একটিকে বেছে বাকিগুলো অলস ফেলে রাখতে পারে — অথবা সবগুলো একসাথে ব্যবহার করতে পারে। দ্বিতীয়টির নাম ECMP (Equal-Cost Multi-Path). ঢাকা-চট্টগ্রাম যেতে মহাসড়ক আর রেল দুটোই সমান সময় নিলে সব যাত্রীকে এক পথে না পাঠিয়ে ভাগ করে দেওয়ার মতো — মোট বহন-ক্ষমতা দ্বিগুণ, আর এক পথ বন্ধ হলেও অন্যটি চলে।

কিন্তু ভাগ করবেন কীভাবে? প্রতিটি packet পালা করে আলাদা পথে পাঠালে (per-packet) একই TCP সংযোগের packet দুই পথে যায়; দুই পথের delay সামান্য আলাদা হলেই packet আগে-পরে পৌঁছায়। TCP তখন ভাবে packet হারিয়েছে, অপ্রয়োজনে আবার পাঠায় আর গতি কমায় (পর্ব ৩০, ৩২)। তাই প্রায় সব router করে per-flow hashing: packet-এর 5-tuple (উৎস ও গন্তব্য IP, উৎস ও গন্তব্য port, protocol) থেকে একটি hash হিসাব করে, পথের সংখ্যা দিয়ে ভাগশেষ নেয়, আর সেই নম্বরের পথে পাঠায়। একই flow-এর সব packet-এর 5-tuple একই, তাই hash-ও একই — অংশ ৪-এর আউটপুটে যেমন 50001 পোর্ট দুবারই 10.0.1.5-এ গেল।

সীমাবদ্ধতা: ভাগ হয় flow ধরে, byte ধরে নয় — একটি বিশাল ডাউনলোড আর একটি ছোট flow একই ওজন পায়। Data center-এর leaf-spine নেটওয়ার্ক পুরোপুরি ECMP-র ওপর দাঁড়িয়ে (পর্ব ৫২), আর স্তর ২-এর link aggregation (LACP, পর্ব ১২) একই ধরনের hash ব্যবহার করে।

Policy-based routing — গন্তব্য ছাড়া অন্য কিছু দেখে পথ

সাধারণ routing শুধু গন্তব্য ঠিকানা দেখে। কখনো চাওয়া হয় অন্য কিছু দেখে পথ বাছতে: “হিসাব বিভাগের (উৎস 10.0.1.0/25) সব traffic দামি কিন্তু নির্ভরযোগ্য ISP-A দিয়ে, বাকিরা সস্তা ISP-B দিয়ে”, বা “ভিডিও কনফারেন্সের port অন্য link দিয়ে”. একে বলে policy-based routing (PBR). Cisco-তে route-map দিয়ে মিলিয়ে set ip next-hop; Linux-এ একাধিক routing table আর ip rule — যেমন ip rule add from 10.0.1.0/25 table 100, আর table 100-এ আলাদা default. PBR সাধারণ ip route-এ দেখা যায় না, তাই সমস্যা খোঁজার সময় ip rule show-ও দেখুন।

৯ · Dynamic routing-এর শ্রেণিবিভাগ — IGP, EGP, AD আর convergence

Static route দিয়ে দশটি router চালানো যায়, দশ হাজার নয়। Dynamic routing algorithm-গুলো তিনটি প্রশ্নে ভাগ করা যায়:

প্রশ্নএক ধরনঅন্য ধরন
প্রতিটি router কতটা জানে?Global — সবাই পুরো topology আর সব link-এর cost জানে, তারপর নিজে হিসাব করে: link state (Dijkstra; OSPF, IS-IS — পর্ব ২৪)Decentralised — কেউ পুরো মানচিত্র জানে না; প্রতিবেশীর কাছ থেকে “আমার থেকে ওই গন্তব্য এত দূর” শুনে নিজের হিসাব বানায়: distance vector (Bellman-Ford; RIP — পর্ব ২৩)
পথ কত ঘন ঘন বদলায়?Static — মানুষ বদলালে তবেইDynamic — topology বা cost বদলালে নিজেই, নিয়মিত বা ঘটনার পরে
Cost কি ভিড়ের ওপর নির্ভর করে?Load-sensitive — link-এ ভিড় বাড়লে cost বাড়ে। আদি ARPANET-এ এমন চেষ্টা হয়েছিল; সমস্যা ছিল দোল খাওয়া — সবাই ফাঁকা পথে যায়, সেটি ভরে যায়, সবাই আবার ফেরেLoad-insensitive — cost স্থির (যেমন link-এর গতি থেকে)। আজকের RIP, OSPF, BGP এই ধরনের; ভিড় সামলানো হয় traffic engineering আর TCP-র congestion control দিয়ে

দুই স্তরের routing — AS-এর ভেতরে আর মাঝে

পুরো ইন্টারনেট একটি বিশাল link-state নেটওয়ার্ক হলে প্রতিটি router-কে কোটি কোটি যন্ত্রের মানচিত্র রাখতে হতো, আর যেকোনো জায়গার link ওঠানামায় সবাইকে আবার হিসাব করতে হতো — অসম্ভব। তার ওপর ইন্টারনেট হাজার হাজার স্বাধীন প্রতিষ্ঠানের নেটওয়ার্ক — প্রত্যেকে নিজের নেটওয়ার্ক নিজের মতো চালাতে চায়। দুই সমস্যার সমাধান একসাথে: autonomous system (AS) — একটি প্রশাসনের অধীনের নেটওয়ার্ক, যার একটি AS নম্বর।

Intra-AS — IGP

AS-এর ভেতরে, একই মালিকের router-গুলোর মাঝে। লক্ষ্য দক্ষতা: সবচেয়ে কম খরচের পথ, দ্রুত পুনরুদ্ধার। Protocol: RIP (পুরোনো, distance vector), OSPF আর IS-IS (link state, বড় ISP-তে প্রচলিত), EIGRP (Cisco-র নকশা, পরে তথ্যমূলক RFC 7868 হিসেবে প্রকাশিত, তবে মূলত Cisco যন্ত্রেই দেখা যায়)। প্রতিটি AS নিজের IGP বেছে নিতে স্বাধীন।

দক্ষতা · পর্ব ২৩–২৪

Inter-AS — EGP

AS-গুলোর মাঝে। লক্ষ্য নীতি: কোন প্রতিবেশীর traffic বহন করব, কার কাছে কোন route ঘোষণা করব, কে টাকা দেয় আর কে বিনিময়ে peering করে। আজ একটিই protocol — BGP (বর্তমান সংস্করণ BGP-4, RFC 4271). BGP বলে “কোন AS-গুলোর ভেতর দিয়ে” যাওয়া যাবে; প্রতিটি AS-এর ভেতরের পথ তার IGP ঠিক করে।

নীতি · পর্ব ২৫

একটি AS-এর সীমানার router (gateway router) দুটোই চালায়: ভেতরের জন্য IGP, বাইরের জন্য BGP. বাইরের prefix-এর জন্য তার টেবিলে আসে “এই prefix BGP দিয়ে ওই gateway-এর মাধ্যমে”, আর সেই gateway-এ পৌঁছানোর পথ আসে IGP থেকে — অংশ ৬-এর recursive lookup ঠিক এখানে কাজে লাগে। বাংলাদেশের মতো দেশে দেশি ISP-গুলো নিজেদের মাঝে traffic বিনিময় করে দেশের ভেতরের exchange point-এ (BDIX-এর মতো IXP), আর বিদেশের traffic নেয় IIG-র মাধ্যমে — এর পুরোটাই AS আর BGP-র জগৎ (পর্ব ২৫)।

Administrative distance-এর টেবিল — vendor-এর পছন্দ

AD কোনো RFC-তে লেখা মান নয় — প্রতিটি vendor নিজে ঠিক করে, আর প্রশাসক বদলাতে পারেন। সবচেয়ে বেশি উদ্ধৃত হয় Cisco-র ডিফল্ট; Juniper একই ধারণাকে বলে “preference”, মান আলাদা; Linux kernel-এ AD নেই (FRR-এর মতো routing software Cisco-র কাছাকাছি মান ব্যবহার করে আর kernel-এ শুধু সেরাটি বসায়)। পরীক্ষায় “AD” প্রশ্ন এলে প্রায় সবসময় Cisco-র মান বোঝানো হয়:

Route-এর উৎসCisco ডিফল্ট ADJuniper preference (তুলনার জন্য)
Directly connected০০ (direct)
Static১৫
eBGP (অন্য AS থেকে শেখা)২০১৭০ (BGP)
EIGRP (ভেতরের)৯০—
OSPF১১০১০ (ভেতরের), ১৫০ (বাইরের)
IS-IS১১৫১৫ / ১৮ (level 1 / 2)
RIP১২০১০০
EIGRP (বাইরে থেকে আনা, external)১৭০—
iBGP (নিজের AS-এর ভেতর থেকে শেখা)২০০১৭০ (BGP)
অবিশ্বাস্য — কখনো ব্যবহার নয়২৫৫—

এক vendor-এর ক্রম অন্য vendor-এ খাটবে, এমন ধরে নেওয়া চলে না — Juniper-এ OSPF (১০) static-এর (৫) পরেই, আর BGP অনেক নিচে।

Convergence — সবার একমত হতে কত সময়

একটি link নষ্ট হলো। পাশের router টের পায়, protocol বার্তা পাঠায়, অন্যরা শুনে নিজের হিসাব আবার করে, নতুন route FIB-এ বসায়। সব router নতুন, পরস্পর-সংগত টেবিলে পৌঁছাতে যে সময় লাগে, তা convergence time — এর মধ্যে ক্ষণস্থায়ী loop বা black hole হতে পারে। Link state সাধারণত কয়েক সেকেন্ডে converge করে (টাইমার টিউন করা আর BFD থাকলে এক সেকেন্ডেরও কম সময়ে), RIP-এর মতো distance vector কখনো মিনিট নেয় (পর্ব ২৩), আর BGP-তে কয়েক মিনিটও লাগতে পারে। Static route-এর convergence নেই — মানুষ না বদলানো পর্যন্ত টেবিল একই থাকে।

আরও গভীরে: Linux kernel-এর IPv4 FIB একটি LC-trie (level-compressed trie, Nilsson আর Karlsson-এর ধারণা) — path compression-এর সাথে ঘন অংশে একসাথে কয়েকটি bit পড়ে; এর গঠন /proc/net/fib_trie-এ দেখা যায়। Linux-এর ECMP-তে hash কোন ঘর থেকে হবে তা ঠিক করে net.ipv4.fib_multipath_hash_policy (০ = শুধু IP ঠিকানা, ১ = 5-tuple). উচ্চগতির router-এ TCAM-এর পাশাপাশি multibit trie-ভিত্তিক algorithm (যেমন Tree Bitmap) আর SRAM-এর মিশ্রণ ব্যবহার হয়। আর মূল router-আচরণ — লম্বা prefix-এর নিয়ম, TTL, ICMP — সব একসাথে লেখা RFC 1812-এ।

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

  • একই গন্তব্যে কয়েকটি route মিললে router কোনটি নেয়? — আগে সবচেয়ে লম্বা prefix; একই prefix হলে কম AD; একই উৎসে কম metric; সব সমান হলে ECMP.
  • Administrative distance আর metric-এর পার্থক্য? — AD ভিন্ন উৎসের (protocol) মাঝে বিশ্বাসের মাপ; metric একই protocol-এর ভেতরে পথের খরচ।
  • Floating static route কী? — মূল route-এর চেয়ে বেশি AD-র static route, যা মূলটি চলে গেলে তবেই টেবিলে বসে — backup পথ।
  • Summary route-এর সাথে Null0 route কেন? — summary-র অব্যবহৃত অংশের packet যেন default ধরে ফিরে গিয়ে loop না বানায়, সেখানেই ফেলে দেওয়া হয়।
  • IGP আর EGP-র পার্থক্য, উদাহরণসহ? — IGP একটি AS-এর ভেতরে (OSPF, IS-IS, RIP), EGP AS-গুলোর মাঝে (BGP); প্রথমটির লক্ষ্য দক্ষতা, দ্বিতীয়টির নীতি।

১০ · AI-এর যুগে routing table — উত্তর মিলিয়ে নেওয়া

“এই কনফিগে কী ভুল?” বা “আমার সার্ভারে দ্বিতীয় ISP-র backup route দিন” — AI এমন প্রশ্নে দ্রুত গোছানো কনফিগ লিখে দেয়। Routing-এর ভুল কিন্তু চুপচাপ থাকে: কনফিগ গ্রহণ করা হয়, কোনো error আসে না, আর সমস্যা ধরা পড়ে যেদিন মূল link নষ্ট হয়। AI-এর প্রচলিত ভুলগুলো চিনে রাখুন:

AI-এর ভুলকেন ভুলকীভাবে ধরবেন
“Static route-এর AD ১, তাই সব সময় জিতবে”আগে longest prefix; AD শুধু একই prefix-এর মাঝেip route get বা show ip route <ঠিকানা> দিয়ে আসল সিদ্ধান্ত দেখুন
Cisco-র AD মান সব vendor-এ খাটে বলে ধরে নেওয়াAD vendor-এর পছন্দ; Juniper-এ মান আলাদা, Linux kernel-এ AD নেইনিজের যন্ত্রের ডকুমেন্টেশন দেখুন
Floating static দিলেই failover নিশ্চিতশুধু নিজের link down হলে কাজ করে; ওপারের ব্যর্থতা ধরে নাল্যাবে next hop বন্ধ করে পরীক্ষা করুন; tracking বা BFD যোগ করুন
route add, netstat -rn-এর পুরোনো নির্দেশনাআধুনিক Linux-এ iproute2 (ip route); net-tools অনেক distribution-এ ডিফল্টে থাকে নাman ip-route দেখুন
Summary বানাতে বলে, কিন্তু null route ভুলে যায়অব্যবহৃত অংশে loop তৈরি হয়Summary-র ভেতরের অব্যবহৃত একটি ঠিকানায় traceroute — একই ঠিকানা বারবার এলে loop

AI-কে routing-এর প্রশ্ন দিলে আসল টেবিল, যন্ত্রের ধরন আর যাচাইয়ের শর্ত দিন:

আমার একটি Linux router আছে (Ubuntu, iproute2). নিচে ip route আর ip rule show-এর আউটপুট দিলাম (বাইরের ঠিকানা মুছে দিয়েছি)। [এখানে আউটপুট] ১. 10.20.30.40, 192.0.2.50 আর 10.0.1.77 — প্রতিটির জন্য কোন সারি জিতবে, longest prefix → metric ক্রমে ধাপে ধাপে দেখাও। ২. দ্বিতীয় ISP-র জন্য backup default route চাই। Linux-এ AD নেই — metric দিয়ে কীভাবে করবে, আর link down হলে kernel আসলে কী করে (linkdown) তা স্পষ্ট বলো; নিশ্চিত না হলে বলো। ৩. শুধু ip কমান্ড ব্যবহার করো (route, netstat নয়), আর প্রতিটি কমান্ড স্থায়ী করতে কোন কনফিগ ফাইলে লিখতে হবে তা আলাদা করে বলো। ৪. কোনো কমান্ড দূর থেকে চালালে আমার SSH কেটে যাওয়ার ঝুঁকি থাকলে আগে সতর্ক করো। ৫. প্রতিটি দাবি যাচাই করার জন্য একটি কমান্ড দাও (যেমন ip route get).

AI-এর routing পরামর্শ মানার আগে — চেকলিস্ট

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

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

প্র ০১ইন্টারনেটের routing কেন দুই স্তরে ভাগ — AS-এর ভেতরে IGP আর মাঝে BGP? পুরো ইন্টারনেটে একটি OSPF চালালে কী সমস্যা হতো?

প্রথম সমস্যা আকার। Link state protocol-এ প্রতিটি router পুরো topology জানে আর প্রতিটি link-এর খবর সবার কাছে বন্যার মতো ছড়ায়। একটি বড় ISP-র ভেতরেই কয়েক হাজার router থাকতে পারে, আর OSPF-এও বড় নেটওয়ার্ককে area-তে ভাগ করতে হয় যাতে খবরের বন্যা সীমিত থাকে (পর্ব ২৪)। পুরো ইন্টারনেটে লক্ষ লক্ষ router আর তাদের link; যেকোনো জায়গার একটি তার নড়াচড়া করলে পৃথিবীর সব router-কে Dijkstra আবার চালাতে হতো। মেমরি, CPU আর বার্তার পরিমাণ — কোনোটাই টিকত না।

দ্বিতীয় সমস্যা, যা হয়তো আরও মৌলিক — মালিকানা। ইন্টারনেট এক প্রতিষ্ঠানের নয়। একটি ISP নিজের ভেতরের নেটওয়ার্ক নিজের পছন্দের protocol আর নিয়মে চালাতে চায়, আর ভেতরের নকশা প্রতিযোগীকে জানাতে চায় না। আর AS-গুলোর মাঝের সিদ্ধান্ত প্রায়ই সবচেয়ে কম খরচের পথ নয়, ব্যবসার: “গ্রাহকের route সবাইকে জানাব, কিন্তু এক upstream ISP-র route আরেক upstream-কে জানাব না, কারণ তাহলে আমি বিনা পয়সায় তাদের traffic বহন করব”. OSPF-এর cost দিয়ে এমন নীতি লেখা যায় না।

ইতিহাসও এই পথে গেছে। আশির দশকে ARPANET আর তার সাথে জোড়া নেটওয়ার্কের জন্য EGP নামের একটি protocol ছিল (RFC 904, ১৯৮৪), যা একটি গাছের মতো কাঠামো ধরে নিত। নেটওয়ার্ক জাল হয়ে উঠলে তা অচল হলো, আর ১৯৮৯ সালে প্রথম BGP এলো (RFC 1105). ১৯৯০-এর দশকের মাঝামাঝি BGP-4 CIDR আর aggregation সমর্থন করল — পর্ব ১৬-এর class থেকে CIDR-এ যাওয়ার গল্পের সাথে মিলিয়ে।

ফলে আজকের কাঠামো: AS-এর ভেতরে IGP দক্ষতা দেখে, ভেতরের মানচিত্র ভেতরেই থাকে; AS-এর মাঝে BGP শুধু “কোন prefix কোন AS-গুলোর পথ ধরে পৌঁছানো যায়” জানায়, আর প্রতিটি AS নিজের নীতিতে বাছে। Scale-এর সমস্যা মেটে, কারণ বাইরের দুনিয়া শুধু summary prefix দেখে; স্বাধীনতার সমস্যা মেটে, কারণ প্রত্যেকে নিজের ঘরের নিয়ম নিজে ঠিক করে।

মূল উপলব্ধি: ইন্টারনেটের routing-এর দুই স্তর প্রযুক্তি আর প্রশাসন দুটোরই উত্তর — বড় সমস্যাকে ছোট টুকরোয় ভাঙা (hierarchy), আর প্রতিটি টুকরোর মালিককে নিজের সিদ্ধান্তের স্বাধীনতা দেওয়া।

প্র ০২Dynamic routing এত শক্তিশালী হলে আজও static route কেন এত প্রচলিত — ছোট অফিস থেকে cloud পর্যন্ত? কোথায় static ভালো, আর কোথায় বিপজ্জনক?

Static route-এর প্রধান গুণ সরলতা আর পূর্বানুমান। একটি ছোট অফিসের router-এর বাইরে যাওয়ার একটিই পথ — ISP. এখানে OSPF বা BGP চালানো মানে অপ্রয়োজনীয় জটিলতা আর ভুলের সুযোগ। একটি লাইন ip route 0.0.0.0 0.0.0.0 <ISP> পুরো কাজ করে। একইভাবে ISP-র দিক থেকেও একক-সংযোগের গ্রাহকের ঠিকানা-ব্লকের জন্য একটি static route যথেষ্ট — এই ধরনের এক-দরজার নেটওয়ার্ককেই বলে stub.

নিরাপত্তার দিক থেকেও static-এর সুবিধা আছে। Dynamic protocol প্রতিবেশীর কথা বিশ্বাস করে; প্রমাণীকরণ ঠিকমতো না থাকলে একটি ভুল কনফিগ করা বা ক্ষতিকর যন্ত্র ভুল route ঘোষণা করে traffic টেনে নিতে পারে। Static route বাইরের কেউ বদলাতে পারে না। তাই অনেক প্রতিষ্ঠান সংবেদনশীল অংশে (যেমন management নেটওয়ার্ক) ইচ্ছা করে static রাখে।

Cloud-এও ধারণাটি জীবিত: প্রধান cloud প্ল্যাটফর্মের virtual নেটওয়ার্কের “route table”-এ আপনি prefix আর লক্ষ্য (internet gateway, NAT gateway) লিখে দেন — মূলত static route, যদিও কিছু সেবা dynamic routing-ও সমর্থন করে (পর্ব ৫৪)।

বিপদ শুরু হয় যখন নেটওয়ার্ক বড় হয় আর একাধিক পথ আসে। প্রতিটি নতুন subnet মানে অনেক router-এ হাতে route যোগ; একটি ভুলে যাওয়া route মানে black hole, একটি টাইপো মানে loop (অংশ ৭)। আর ব্যর্থতায় static নিজে কিছু করে না — floating static কিছুটা সাহায্য করে, কিন্তু শুধু নিজের link-এর ব্যর্থতায় (অংশ ৬-এর stepper). এই কারণেই মাঝারি থেকে বড় নেটওয়ার্কে dynamic routing অপরিহার্য, আর static থাকে প্রান্তে — default route, stub, আর কয়েকটি বিশেষ ক্ষেত্রে।

মূল উপলব্ধি: Static বনাম dynamic “ভালো বনাম খারাপ” নয় — যেখানে পথ একটি আর বদলায় না, সেখানে static সবচেয়ে নির্ভরযোগ্য; যেখানে পথ অনেক আর বদলায়, সেখানে মানুষের হাত ধীর আর ভুলপ্রবণ।

প্র ০৩Longest prefix match দ্রুত করা নিয়ে কয়েক দশক গবেষণা হয়েছে — trie থেকে TCAM পর্যন্ত। কেন এই একটি সমস্যা এত কঠিন, আর সমাধানগুলোর মধ্যে টানাপোড়েন কী?

Exact match — যেমন switch-এর MAC টেবিলে পুরো ৪৮ bit মেলানো — hash table দিয়ে গড়ে এক ধাপে করা যায় (DSA-র Hash table). Longest prefix match কঠিন, কারণ আমরা জানি না কোন দৈর্ঘ্যের prefix মিলবে। প্রতিটি সম্ভাব্য দৈর্ঘ্যের (IPv4-এ ০ থেকে ৩২) জন্য আলাদা hash table রেখে লম্বা থেকে ছোট দিকে খোঁজা যায়, কিন্তু তাতে সবচেয়ে খারাপ ক্ষেত্রে ৩৩টি খোঁজা — আর উচ্চগতির port-এ প্রতিটি packet-এর জন্য বাজেট কয়েক ন্যানোসেকেন্ড (পর্ব ১৫)।

Trie প্রথম স্বাভাবিক সমাধান। Patricia trie-র ধারণা Donald Morrison ১৯৬৮ সালে প্রকাশ করেন (মূলত লেখা খোঁজার জন্য), আর BSD Unix-এর routing table-এ এর একটি রূপ (radix tree) দীর্ঘদিন ব্যবহার হয়েছে। কিন্তু binary trie-তে প্রতি bit একবার মেমরিতে যেতে হয় — IPv4-এ সর্বোচ্চ ৩২ বার, আর মেমরিতে প্রতিবার যাওয়াই সবচেয়ে ধীর অংশ। তাই নব্বইয়ের দশকের শেষ থেকে একসাথে কয়েকটি bit পড়ার (multibit) trie এলো: Luleå algorithm (১৯৯৭) টেবিলকে এত ছোট করল যে তা processor-এর cache-এ ধরে; LC-trie ঘন অংশে কয়েক স্তর একসাথে চাপল (আজকের Linux-এর ভিত্তি); Tree Bitmap-এর মতো নকশা hardware-এর জন্য উপযোগী হলো।

অন্য পথ TCAM — সব সারির সাথে একসাথে তুলনা, এক ধাপে উত্তর। গতিতে অপ্রতিদ্বন্দ্বী, কিন্তু প্রতিটি bit-এর জন্য তুলনার circuit লাগে, তাই একই আকারের সাধারণ মেমরির চেয়ে অনেক দামি আর বেশি বিদ্যুৎ খায়। নতুন prefix ঢোকাতে ক্রম ঠিক রাখতে সারি সরাতে হয়। আর টেবিল TCAM-এর ধারণক্ষমতা ছাড়ালে বিপদ — ২০১৪ সালে ইন্টারনেটের পূর্ণ IPv4 টেবিল প্রায় ৫ লক্ষ ১২ হাজার (৫১২K) prefix পেরোনোর সময় কিছু পুরোনো router-এর ডিফল্ট সীমা ছাপিয়ে যায়, আর কয়েকটি নেটওয়ার্কে বিঘ্ন ঘটেছিল বলে ব্যাপকভাবে জানা যায়।

টানাপোড়েনগুলো তাই চারমুখী: গতি (কত মেমরি-অ্যাক্সেস), মেমরি (কত node), হালনাগাদের সহজতা (BGP-তে প্রতি সেকেন্ডে অনেক বদল আসতে পারে), আর বিদ্যুৎ ও দাম। IPv6-এর ১২৮ bit ঠিকানা আর বাড়তে থাকা টেবিল প্রশ্নটিকে আবারও কঠিন করছে।

মূল উপলব্ধি: একটি সরল নিয়ম — “সবচেয়ে লম্বা মিল” — ইন্টারনেটের গতির সাথে তাল রাখতে গিয়ে data structure, hardware আর অর্থনীতির জটিল প্রশ্ন হয়ে দাঁড়ায়; routing table-এর আকার ছোট রাখা (aggregation) তাই শুধু শৃঙ্খলা নয়, বাস্তব প্রয়োজন।

প্র ০৪Longest prefix match-এর “বেশি নির্দিষ্ট route জেতে” নিয়মটি কীভাবে ইন্টারনেটের সবচেয়ে বড় কিছু বিঘ্নের কারণ হয়েছে? আর এর প্রতিরক্ষা কী?

Longest prefix match-এর যুক্তি সুন্দর: বড় ব্লকের ভেতরে ছোট ব্যতিক্রম থাকতে পারে, আর ব্যতিক্রমই জেতে। কিন্তু ইন্টারনেটে যেকোনো AS BGP দিয়ে যেকোনো prefix ঘোষণা করতে পারে, আর প্রতিবেশী যাচাই না করলে সেটি ছড়িয়ে পড়ে। কেউ যদি অন্যের ঠিকানার আরও নির্দিষ্ট prefix ঘোষণা করে, সারা পৃথিবীর router সেটিকেই বেশি পছন্দ করবে — AD, metric বা পথের দৈর্ঘ্য কিছুই এটি ঠেকাতে পারে না, কারণ প্রথম নিয়মই prefix-এর দৈর্ঘ্য।

সবচেয়ে পরিচিত উদাহরণ ২০০৮ সালের ফেব্রুয়ারি। পাকিস্তানের একটি টেলিকম অপারেটর দেশের ভেতরে YouTube বন্ধ করতে চেয়ে YouTube-এর একটি ব্লকের আরও নির্দিষ্ট একটি /24 নিজের নেটওয়ার্কে ঘোষণা করে — উদ্দেশ্য ছিল traffic ফেলে দেওয়া। সেই ঘোষণা তাদের upstream ISP হয়ে বাইরে ছড়িয়ে পড়ে, আর YouTube-এর নিজের ঘোষণা ছিল কম নির্দিষ্ট (/22). ফলে বিশ্বের বড় একটি অংশের YouTube traffic কয়েক ঘণ্টার জন্য ভুল দিকে চলে যায়। YouTube পাল্টা আরও নির্দিষ্ট prefix ঘোষণা করে কিছুটা traffic ফেরায়, আর শেষে upstream ISP ভুল ঘোষণাটি বন্ধ করে। এর আগে-পরেও বহু ঘটনা ঘটেছে, কিছু ভুলে, কিছু ইচ্ছা করে (যেমন ক্রিপ্টোকারেন্সির সাইটের traffic চুরির চেষ্টা)।

প্রতিরক্ষা কয়েক স্তরের। প্রথমত, ISP-র উচিত গ্রাহকের কাছ থেকে শুধু তার নিজের prefix গ্রহণ করা (prefix filter). দ্বিতীয়ত, RPKI — প্রতিটি ঠিকানা-ব্লকের মালিক cryptographic সই করা একটি রেকর্ডে (ROA) লিখে রাখেন কোন AS সেটি ঘোষণা করতে পারে আর সর্বোচ্চ কত লম্বা prefix পর্যন্ত; router এর সাথে না মিললে ঘোষণা বাতিল করে (route origin validation). “সর্বোচ্চ দৈর্ঘ্য” ঘরটি ঠিক এই আরও-নির্দিষ্ট-prefix আক্রমণের জন্যই। তৃতীয়ত, MANRS-এর মতো উদ্যোগ নেটওয়ার্ক অপারেটরদের এই অভ্যাসগুলো চালু করতে উৎসাহ দেয়। বিস্তারিত পর্ব ২৫-এ।

মূল উপলব্ধি: Longest prefix match বিশ্বাসের ওপর দাঁড়িয়ে — যে বেশি নির্দিষ্ট কথা বলে, তাকে মানা হয়। তাই কে কোন prefix বলার অধিকারী, সেটি যাচাই করা ইন্টারনেটের নিরাপত্তার একটি মৌলিক অংশ।

প্র ০৫ECMP-তে কেন per-packet নয়, per-flow ভাগ? আর বড় data center-এ hash-ভিত্তিক ভাগের কী কী দুর্বলতা দেখা দেয়?

Per-packet ভাগ শুনতে আদর্শ — প্রতিটি packet পালা করে আলাদা পথে, তাই প্রতিটি পথে ঠিক সমান ভার। সমস্যা TCP. TCP ধরে নেয় packet মোটামুটি ক্রমে আসবে; ক্রম ভাঙলে প্রাপক পুরোনো ACK বারবার পাঠায় (duplicate ACK), আর তিনটি duplicate ACK দেখলে প্রেরক ধরে নেয় packet হারিয়েছে — আবার পাঠায় আর congestion window কমায় (পর্ব ৩০, ৩২)। দুটি পথের delay কয়েক মাইক্রোসেকেন্ডও আলাদা হলে এমন ঘটতে পারে। তাই প্রায় সব router per-flow hashing করে: একটি flow-এর সব packet একই পথে, ক্রম রক্ষা পায়, আর অনেক flow থাকলে গড়ে ভার মোটামুটি সমান।

কিন্তু “গড়ে” কথাটিই দুর্বলতা। প্রথমত, flow-এর আকার সমান নয়। Data center-এ অল্প কিছু বিশাল flow (backup, বড় ডেটা স্থানান্তর — “elephant”) আর অসংখ্য ছোট flow (“mice”) থাকে। দুটি elephant একই পথে hash হলে সেই পথ ভরে যায়, অন্যটি প্রায় ফাঁকা — hash collision. দ্বিতীয়ত, hash polarization: পরপর কয়েক স্তরের switch যদি একই hash ফাংশন আর একই ঘর ব্যবহার করে, প্রথম স্তরে যে flow-গুলো “পথ ০”-এ গেল, পরের স্তরেও তারা সবাই একই ভাগশেষ পায় — ফলে কিছু link কখনো ব্যবহারই হয় না। সমাধান প্রতিটি switch-এ আলাদা hash seed. তৃতীয়ত, একটি পথ নষ্ট হলে সাধারণ ভাগশেষের হিসাবে অনেক flow পথ বদলায়; consistent বা resilient hashing এই নড়াচড়া কমায়।

একটি উন্নত সমাধান flowlet switching — একটি flow-এর packet-এর মাঝে যথেষ্ট লম্বা বিরতি থাকলে পরের দলকে অন্য পথে পাঠানো, কারণ সেই বিরতিতে ক্রম ভাঙার ঝুঁকি নেই। Leaf-spine নকশা আর এসব কৌশল পর্ব ৫২-এ।

মূল উপলব্ধি: ECMP-র নকশা দুটি লক্ষ্যের আপস — packet-এর ক্রম রক্ষা আর ভারের সমান ভাগ। Per-flow hashing প্রথমটি নিশ্চিত করে আর দ্বিতীয়টি পরিসংখ্যানের ওপর ছেড়ে দেয়।

অনুশীলন

খাতা-কলম নিন — prefix, AD আর TTL ধাপে ধাপে মিলিয়ে দেখুন।

  1. হাতে হিসাব (route বাছাই): একটি Cisco router-এর RIB-এ এই route-গুলো আছে (ডিফল্ট AD): S 0.0.0.0/0 [1/0] via 192.0.2.1, S 172.16.0.0/16 [1/0] via 10.1.1.2, O 172.16.8.0/21 [110/40] via 10.1.1.3, R 172.16.8.0/21 [120/1] via 10.1.1.4, O 172.16.12.0/24 [110/65] via 10.1.1.5. গন্তব্য (ক) 172.16.12.7, (খ) 172.16.9.200, (গ) 172.16.20.1, (ঘ) 198.51.100.9 — প্রতিটির next hop কী, আর কোন নিয়মে?

    আগে /21-এর পরিসর: 172.16.8.0/21 = তৃতীয় byte ৮ থেকে ১৫ (৮ = 00001000, /21 মানে তৃতীয় byte-এর প্রথম ৫ bit স্থির)। (ক) 172.16.12.7: /0, /16, /21 (১২ পরিসরে), /24 সব মেলে → সবচেয়ে লম্বা /24 → 10.1.1.5 (metric ৬৫ বেশি হলেও prefix জেতে)। (খ) 172.16.9.200: /0, /16, দুটি /21 মেলে; /24 মেলে না (৯ ≠ ১২)। সবচেয়ে লম্বা /21, দুটি উৎস — AD ১১০ বনাম ১২০ → OSPF → 10.1.1.3. (গ) 172.16.20.1: ২০ = 00010100, /21-এর 00001-এর সাথে মেলে না → শুধু /0 আর /16 → static /16 → 10.1.1.2. (ঘ) 198.51.100.9: শুধু default → 192.0.2.1.

  2. আউটপুট অনুমান করুন: অংশ ৪-এর route_engine.js-এ দুটি আলাদা বদল, প্রতিবার একটি করে: (ক) RIP-এর সারিতে AD ১২০ থেকে ১০০ করা হলো — 10.20.30.40-এর ফলের লাইন কী হবে? (খ) মূল বদল বাদ দিয়ে, এবার AD ১-এর default route-এর সারিটি মুছে ফেলা হলো — 192.0.2.50-এর দুটি লাইন কী হবে?
    (ক) 10.20.30.40  candidates: /0 static 1/0, /0 static 250/0, /16 static 1/0, /24 ospf 110/30, /24 ospf 110/50, /24 rip 100/2
           -> 10.20.30.0/24 via 10.0.1.4  [prefix /24, AD 100]
    (খ) 192.0.2.50  candidates: /0 static 250/0
           -> 0.0.0.0/0 via 198.51.100.1  [only match]

    (ক) /24-এর তিনটি প্রার্থীর মধ্যে এখন RIP-এর AD (১০০) সবচেয়ে কম, তাই metric ধাপে যাওয়ার আগেই RIP জিতল, আর বন্ধনীতে metric-এর উল্লেখ নেই — দুটি OSPF পথ AD ধাপেই বাদ পড়েছে। এটাই দেখায়, AD বদলে protocol-এর পছন্দ বদলানো যায় — বাস্তবে এটি সাবধানে করা উচিত। (খ) Floating backup এখন একমাত্র প্রার্থী — “ভেসে উঠল”, ঠিক অংশ ৬-এর stepper-এর ধাপ ৪.

  3. কমান্ড লিখুন: একটি Linux router-এ (root আছে) করতে হবে: (ক) 10.50.0.0/16-এর জন্য next hop 10.0.1.9; (খ) মূল default 203.0.113.1 আর backup default 198.51.100.1; (গ) এই router নিজের LAN-গুলোর জন্য 10.60.0.0/22 summary ঘোষণা করে — summary-র অব্যবহৃত অংশ চুপচাপ ফেলে দেওয়া, কিন্তু আসল /24 route-গুলো যেন কাজ করে; (ঘ) 10.50.3.4-এর জন্য kernel কোন route বাছবে তা যাচাই। একই কাজ Cisco IOS-ধাঁচে কীভাবে লিখবেন?
    # Linux (iproute2)
    sudo ip route add 10.50.0.0/16 via 10.0.1.9                 # (ক)
    sudo ip route add default via 203.0.113.1 metric 100        # (খ) মূল
    sudo ip route add default via 198.51.100.1 metric 200       # (খ) backup
    sudo ip route add blackhole 10.60.0.0/22                    # (গ)
    ip route get 10.50.3.4                                      # (ঘ)
    
    ! Cisco IOS-style
    ip route 10.50.0.0 255.255.0.0 10.0.1.9
    ip route 0.0.0.0 0.0.0.0 203.0.113.1
    ip route 0.0.0.0 0.0.0.0 198.51.100.1 250
    ip route 10.60.0.0 255.255.252.0 Null0

    (গ)-তে আসল LAN-গুলোর connected /24 route বেশি লম্বা, তাই সেগুলো জিতবে, আর শুধু অব্যবহৃত অংশ ফেলা হবে। (খ)-তে Linux-এ AD নেই, তাই backup-এর metric বেশি; Cisco-তে একই কাজ AD ২৫০ দিয়ে। Linux-এ এই কমান্ড রিস্টার্টে মুছে যায়; স্থায়ী করতে নেটওয়ার্ক কনফিগে লিখতে হবে।

  4. হাতে trace (summary-র loop): মূল অফিসের router HQ-তে 10.30.0.0/21 → Branch, আর Branch-এর টেবিলে আছে শুধু 10.30.0.0/24 থেকে 10.30.5.0/24 (connected) আর 0.0.0.0/0 → HQ. কোনো null route নেই। বাইরের একটি host 10.30.6.5-এ একটি packet পাঠাল, যা HQ-তে পৌঁছাল TTL ৬৪ নিয়ে। (ক) কী হবে? (খ) Packet মোট কতবার HQ–Branch link পার হবে, আর কে ICMP পাঠাবে? (গ) সমাধান কী?

    (ক) 10.30.6.5 পড়ে /21-এর ভেতরে (তৃতীয় byte ০–৭), তাই HQ পাঠায় Branch-এ। Branch-এর কাছে 10.30.6.0/24 নেই, মেলে শুধু default → HQ-তে ফেরত। HQ আবার Branch-এ… routing loop.

    (খ) প্রতিটি forward-এ TTL এক কমে। HQ-তে আসে ৬৪, ৬২, …, ২ (জোড় সংখ্যা) — প্রতিবার forward করে, মোট ৩২ বার। Branch-এ আসে ৬৩, ৬১, …, ৩ — forward করে ৩১ বার; তারপর TTL ১ নিয়ে Branch-এ পৌঁছায়, আর কমানো যায় না। মোট link পার = ৩২ + ৩১ = ৬৩ বার (৬৪ থেকে ১-এ নামতে ৬৩টি forward). Branch packet ফেলে উৎসকে ICMP Time Exceeded পাঠায়। একটি packet-এর জন্য link-এ ৬৩ গুণ জায়গা — এমন অনেক packet এলে link ভরে যায়।

    (গ) Branch-এ ip route 10.30.0.0 255.255.248.0 Null0 (Linux-এ blackhole 10.30.0.0/21). আসল /24-গুলো বেশি লম্বা বলে কাজ করে; 10.30.6.5 মেলে শুধু /21 null route-এ আর সাথে সাথে ফেলা হয় — কোনো loop নেই। আরও ভালো: যে subnet নেই তা summary-তে না রাখা, অথবা ICMP Unreachable চাইলে unreachable route.

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

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

ক্রমএকটি route শেখা থেকে packet পাঠানো পর্যন্ত — ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. Connected, static আর routing protocol থেকে route-গুলো RIB-এর প্রার্থী হয়
  2. একই prefix-এর কয়েকটি উৎস থাকলে সবচেয়ে কম AD-র উৎস বাছাই হয়
  3. সেই উৎসের ভেতরে সবচেয়ে কম metric-এর পথ (সমান হলে কয়েকটি) বাছাই হয়
  4. বাছাই করা route FIB-এ বসে
  5. Packet এলে FIB-এ longest prefix match করে next hop আর interface ঠিক হয়
  6. TTL এক কমে আর packet next hop-এর দিকে পাঠানো হয়

একটি router-এ তিনটি route: 172.16.0.0/16 static (AD 1), 172.16.5.0/24 OSPF (AD 110, metric 20), 0.0.0.0/0 static (AD 1). গন্তব্য 172.16.5.9 হলে কোন route ব্যবহার হবে?

  • 172.16.0.0/16 static — কারণ AD 1 সবচেয়ে কম
  • 0.0.0.0/0 — কারণ static আর AD 1
  • 172.16.5.0/24 OSPF — কারণ prefix সবচেয়ে লম্বা
  • তিনটির মধ্যে ভাগ করে (load balancing)

একজন প্রশাসক লিখলেন ip route 0.0.0.0 0.0.0.0 198.51.100.1 250, অথচ আগে থেকেই ip route 0.0.0.0 0.0.0.0 203.0.113.1 আছে। নতুন route-টির উদ্দেশ্য কী?

  • দুই ISP-র মধ্যে traffic সমানভাবে ভাগ করা
  • মূল default চলে গেলে backup হিসেবে টেবিলে বসা (floating static)
  • Route-টিকে স্থায়ীভাবে নিষ্ক্রিয় রাখা
  • শুধু একটি বিভাগের traffic ISP-B দিয়ে পাঠানো

Cisco-র ডিফল্ট administrative distance অনুযায়ী, একটি router একই prefix শিখল OSPF, RIP আর eBGP তিনটি থেকে। কোনটি routing table-এ বসবে?

  • OSPF-এর route
  • RIP-এর route
  • যার metric সবচেয়ে কম
  • eBGP-র route

ECMP-তে router সাধারণত প্রতিটি packet পালা করে না পাঠিয়ে 5-tuple-এর hash দিয়ে পথ বাছে। এর প্রধান কারণ কী?

  • একই flow-এর packet যেন একই পথে গিয়ে ক্রমে পৌঁছায়
  • প্রতিটি পথে ঠিক সমান byte পাঠানো
  • Packet-এর বিষয়বস্তু গোপন রাখা
  • ধীর পথটি এড়িয়ে চলা

একটি শাখা router 10.40.0.0/22 summary ঘোষণা করে, কিন্তু 10.40.3.0/24 এখনো ব্যবহার হয় না, আর শাখার default route মূল অফিসের দিকে। 10.40.0.0/22-এর জন্য শাখায় Null0 route যোগ করার ফল কী?

  • শাখার সব LAN-এর traffic ফেলে দেওয়া হবে
  • অব্যবহৃত অংশের traffic মূল অফিসে ফেরত যাবে
  • অব্যবহৃত অংশের packet শাখাতেই ফেলা হবে, loop হবে না
  • Summary ঘোষণা বন্ধ হয়ে যাবে

একটি binary trie-তে ১০ লক্ষ IPv4 prefix রাখা আছে। একটি গন্তব্যের longest prefix match খুঁজতে সবচেয়ে বেশি কতটি node পার হতে হবে (শিকড়সহ)?

  • প্রায় ১০ লক্ষ
  • ৩৩
  • প্রায় ২০
  • ১

শব্দকোষ

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

মনে রাখুন

  1. Routing = graph-এ least-cost path; optimality principle-এর কারণে প্রতিটি router-এ শুধু next hop রাখলেই পুরো পথ তৈরি হয় — যদি সব টেবিল সংগত হয়।
  2. Routing table-এর সারি: prefix, next hop, interface, metric, উৎস/AD. উৎস: connected, local, static, dynamic; default = 0.0.0.0/0 ও ::/0 (gateway of last resort).
  3. বাছাইয়ের ক্রম: longest prefix → কম AD (একই prefix) → কম metric (একই উৎস) → সমান হলে ECMP, per-flow hash দিয়ে। AD লম্বা prefix-কে হারাতে পারে না; AD-র মান vendor-ভেদে আলাদা।
  4. Lookup-এর কাঠামো: binary trie (IPv4-এ ≤ ৩২ ধাপ), Patricia (n prefix-এ ≤ ২n − ১ node), TCAM (এক ধাপ, দামি)।
  5. Static-এর কৌশল: stub-এ default, বেশি AD দিয়ে floating backup (শুধু নিজের link-এর ব্যর্থতা ধরে), summary-র সাথে null route; ভুল static-এ loop, TTL তা থামায়। Dynamic: IGP (RIP, OSPF, IS-IS) আর EGP (BGP) — scale আর স্বাধীনতার জন্য দুই স্তর; বদলের পর convergence-এ সময় লাগে।

পরের পর্বে: এবার router-রা নিজেরাই পথ খুঁজবে — প্রতিবেশীর কাছ থেকে “কত দূর” শুনে শুনে। Distance vector routing, Bellman-Ford সমীকরণ, RIP, আর সেই বিখ্যাত সমস্যা: খারাপ খবর ধীরে ছড়ায় — count-to-infinity.

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

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