Foundationপ্রথম নীতি থেকে
LEVEL 7লেসন ৭/২২অ্যাডভান্সড১ ঘণ্টা

Routing ও BGP — packet যেভাবে continent পেরোয়

Routing and BGP

আপনার packet Sydney পৌঁছায় কীভাবে — longest-prefix-match-এর গণিত, RIP-র অসীম-গণনা দুর্ঘটনা, OSPF-এর ভেতরের Dijkstra, আর সেই BGP যেখানে টাকা দূরত্বকে হার মানায়।

এই লেসন শেষে আপনি পারবেন

  • Forwarding আর routing-এর ভেদ দাঁড় করাতে পারবেন — data-plane-এর nanosecond lookup আর control-plane-এর map-building আলাদা করে
  • Longest-prefix-match rule যেকোনো route-table আর destination IP-তে apply করে kernel-এর সিদ্ধান্ত হুবহু অনুমান করতে পারবেন
  • RIP-এর count-to-infinity দুর্ঘটনার mechanism ব্যাখ্যা করে link-state (OSPF) কীভাবে সেই সমস্যা-পরিবারকে মূল থেকে সরায় — তুলনা করতে পারবেন
  • BGP-র path-vector model, AS_PATH loop-prevention আর policy-based selection বর্ণনা করে বোঝাতে পারবেন কেন BGP শুধু shortest-path খোঁজে না
  • Route-hijack ঘটনার defensive playbook — filtering, max-prefix, RPKI — ব্যাখ্যা করতে পারবেন, YouTube 2008 case-study-র আলোয়

আগে যা বোঝা থাকা দরকার

আগে এটা বুঝি

আজ পর্যন্ত আমাদের গল্পে packet-গুলো একই link-এর মধ্যে চলেছে — switch, ARP, MAC address। কিন্তু আপনি google.com লিখলে আপনার packet আপনার Wi-Fi ছেড়ে দশ-হাজার কিলোমিটার পেরিয়ে একটা datacenter-এ পৌঁছায় — পথে ডজন-খানেক router, তিন-চারটা continent, অগণিত ভিন্ন organization-এর মালিকানা। কেউ কি map ধরে বসে আছে পুরো ইন্টারনেটের?

উত্তরটা অবাক করার মতো: না। কোথাও কোনো কেন্দ্রীয় map নেই। প্রতিটা router জানে শুধু নিজের আশপাশ; প্রতিটা ISP জানে নিজের রাজ্য আর প্রতিবেশীদের সাথে চুক্তি। তবু packet ঠিক পৌঁছায় — প্রায় সবসময় — কারণ লাখো ছোট-ছোট সিদ্ধান্ত একসাথে একটা global navigation-system গড়ে ফেলে। আজকের লেসন সেই সিদ্ধান্ত-যন্ত্রের ভেতরটা খোলা।

তিনটা স্তরে যাব:

  • এক router-এর এক সিদ্ধান্ত: forwarding আর longest-prefix-match
  • এক organization-এর ভেতরের map: RIP-র দুর্ঘটনা, OSPF-র সমাধান
  • organizations-এর মধ্যের দর-কষাকষি: BGP — ইন্টারনেটের আসল সংবিধান, যেখানে shortest-path নয়, business-policy রাজা

মূল ধারণা

Forwarding বনাম routing — দুই পেশা, এক machine

প্রথম ভেদটা সবচেয়ে গুরুত্বপূর্ণ, আর সহজ:

ForwardingRouting
কাজআসা packet-কে সঠিক output-port-এ পাঠানোকোন destination কোথায় — সেই table বানানো
PlaneData planeControl plane
সময়স্কেলপ্রতি packet, ন্যানোসেকেন্ডসেকেন্ড–মিনিট পরপর
জ্ঞানশুধু table-lookupneighbor-দের সাথে protocol-চালানো

Router-এর ভেতরে দুই স্তরের দুই নামও আছে: control plane-এর জ্ঞান RIB (Routing Information Base — সব প্রার্থী route এখানে), data plane-optimized copy FIB (Forwarding Information Base — hardware-বান্ধব, প্রতি destination-এ একটাই winner)। Control plane চিন্তা করে, data plane খাটে।

Longest-prefix-match — এক lookup-এর নিয়ম

Packet এলো: destination 8.8.8.8। Router-এর FIB-এ তিনটা প্রার্থী:

0.0.0.0/0        via 203.0.113.1    (default — সবার সাথে মেলে)
8.8.0.0/16       via 10.9.9.1       (মেলে!)
8.8.4.0/22       via 10.9.9.2       (8.8.4.0–8.8.7.255 — মেলে না)

