Routing ও BGP — packet যেভাবে continent পেরোয়
Routing and BGP
আপনার packet Sydney পৌঁছায় কীভাবে — longest-prefix-match-এর গণিত, RIP-র অসীম-গণনা দুর্ঘটনা, OSPF-এর ভেতরের Dijkstra, আর সেই BGP যেখানে টাকা দূরত্বকে হার মানায়।
আগে এটা বুঝি
আজ পর্যন্ত আমাদের গল্পে 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
প্রথম ভেদটা সবচেয়ে গুরুত্বপূর্ণ, আর সহজ:
| Forwarding | Routing | |
|---|---|---|
| কাজ | আসা packet-কে সঠিক output-port-এ পাঠানো | কোন destination কোথায় — সেই table বানানো |
| Plane | Data plane | Control plane |
| সময়স্কেল | প্রতি packet, ন্যানোসেকেন্ড | সেকেন্ড–মিনিট পরপর |
| জ্ঞান | শুধু table-lookup | neighbor-দের সাথে 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 15169Loop-prevention এই list-এই: কোনো AS নিজের ASN পথে দেখলে সেই advertisement ফেলে দেয় — ফিরে-ফিরে ঘোরার গাণিতিক অসম্ভবতা। RIP- র infinity-গণনা এখানে structure-level-এই বন্ধ।
Policy — যেখানে মাপ হার মানায়
IPv4-IPv6 লেসন পর্যন্ত আমরা ভেবেছি router “সবচেয়ে ছোট path” বেছে নেয়। BGP-তে সত্যিটা: প্রথমে ব্যবসা, তারপর মাপ। AS-গুলোর তিন সম্পর্ক — customer (টাকা নেয়), peer (বিনিময়ে free), provider (টাকা দেয়)। সাধারণ selection-order:
- LOCAL_PREF: customer-দের দেওয়া route সবচেয়ে প্রিয়, তারপর peer, তারপর provider — কারণ customer-route টাকা আনে এবং provider-route-এ টাকা যায়
- তারপর ছোট AS_PATH (কম hop)
- তারপর 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.88.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 staticDestination 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) ...দুই দর্শনের সিদ্ধান্ত-প্রক্রিয়া
- ১. Reachability + policy-filterfilter-এ reject হলে প্রতিযোগিতাই নেই
- ২. Highest LOCAL_PREFcustomer > peer > provider — ব্যবসার ভোট
- ৩. Shortest AS_PATHpolicy-tie-এ geometry-র ভোট
- ৪. 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 অবশেষে মরল — কিন্তু কত সময়!নিজে চালিয়ে দেখুন
kernel-এর সিদ্ধান্ত জিজ্ঞেস করুন, পথের AS-পরিচয় খুঁড়ুন, স্থিরতা মাপুন
ধাপ ১ — 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 tableLoss% 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-ও নাম-ঠিকানাসহ উদ্ধার করা যায়।
নিজে বানান
longest-prefix-match engine — প্রতি length-bucket-এ binary search
- route-table গুছিয়ে রাখুন prefix-length অনুযায়ী ৩৩টা bucket-এ
- lookup: /32 থেকে /0 নামতে নামতে প্রথম মিলটাই winner — specificity-first
- প্রতি bucket-এ sorted network-list + bisect — binary search প্রতি ধাপে
- tie-break: একই prefix-এ একাধিক route থাকলে admin-distance, তারপর metric
- 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-র যুক্তি।
নিজে বাড়ান:
- Bucket-keys একবার sort করে cache করুন — insert-time maintain, lookup-time zero-sort
blackholeroute-type যোগ করুন — hit হলে explicit DROP রিপোর্ট (null-route practice-এর simulation)- দুই 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 বাধ্যতামূলক।
বুঝেছেন কি না দেখুন
1Forwarding আর 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।
2FIB-এ আছে: 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-টাকেই বন্ধ করে।
5BGP নিজের 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-এর পাঠ্যপুস্তক-ধাঁচের তুলনা