নিয়ম একটাই: যে সবচেয়ে লম্বা prefix-এ মেলে, সে-ই জেতে। এখানে /16 — traffic যাবে 10.9.9.1-এ। CIDR লেসনের সেই prefix-tree-ভাবনা এখানেই ফলে: ঠিকানা-জগৎ এক tree-structure, specificity মানে tree-তে নিচে-নামা। Default route (/0) হলো tree- root — সবার সাথে মেলে, তাই সবচেয়ে last-resort।

Intra-domain — ভেতরের map বানানোর দুই দর্শন

এক organization-এর ভেতরে দশ-শ হাজার router নিজেদের মধ্যে topology share করে — এদের বলে IGP (Interior Gateway Protocol)। ঐতিহাসিকভাবে দুই দর্শন:

Distance-vector (RIP): প্রতিটা router neighbor-দের কাছে শুধু তালিকা চায় — “destination X কত দূরে?” — আর rumor-এর rumor-এ বিশ্বাস করে। সরল, কিন্তু এর একটা বিখ্যাত দুর্ঘটনা আছে — count-to- infinity — hood section-এ পূর্ণ dramatization করব।

Link-state (OSPF): উল্টো দর্শন — প্রতিটা router নিজের সরাসরি neighbor-link-গুলোর বিবরণ (LSA) flooding করে সবার কাছে; ফলে প্রত্যেকে identical topology-map (LSDB) ধরে রাখে, তারপর নিজের মাথায় graph আঁকে আর Dijkstra algorithm চালিয়ে নিজের shortest-path spanning tree বের করে। Rumor নেই — প্রত্যেকে raw-data থেকে নিজেই হিসাব করে। Convergence দ্রুত, loop-free by construction; scale-এর জন্য area-তে ভাগ (area-র ভেতর full detail, মাঝে শুধু summary)।

আজ production-এ RIP প্রায় মৃত; OSPF (আর IS-IS) enterprise-ISP ভেতরের standard — ঠিক সেই দুর্ঘটনার পাঠ মাথায় রেখে।

Inter-domain — এবার রাজনীতি

Organization-দের মধ্যে খেলাটা আলাদা। প্রতিটা network একটা Autonomous System (AS) — নিজের নীতির অধীনে চলা এক administrative রাজ্য, নম্বর-পরিচয় ASN (আজ 32-bit, private-range 64512–65534 practice-এ)। আপনার ISP একটা AS, Google আরেকটা, আপনার university আরেকটা। AS-দের মধ্যে চলে BGP — Border Gateway Protocol, TCP port 179-এর উপর।

BGP-র মূল ভাষা path-vector: প্রতিটা route-advertisement-এ পুরো AS_PATH থাকে — কোন কোন AS-র ঘরে ঘরে এই announcement ঘুরে এসেছে:

Google AS15169 announce:  142.250.0.0/15
→ Peer ISP-এ পৌঁছায়:      AS_PATH = 15169
→ আমার ISP পেয়ে re-announce: AS_PATH = 65100 15169
→ আপনার ISP:               AS_PATH = 65200 65100 15169

Loop-prevention এই list-এই: কোনো AS নিজের ASN পথে দেখলে সেই advertisement ফেলে দেয় — ফিরে-ফিরে ঘোরার গাণিতিক অসম্ভবতা। RIP- র infinity-গণনা এখানে structure-level-এই বন্ধ।

Policy — যেখানে মাপ হার মানায়

IPv4-IPv6 লেসন পর্যন্ত আমরা ভেবেছি router “সবচেয়ে ছোট path” বেছে নেয়। BGP-তে সত্যিটা: প্রথমে ব্যবসা, তারপর মাপ। AS-গুলোর তিন সম্পর্ক — customer (টাকা নেয়), peer (বিনিময়ে free), provider (টাকা দেয়)। সাধারণ selection-order:

  1. LOCAL_PREF: customer-দের দেওয়া route সবচেয়ে প্রিয়, তারপর peer, তারপর provider — কারণ customer-route টাকা আনে এবং provider-route-এ টাকা যায়
  2. তারপর ছোট AS_PATH (কম hop)
  3. তারপর MED, IGP-cost, শেষ টাই-ব্রেক router-ID

অর্থাৎ BGP হুবহু shortest-path algorithm নয় — policy-engine যেটা path-length শুধু tie-breaker হিসেবে জানে। একটা AS ইচ্ছে করলে দ্বিগুণ-লম্বা path নেয় কারণ সেটা তার customer-এর — আর এটাই feature, bug নয়: প্রতিটা রাজ্য নিজের ট্রাফিক-অর্থনীতি নিজে ঠিক করবে।

Convergence — ধীরে-ঘুরে স্থির হওয়া

Route বদলালে খবর সারা ইন্টারনেটে পৌঁছাতে মিনিট লাগতে পারে — OSPF-র millisecond-scale-এর বিপরীতে। কারণ: withdrawal এক AS-থেকে আরেক AS-এ ঢেউয়ের মতো যায়, প্রতিটা router alternative-path গুনে- গুনে দেখে (path exploration), MRAI-timer (~৩০ সেকেন্ড) update- গুলো batch করে ধরে রাখে। এটা দুর্বলতা মনে হলেও ইচ্ছাকৃত stability- valve — নইলে flap করা route সারা পৃথিবীর CPU খেয়ে ফেলত।

ভেতরে কী ঘটছে

Count-to-infinity — RIP-র মৃত্যু-নাটক

তিন router সরলরেখায়: A — B — C। C-এর পেছনে network N (metric 1 C থেকে)। সবার টেবিল স্বাস্থ্যকর। হঠাৎ C–N link মরে গেল:

t=0    C: "N মরে গেছে!"        B-এর টেবিলে এখনো: "N? A-এর মাধ্যমে 3"
t=ε    B → C: "N আমার কাছে 3-এ" ← পুরনো rumor!
t=ε    C হিসাব করে: "তাহলে আমার মাধ্যমে B-এর কাছে 4!"
       B পরের দানায়: "C বলছে 4 → আমার 5" ...
       A↔B↔C একে অপরকে বাড়তি metric গুনতে থাকে — অসীম পর্যন্ত
       (RIP-এ ১৬-ই infinity, তাই ১৬-এ গিয়ে মরে)

দুজন একে অপরকে দেখে ভাবে অন্যজন জানে রাস্তা — দুজনেই mirror-এর সামনে। প্রতিকার: split horizon (“যে interface থেকে শিখেছি, সেখানে ফেরত শেখাব না”), poison reverse (“শিখেছি সেখানেই 16 লিখে ফেরত”), triggered updates। কিন্তু worst-case ধীর — bad-news slow। Link-state-এ এই পুরো পরিবার অসম্ভব: কেউ rumor ছড়ায় না, map সরাসরি বদলায়।

BGP session-এর ভেতরে

দুই BGP-router কথা বলে দীর্ঘ-lived TCP connection-এ (port 179) — reliability-র দায়িত্ব TCP-র, BGP নিজে transport নতুন বানায় না। Session-এ তিন জাত message: OPEN (capability exchange), UPDATE (নতুন NLRI + path-attributes অথবা withdrawal), KEEPALIVE।

প্রতিটা UPDATE-এর ভেতরে attribute-সেট — আমাদের কাজের চারটা: NEXT_HOP (packet কার কাছে ফেলে যাব), AS_PATH (loop-prevention + length-metric), LOCAL_PREF (আমার AS-এর ভেতরের প্রিয়তা — AS-এর বাইরে ছড়ায় না), MED (peer-কে ইঙ্গিত “তোমার কাছে এই পথ ছোট”)।

Pipeline তিন ধাপ: RIB-in (প্রাপ্ত সব route) → policy-filter → best-path selection → RIB-out (কাদের কাছে কী re-announce করব)। আসল engineering এখানেই: import/export filter — কোন prefix কার কাছে গ্রহণযোগ্য।

Kernel-এর সিদ্ধান্ত — এক ঝলকে দেখা

Linux-এ যেকোনো মুহূর্তে kernel কী সিদ্ধান্ত নেবে, জিজ্ঞেস করা যায়:

ip route get 8.8.8.8
8.8.8.8 via 203.0.113.1 dev eth0 src 203.0.113.42 uid 1000
    cache

পড়ুন: destination-এর জন্য LPM-winner হলো default (via 203.0.113.1), বের হবে eth0 দিয়ে, source-address বেছে নিল 203.0.113.42। Kernel-ভেতরে এই lookup FIB-trie-তে — prefix-tree যার node-গুলো bit — CIDR-লেসনের tree-ভাবনার production রূপ।

Hijack — কীভাবে ঘটে, কীভাবে আটকায়

BGP বিশ্বাসের উপর দাঁড়ানো: কেউ যা announce করে, neighbor তা forward করে। Defensive framing এখানে জরুরি — incident বেশিরভাগই misconfiguration, আর প্রতিকার সবসময় প্রস্তুতি:

Case study — YouTube, ফেব্রুয়ারি 2008: Pakistan Telecom দেশীয় censorship-র জন্য YouTube-এর 208.65.152.0/24 blackhole করতে চেয়েছিল — ভেতরের নিয়ম হিসেবে। কিন্তু ওই more-specific /24 ভুলে upstream PCCW-কে export হয়ে যায়, আর পৃথিবীজুড়ে routers ভাবে “YouTube-এর আরও specific রাস্তা পেলাম” — দুই ঘণ্টা global YouTube- traffic পাকিস্তানে গিয়ে অন্ধকূপে পড়ে। YouTube counter-announce করে স্বাভাবিক করে। পাঠ তিনটা: (১) export-filter না-থাকা এক AS-এর ভুলকে global করে তোলে, (২) প্রতিটা operator-কে inbound filter রাখতেই হয়, (৩) origin-validation ছাড়া বিশ্বাস blind।

আজকের defensive-stack:

  • Prefix-lists ও max-prefix limits — প্রত্যাশিত-বাইরের announcement ও volume প্রত্যাখ্যান
  • IRR filters — registry-র লিখিত অনুমতির সাথে মিলিয়ে accept
  • RPKI (ROA) — cryptographic signed ঘোষণা “এই prefix শুধু এই origin-ASN থেকে বৈধ”; invalid এলে drop। Adoption বাড়ছে, তবু incomplete — তাই layering-ই নীতি

উদাহরণ

একটা announcement-এর জীবনযাত্রা

Scenario: ছোট hosting-company AS65001, customer-of ISP AS65002, যার provider AS65003। AS65001-এর ঠিকানা 203.0.113.0/24।

ধাপ ১   AS65001 → AS65002:  announce 203.0.113.0/24,  AS_PATH = (empty)
ধাপ ২   AS65002 prepend করে ভেতরে ঢোকায়, বাইরে পাঠায়:
        AS65003-কে:          AS_PATH = 65002 65001
ধাপ ৩   AS65003 পৃথিবীতে:    AS_PATH = 65003 65002 65001
ধাপ ৪   দূরের এক router উত্তর-packet পাঠায় reverse-path ধরে:
        dest 203.0.113.55 → LPM মেলে /24 → follow AS_PATH-উল্টো

এখন AS65002-এর কাছে একই prefix-এর দুই offer:

Offer-A: সরাসরি customer AS65001-এর কাছ থেকে, AS_PATH = 65001
         (১ hop), LOCAL_PREF = 200   [customer-route]
Offer-B: provider AS65003 ঘুরে একই prefix, AS_PATH = 65003 65001
         (২ hops), LOCAL_PREF = 100  [provider-route]

Shortest-path বিশ্বাসকারী Offer-A বেছে নেবে — আর এখানে সেটাই হবে। কিন্তু উদ্দেশ্য উল্টালে? যদি AS65002 চায় traffic AS65003-এর দিক দিয়ে যাক (contract-জন্য), সে শুধু Offer-B-এর LOCAL_PREF বাড়িয়ে দেবে — দ্বিগুণ-লম্বা path জিতে যাবে, আইনসিদ্ধভাবে। এটাই BGP-র সার: policy প্রথমে, geometry পরে।

LPM-decision পূর্ণ trace

Router-এর FIB:

#   Prefix              Via            Proto
1   0.0.0.0/0           203.0.113.1    static
2   172.16.32.0/21      192.168.50.2   bgp
3   172.16.37.128/25    192.168.50.6   bgp
4   172.16.36.0/24      192.168.50.9   static

Destination 172.16.37.99: কোন কোন entry মেলে? /21 কভার করে 172.16.32.0–39.255 ✓; /25 কভার করে 37.128–37.255 ✗; /24 (36.x) ✗; default ✓। Winner entry 2 — via 192.168.50.2।

Destination 172.16.37.200: /21 ✓, /25 ✓ (128–255-এর ভেতর), /24 ✗। Winner entry 3 — more-specific জেতে। একই /21-block-এর দুই ভাগ দুই দিকে যায় — ঠিক এভাবেই ISP-রা traffic-engineering করে।

ছবিতে

AS-জগতের সম্পর্ক-চিত্র

                Tier-1 ASes (transit কেউ না, সবাই peer)
             ┌─────────┬──────────┬─────────┐
           AS174    AS3356    AS6939      ...
                        ▲ (provider)
                        │ (customer — টাকা দেয়)
                    Regional ISP (AS65003)
                        ▲
                        │
                   Access ISP (AS65002) ◄──peer──► Content CDN (AS13335)
                        ▲
                        │
                  Hosting Co (AS65001)  University (AS9999) ...
Customer-provider links উপরে-নিচে (টাকা), peer-links আড়াআড়ি (free exchange) — BGP-policy-র পুরো geography এই তিন রেখাতেই।

দুই দর্শনের সিদ্ধান্ত-প্রক্রিয়া

BGP best-path selection — সরলীকৃত ladder
  1. ১. Reachability + policy-filterfilter-এ reject হলে প্রতিযোগিতাই নেই
  2. ২. Highest LOCAL_PREFcustomer > peer > provider — ব্যবসার ভোট
  3. ৩. Shortest AS_PATHpolicy-tie-এ geometry-র ভোট
  4. ৪. Lowest MED → IGP cost → tie-breaktechnical micro-adjustments
N মরল (C-তে)          B-এর বিশ্বাস        C-এর বিশ্বাস        ঘটনা
t0:  C: N=∞           B: N=A-দিয়ে 3       C: N=∞             B এখনো পুরনো জানে
t1:                   B: N=C-দিয়ে 4       C: N=B-দিয়ে 4!     rumor-বিনিময়
t2..t15:              B: N=5,6,7…         C: N=5,6,7…        দুজন একে-অপরে গুনছে
t16:                  B: N=16 (∞)         C: N=16            অবশেষে মরল — কিন্তু কত সময়!
Count-to-infinity — দুই router একে অপরের পুরনো rumor-এ বিশ্বাস করে metric-কে অসীমে ঠেলে দেয়; split horizon ছাড়া RIP ১৬-এ গিয়েই থামে।

নিজে চালিয়ে দেখুন

EXPERIMENT

kernel-এর সিদ্ধান্ত জিজ্ঞেস করুন, পথের AS-পরিচয় খুঁড়ুন, স্থিরতা মাপুন

Linux / macOS· ২০ মিনিট

ধাপ ১ — kernel-কে প্রশ্ন করুন:

# Linux
ip route get 8.8.8.8
ip route get 1.1.1.1
# macOS
route -n get 8.8.8.8

প্রতিটা উত্তরে পড়ুন: কোন via-gateway, কোন dev-interface, কোন src বেছেছে। এবার নিজের LAN-এর কোনো address জিজ্ঞেস করুন —

ip route get 192.168.1.1

— উত্তরে dev eth0 src … direct-link, via ছাড়া: connected-route জিতেছে, longest-prefix সবচেয়ে লম্বা (/24 connected vs /0 default)।

ধাপ ২ — পথ ধরে AS-পরিচয় খোঁজা:

traceroute 8.8.8.8
# প্রতিটা hop-IP নিয়ে Team Cymru-র ASN-mapping service:
whois -h whois.cymru.com ' -v 8.8.8.8'
whois -h whois.cymru.com ' -v 142.250.77.14'

Cymru-র উত্তরে ASN + AS-name + country — এইভাবে আপনি traceroute- এর anonymous-hop-গুলোকে organization-name-এ translate করতে পারেন: কোন হপে আপনার ISP শেষ, কোন হপে transit-network, কখন Google-এর AS-ভূমিতে পা পড়ল।

ধাপ ৩ — স্থিরতা-watch (mtr):

mtr -w -c 60 8.8.8.8        # ৬০ report, শেষে cumulative table

Loss% column মাঝপথে অশূন্য দেখালেও শেষ-hop Loss% 0 — মাঝের router- রা ICMP reply deprioritize করে, traffic-drop না। এই ভেদটা করতে না-পারলে false-alarm ticket লেখা হয়। দুই-এক ঘণ্টা পর আবার চালিয়ে path-বদল (different middle-hops) দেখা গেলে — সেটাই BGP-convergence/ load-balancing-এর চোখে-দেখা প্রমাণ।

এটা কী প্রমাণ করে

LPM-rule আপনার kernel-এ এই মুহূর্তে চলছে — যেকোনো destination-এর route-sিদ্ধান্ত query করে দেখা যায়, আর traceroute-এর প্রতিটা hop-এর পেছনের AS-ও নাম-ঠিকানাসহ উদ্ধার করা যায়।

নিজে বানান

BUILD IT

longest-prefix-match engine — প্রতি length-bucket-এ binary search

Python · ●●●○○
  1. route-table গুছিয়ে রাখুন prefix-length অনুযায়ী ৩৩টা bucket-এ
  2. lookup: /32 থেকে /0 নামতে নামতে প্রথম মিলটাই winner — specificity-first
  3. প্রতি bucket-এ sorted network-list + bisect — binary search প্রতি ধাপে
  4. tie-break: একই prefix-এ একাধিক route থাকলে admin-distance, তারপর metric
  5. decision-trace print করুন — কোন কোন entry পরীক্ষা হলো

লক্ষ্য: kernel-এর LPM-sিদ্ধান্তের miniature — provided table-এ route-lookup, tie-break tests সহ। Core গণিত আবার manual bit-shift (CIDR লেসনের ধারাবাহিকতা)।

from bisect import bisect_left

ADMIN = {'connected': 0, 'static': 1, 'ospf': 10, 'bgp': 20}

def ip_to_int(t):
    v = 0
    for p in t.split('.'):
        v = (v << 8) | int(p)
    return v

def mask(p):
    return (0xFFFFFFFF << (32 - p)) & 0xFFFFFFFF if p else 0

class FIB:
    def __init__(self):
        self.buckets = {p: {} for p in range(33)}   # plen → net-int → [routes]

    def add(self, prefix, plen, via, proto, metric=0):
        key = ip_to_int(prefix) & mask(plen)
        self.buckets[plen].setdefault(key, []).append(
            (ADMIN[proto], metric, via, proto))

    def lookup(self, dst):
        ip = ip_to_int(dst)
        probed = []
        for plen in range(32, -1, -1):              # লম্বা → ছোট
            net = ip & mask(plen)
            bucket = self.buckets[plen]
            keys = sorted(bucket)                   # demo-তে ছোট; বড় টেবিলে একবার sort
            i = bisect_left(keys, net)
            hit = i < len(keys) and keys[i] == net
            probed.append(f'/{plen}:{"HIT" if hit else "·"}')
            if hit:
                best = min(bucket[keys[i]])         # admin, তারপর metric
                return best, probed
        return None, probed                         # বাস্তবে অসম্ভব — /0 থাকলে

fib = FIB()
fib.add('0.0.0.0',       0,  '203.0.113.1',  'static')
fib.add('8.8.0.0',      16,  '10.9.9.1',     'static', 5)
fib.add('8.8.4.0',      22,  '10.9.9.2',     'ospf',  12)
fib.add('172.16.32.0',  21,  '192.168.50.2', 'bgp',    3)
fib.add('172.16.37.128',25,  '192.168.50.6', 'bgp',    1)
fib.add('198.51.100.0', 24,  '10.0.0.1',     'bgp',    1)
fib.add('198.51.100.0', 24,  '10.0.0.2',     'static', 9)

for dst in ['8.8.8.8', '8.8.5.9', '172.16.37.99',
            '172.16.37.200', '203.114.55.5', '198.51.100.7']:
    (admin, metric, via, proto), trace = fib.lookup(dst)
    print(f'{dst:>15} → via {via:<14} ({proto}, admin {admin})')
    print(f'{"":>15}   probe: {" ".join(trace)}')

# tie-break assertion: একই /24-এ static(admin 1) জিতবে bgp(admin 20)-কে
best, _ = fib.lookup('198.51.100.7')
assert best[0] == ADMIN['static'], 'admin-distance tie-break ভাঙল'
print('tie-break test: static beats bgp on equal prefix ✓')

প্রত্যাশিত output:

        8.8.8.8 → via 10.9.9.1      (static, admin 1)
                   probe: /32:· /31:· /30:· /29:· /28:· /27:· /26:· /25:· /24:· /23:· /22:· /21:· /20:· … /16:HIT … /0:·
        8.8.5.9 → via 10.9.9.2      (ospf, admin 10)
   172.16.37.99 → via 192.168.50.2  (bgp, admin 20)
  172.16.37.200 → via 192.168.50.6  (bgp, admin 20)
  203.114.55.5 → via 203.0.113.1    (static, admin 1)
  198.51.100.7 → via 10.0.0.2       (static, admin 1)
tie-break test: static beats bgp on equal prefix ✓

লক্ষ্য করুন দুইটা সূক্ষ্মতা: 8.8.8.8-এ /22-HIT হয় না (8.8.4.0/22 মানে 8.8.4–8.8.7 — 8.8.8.8 বাইরে!), তাই probe নেমে /16-তে হিট; 198.51.100.7-এ একই prefix-এর দুই route-এর লড়াই admin-distance-এ মেটায় — ঠিক kernel-র যুক্তি।

নিজে বাড়ান:

  1. Bucket-keys একবার sort করে cache করুন — insert-time maintain, lookup-time zero-sort
  2. blackhole route-type যোগ করুন — hit হলে explicit DROP রিপোর্ট (null-route practice-এর simulation)
  3. দুই FIB-এর snapshot diff করে “convergence delta” printer লিখুন — কোন prefix-এর next-hop বদলাল

বাস্তব সিস্টেমে

বাস্তব জগতে routing আর BGP

DFZ-র স্কেল। Default-free zone — যে core-router-রা default-route ছাড়া পুরো table ধরে — আজ IPv4-এ প্রায় দশ-লাখ, IPv6-তে দুই-লাখের কোঠায় route বহন করে (CIDR-aggregation সহ!)। পুরনো router-model memory শেষ হয়ে বাজার থেকে নামে ঠিক এই সংখ্যায় — “routing-table growth” industry-র স্থায়ী মাথাব্যথা।

Anycast — এক ঠিকানা, শত স্থান। Google-এর 8.8.8.8 পৃথিবীর শতাধিক জায়গা থেকে BGP-তে announce হয়; আপনার packet সবসময় topologically কাছতম copy-তে যায় — DNS-latency মিলিসেকেন্ডে নামে। CDN-গুলোর মূল অস্ত্রও এটাই: এক IP, বিশ্বজুড়ে edge।

IXP — peers-দের মিলনমঞ্চ। DE-CIX, LINX, AMS-IX-এর মতো exchange- point-এ শত AS একই switch-fabric-এ fiber নিয়ে peer করে — traffic transit-provider ঘুরিয়ে না-গিয়ে সরাসরি প্রতিবেশীতে। আপনার country- র ভেতরের traffic-এর বড় অংশ এভাবেই local থাকে।

Leak ও defense-এর আজকের অবস্থা। বড় accidental-leak (যেমন 2019- এর এক small-Pennsylvania-company-র ভুল announce যা Cloudflare-এর traffic কয়েক ঘণ্টা টেনে নেয়) দেখায়: ভুল সবসময় সামান্য হয় না। Industry-response: RPKI-ROA coverage বাড়ছে, বড় operators invalid- route drop করছে, আর monitoring-সেবাগুলো looking-glass-দিয়ে global visibility বিক্রি করে — আপনার prefix কে কোথায় দেখছে তা live।

যে ভুলগুলো সবাই করে

“Router-রা পুরো ইন্টারনেটের map জানে — তাই সব packet সঠিক পথে যায়।”

কোনো router-ই global-map জানে না। Edge-device জানে এক default; core router জানে destination-prefix → next-hop mapping, কোন topology-নয়; আর BGP-র জ্ঞান policy-filtered — আপনি যে path দেখেন, neighbor অন্য path দেখে (asymmetric routing স্বাভাবিক)। Correctness-টা আসে distributed-consensus-এর অভ্যাস থেকে, omniscience থেকে নয়।

“BGP সবসময় shortest path বেছে নেয় — routing মানেই distance-minimization।”

LOCAL_PREF-ই প্রথম criterion — অর্থাৎ business-relationship। Customer- route লম্বা হলেও জেতে; provider-ঘুরিয়ে-আসা ছোট path হেরে যায়। AS_PATH-length মাত্র তৃতীয় ধাপ। “Internet routing is economics with packets attached” — রহস্যভেদে এই বাক্যটাই সবচেয়ে সৎ সারাংশ।

“Static routing পুরনো-যুগের জিনিস — আজ সব dynamic protocol।”

উল্টো: পৃথিবীর সবচেয়ে বেশি installed route-টা static/default — প্রতিটা laptop, phone, home-router-এ। Stub-network (এক দরজা) dynamic-protocol শেখার কোনো তথ্য-সুবিধা পায় না। Dynamic protocols জ্বলে ওঠে ঠিক তখন, যখন একাধিক path আর বদলানো topology — অর্থাৎ core-এ।

“OSPF আর BGP interchangeable — দুটোই তো 'routing protocol'।”

Trust-boundary সব বদলে দেয়। OSPF এক administrative-domain-এর ভেতরে: সবাই এক মালিকের, লক্ষ্য fastest optimal convergence, metric bandwidth। BGP domain-দের মধ্যে: কেউ কাউকে বিশ্বাস করে না, লক্ষ্য policy-enforcement আর stability — speed ইচ্ছাকৃতভাবে ত্যাগ (MRAI, slow exploration)। একটার design-goal অন্যটার design-flaw।

“Route-hijack মানে BGP fundamentally broken — ঠিক করা যায় না।”

BGP বিশ্বাস-ভিত্তিক ঠিকই, কিন্তু বিশ্বাস verify করার যন্ত্র এখন standard-এ আছে: prefix-filtering, max-prefix, IRR, আর cryptographic origin-validation (RPKI)। Incident-গুলোর বেশিরভাগ misconfiguration — defense-in-depth (layered filters) সেগুলো ধরে। বিপরীত পাঠটাও সত্যি: validation-deployment incomplete হলে residual-risk থাকবেই — তাই monitoring বাধ্যতামূলক।

বুঝেছেন কি না দেখুন

1

Forwarding আর routing-এর পার্থক্য দুই লাইনে — plane, time-scale আর জ্ঞানের উৎস তুলনা করুন। RIB/FIB কোনটার?

স্মরণ

Forwarding = data-plane: প্রতি packet-এ table-lookup, nanosecond, জ্ঞানের উৎস তৈরি FIB। Routing = control-plane: protocol চালিয়ে table-নির্মাণ, seconds–minutes, জ্ঞান neighbors/flooding থেকে। RIB control-plane-এর raw-তালিকা, FIB তার optimized forwarding-copy।

2

FIB-এ আছে: 10.0.0.0/8, 10.1.0.0/16, 10.1.2.0/24, 0.0.0.0/0। Destination 10.1.2.99 — কোনটা জেতে? Destination 11.0.0.1?

প্রয়োগ

10.1.2.99 → 10.1.2.0/24 (longest match)। 11.0.0.1 → কোনো specific মেলে না → 0.0.0.0/0 default। LPM সবসময় মেলা-গুলোর মধ্যে longest — না-মেলা প্রার্থী কোনোদিনই competition-এ ছিল না।

3

আপনার AS একটা UPDATE পেল যার AS_PATH-তে আপনার নিজের ASN আছে। কী করবেন আর কেন — নিয়মটার নামসহ।

প্রয়োগ

Drop করব — AS_PATH loop-prevention: নিজের ASN পথে থাকা মানে announcement-টা আমার ঘর ঘুরে এসেছে; গ্রহণ করলে চক্র ঘুরতেই থাকবে। এটাই path-vector-এর distance-vector-উত্তর: infinity-count গণনার বদলে loop-টা structural-ভাবে অসম্ভব করা।

4

“Good news travels fast, bad news travels slow” — RIP-র কোন mechanism-এর কথা? Count-to-infinity ঠিক কোন মুহূর্তে জন্ম নেয়?

যুক্তি

Distance-vector-র rumor-propagation। Bad-news-slow-এর জন্ম-মুহূর্ত: এক router N-হারানো ঘোষণা করার ঠিক আগে তার neighbor পুরনো টেবিল থেকে “N আমার কাছে পৌঁছয়” বলে ফেলে — হারানো-router সেই stale-offer বিশ্বাস করে নিজের মাধ্যমে ফেরত গণনা শুরু করে; দুজন mirror-বিশ্বাসে metric বাড়তে থাকে। Split horizon/poison reverse stale-offer-টাকেই বন্ধ করে।

5

BGP নিজের reliability protocol বানায়নি — TCP-র উপর বসেছে কেন? Trade-off কী?

যুক্তি

Reliability একবার ভালোভাবে সমাধান হয়ে গেলে পুনর্বাসন বৃথা; BGP-র নতুন সমস্যা policy আর scale — transport নয়। Trade-off: TCP-র head- of-line blocking আর connection-state এক session-এর জন্য সারাজীবন — attack-surface (session-reset দিয়ে route-withdrawal storm)। তবু simplicity-র দাম হিসেবে industry এটাই বেছেছে।

6

আপনি একটা AS চালান। Upstream ভুলে অন্য-origin-এর /24 announce করে ফেলল — আপনার defensive-layer-গুলো কী কী, কোনটা কোন threat আটকায়?

ডিজাইন

Layered: (১) inbound prefix-filter/max-prefix — প্রত্যাশিত-বাইরের volume ও prefix প্রত্যাখ্যান, আপনার FIB pollution আটকায়; (২) outbound export-filter — নিজের ভুল বিশ্বে ছড়ানো আটকায় (Pakistan Telecom-এর মিস হওয়া স্তরটা); (৩) RPKI ROA নিজের prefix-এ — ভুয়া origin বিশ্বজুড়ে invalid হয়ে পড়ে; (৪) looking-glass monitoring — detect-fast, কারণ mitigation-এর প্রথম শর্ত জানা। কোনো এক layer নয়, সবগুলোর সম্মিলনই নীতি।

এরপর কী

এরপর কী

Routing-যন্ত্রটা দেখলাম — packet এখন continent পেরোয়। কিন্তু গল্পের একটা লুকানো দাগ আছে: পৃথিবীতে public IPv4 ঠিকানা ফুরিয়ে গেছে, তবু লাখ-লাখ device internet-এ আছে। কীভাবে? একটা hack — যেটা temporary বলে জন্মেছিল, permanent হয়ে গেল: NAT।

পরের লেসনে:

  • NAPT translation-table — কীভাবে ৫-tuple-এর ভেতরে ঠিকানা বদলায়
  • End-to-end principle-এর ভাঙন আর inbound-initiation-এর সংকট
  • STUN/TURN/hole-punching — NAT-এর পেছনের দুই peer কীভাবে দেখা কয়
  • CGNAT-যুগের double-NAT যন্ত্রণা, আর accidental-firewall-এর দুই মুখ

আজকের LPM-engine-এ NAT-এর জায়গাও আছে — masquerade-rule-ও একটা route-ই। দেখা হবে ঠিকানা-রক্ষাকর্মীদের সদর-দপ্তরে।

আরও পড়ুন

  • RFC 4271 — A Border Gateway Protocol 4 (BGP-4) — Y. Rekhter, T. Li, S. Hares (eds.), IETF · BGP-র authoritative specification — path attributes ও state machine এখানেই
  • Internet Routing Architectures (2nd ed.) — Sam Halabi · Inter-domain routing ও policy-design-এর ক্লাসিক পাঠ্য
  • Computer Networking: A Top-Down Approach — Network Layer: routing অধ্যায় — Kurose & Ross · Distance-vector বনাম link-state-এর পাঠ্যপুস্তক-ধাঁচের তুলনা