রাউটিং বেসিকস — রাউটিং টেবিল ও ফরওয়ার্ডিং
এই পাঠে যা শিখবেন
- রাউটিং ও সুইচিং-এর মধ্যে মৌলিক পার্থক্য
- রাউটিং টেবিলের গঠন — নেটওয়ার্ক প্রিফিক্স, next hop, ইন্টারফেস
- Longest Prefix Match নিয়ম — কেন এটি নির্ভুলভাবে কাজ করাতে হবে
- ডিফল্ট রুট কীভাবে একটি catch-all হিসেবে কাজ করে
- Python দিয়ে একটি সত্যিকারের longest-prefix-match লুকআপ ফাংশন লেখা ও যাচাই করা
১ · রাউটিং বনাম সুইচিং
M3-এ আমরা দেখেছি একটি সুইচSwitchডেটা লিংক লেয়ারের ডিভাইস, যা ডেস্টিনেশন MAC অ্যাড্রেস দেখে একই LAN-এর ভেতরে ফ্রেম ফরওয়ার্ড করে (M3/L12)। কীভাবে ডেস্টিনেশন MAC অ্যাড্রেস দেখে ফ্রেম ফরওয়ার্ড করে — কিন্তু সেটা শুধু একটি LAN-এর ভেতরেই কাজ করে। রাউটারRouterনেটওয়ার্ক লেয়ারের ডিভাইস, যা ডেস্টিনেশন IP অ্যাড্রেস দেখে বিভিন্ন নেটওয়ার্কের মধ্যে প্যাকেট ফরওয়ার্ড করে। ভিন্ন কাজ করে — এটি ডেস্টিনেশন IP অ্যাড্রেস দেখে বিভিন্ন নেটওয়ার্কের মধ্যে প্যাকেট ফরওয়ার্ড করে। এক কথায় —
ডেস্টিনেশন MAC অ্যাড্রেস দেখে, একই LAN-এর ভেতরে, ফ্লাট ফরওয়ার্ডিং টেবিল দিয়ে।
ডেস্টিনেশন IP অ্যাড্রেস দেখে, বিভিন্ন নেটওয়ার্কের মধ্যে, প্রিফিক্স-ভিত্তিক রাউটিং টেবিল দিয়ে।
২ · রাউটিং টেবিল কী
প্রতিটি রাউটার একটি রাউটিং টেবিল রাখে — এমন একটি তালিকা যেখানে প্রতিটি এন্ট্রি বলে দেয়, "এই নেটওয়ার্ক প্রিফিক্সের দিকে যেতে হলে, এই next hop-এ পাঠাও, এই আউটগোয়িং ইন্টারফেস দিয়ে।" যখন একটি প্যাকেট আসে, রাউটার তার ডেস্টিনেশন IP-এর সাথে টেবিলের প্রতিটি এন্ট্রির নেটওয়ার্ক প্রিফিক্স মিলিয়ে দেখে।
৩ · Longest Prefix Match (LPM) — সবচেয়ে গুরুত্বপূর্ণ নিয়ম
সমস্যা হলো — একাধিক এন্ট্রি একই সাথে একটি ডেস্টিনেশনের সাথে মিলে যেতে পারে। ধরুন টেবিলে 10.0.0.0/8, 10.20.0.0/16, এবং 10.20.30.0/24 — তিনটি এন্ট্রিই আছে, আর ডেস্টিনেশন IP হলো 10.20.30.5। তিনটি প্রিফিক্সই এই IP-এর সাথে মেলে (কারণ 10.20.30.5 তিনটি নেটওয়ার্কেরই ভেতরে পড়ে)। এখানেই Longest Prefix Match নিয়ম কাজ করে —
একাধিক রাউটিং টেবিল এন্ট্রি একটি ডেস্টিনেশনের সাথে মিললে, রাউটার সবসময় সবচেয়ে দীর্ঘ প্রিফিক্সওয়ালা (অর্থাৎ সবচেয়ে নির্দিষ্ট) এন্ট্রিটি ব্যবহার করে। উপরের উদাহরণে /24 এন্ট্রি জিতবে — কারণ ৮ বা ১৬ বিটের চেয়ে ২৪ বিট মেলানো অনেক বেশি নির্দিষ্ট তথ্য দেয়। এই নিয়মটি এতটাই মৌলিক যে প্রতিটি IP রাউটার হার্ডওয়্যার/সফটওয়্যারে এটি প্রয়োগ করে।
৪ · ডিফল্ট রুট — সব-কিছুর জন্য একটি Catch-All
0.0.0.0/0 — এই বিশেষ এন্ট্রিটি প্রিফিক্স লেন্থ শূন্য, তাই এটি যেকোনো ডেস্টিনেশন IP-এর সাথে মেলে। একে ডিফল্ট রুট বলা হয় — "আমার কাছে এর চেয়ে বেশি নির্দিষ্ট কোনো রুট না থাকলে, এখানে পাঠাও" — সাধারণত এটি একটি ISP গেটওয়ের দিকে নির্দেশ করে। যেহেতু এর প্রিফিক্স লেন্থ সবচেয়ে ছোট (শূন্য), LPM নিয়ম অনুযায়ী এটি সবসময় সবার শেষে বিবেচিত হয় — অন্য কোনো নির্দিষ্ট এন্ট্রি থাকলে সেটাই আগে জেতে।
# longest-prefix-match রাউটিং টেবিল লুকআপ — সত্যিকারের লজিক, hand-trace করে যাচাই করা
def ip_to_binary(ip_string):
octets = ip_string.split(".")
return "".join(f"{int(o):08b}" for o in octets)
def lookup_route(dest_ip, table):
"""table: (network_prefix, prefix_length, next_hop) এন্ট্রির তালিকা।
সব মিলে যাওয়া এন্ট্রির মধ্যে সবচেয়ে দীর্ঘ prefix_length-ওয়ালাটি ফেরত দেয়।"""
dest_bits = ip_to_binary(dest_ip)
best_hop = None
best_len = -1
matched_entries = []
for network, prefix_len, next_hop in table:
network_bits = ip_to_binary(network)
if dest_bits[:prefix_len] == network_bits[:prefix_len]:
matched_entries.append((network, prefix_len, next_hop))
if prefix_len > best_len:
best_len = prefix_len
best_hop = next_hop
return best_hop, best_len, matched_entries
routing_table = [
("10.0.0.0", 8, "R1 (eth0)"),
("10.20.0.0", 16, "R2 (eth1)"),
("10.20.30.0", 24, "R3 (eth2)"),
("0.0.0.0", 0, "ISP-Gateway (eth3)"),
]
test_destinations = ["10.20.30.5", "10.99.9.9", "192.168.1.1"]
for dest in test_destinations:
hop, plen, matches = lookup_route(dest, routing_table)
match_str = ", ".join(f"{n}/{p}" for n, p, _ in matches)
print(f"গন্তব্য {dest:15s} -> মিলেছে এমন এন্ট্রি: [{match_str}]")
print(f" {'':15s} LPM বিজয়ী: {hop} (prefix length /{plen})")
# --- স্ব-যাচাই: /24 এর সরাসরি জেতা উচিত যেখানে /8, /16, /24 সবগুলোই মেলে ---
hop1, plen1, _ = lookup_route("10.20.30.5", routing_table)
assert hop1 == "R3 (eth2)" and plen1 == 24, "overlapping প্রিফিক্সে /24-এর জেতা উচিত ছিল!"
hop2, plen2, _ = lookup_route("10.99.9.9", routing_table)
assert hop2 == "R1 (eth0)" and plen2 == 8, "শুধু /8 মিলার কথা ছিল!"
hop3, plen3, _ = lookup_route("192.168.1.1", routing_table)
assert hop3 == "ISP-Gateway (eth3)" and plen3 == 0, "শুধু ডিফল্ট রুট মিলার কথা ছিল!"
print("\nসব assertion পাস করেছে — Longest Prefix Match সঠিকভাবে কাজ করছে।")
10.20.30.5-এর জন্য /8, /16, ও /24 তিনটি এন্ট্রিই মিলেছে, কিন্তু বিজয়ী শুধু /24 এন্ট্রিটি (R3), কারণ সেটাই সবচেয়ে দীর্ঘ প্রিফিক্স। এটাই LPM নিয়মের বাস্তব প্রমাণ — কোনো hand-derived উত্তর নয়, উপরের কোড সত্যিই এটি হিসাব করে দেখিয়েছে।
রাউটিং টেবিল লুকআপ কোনো "প্রথম যেটা মেলে সেটাই" নিয়ম নয় — এটি সবসময় সবচেয়ে নির্দিষ্ট মিল খোঁজে। ডিফল্ট রুট (0.0.0.0/0) সেফটি-নেট হিসেবে কাজ করে যখন আর কোনো নির্দিষ্ট রুট নেই। M4/L18-L20-এ আমরা দেখব কীভাবে এই টেবিলগুলো নিজে থেকেই তৈরি ও আপডেট হয় (RIP, OSPF, BGP প্রোটোকলের মাধ্যমে)।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ যদি একটি ডেস্টিনেশন IP-এর সাথে টেবিলের কোনো এন্ট্রিই না মেলে (ডিফল্ট রুট ছাড়া), তাহলে কী হয়?
যদি ডিফল্ট রুট (0.0.0.0/0) টেবিলে না থাকে এবং অন্য কোনো এন্ট্রিও না মেলে, রাউটার প্যাকেটটি বাতিল
করে দেয় এবং সাধারণত প্রেরককে একটি ICMP "Destination Unreachable" বার্তা পাঠায় (M4/L21-এ ICMP নিয়ে বিস্তারিত
দেখব)। এই কারণেই বেশিরভাগ রাউটার টেবিলে একটি ডিফল্ট রুট রাখে — অন্তত ইন্টারনেটমুখী ট্রাফিকের জন্য একটি
ফলব্যাক নিশ্চিত করতে।
প্র ০২ Longest Prefix Match কেন "সবচেয়ে নির্দিষ্ট তথ্যকে অগ্রাধিকার দাও" নীতির একটি উদাহরণ?
একটি /24 এন্ট্রি বলছে "এই নির্দিষ্ট ২৫৬টি ঠিকানার জন্য আমি জানি ঠিক কোথায় পাঠাতে হবে" — যেখানে
একটি /8 এন্ট্রি বলছে "এই বিশাল ১৬ মিলিয়ন ঠিকানার ব্লকের জন্য সাধারণভাবে এদিকে পাঠাও।" যখন উভয়ই
মেলে, /24-এর তথ্য বেশি নির্ভুল ও হালনাগাদ হওয়ার সম্ভাবনা বেশি (কেউ ইচ্ছাকৃতভাবে সেই নির্দিষ্ট সাবনেটের জন্য
একটি রুট যোগ করেছে) — তাই সেটিকেই অগ্রাধিকার দেওয়া হয়।
প্র ০৩ রাউটিং টেবিল কীভাবে পূর্ণ হয় — সবসময় কি কেউ ম্যানুয়ালি প্রতিটি এন্ট্রি বসিয়ে দেয়?
না — ছোট নেটওয়ার্কে ম্যানুয়াল (স্ট্যাটিক) রুট বসানো সম্ভব, কিন্তু ইন্টারনেট-স্কেলে এটি অসম্ভব। এই কারণেই রাউটিং প্রোটোকল আছে — RIP (M4/L18) ও OSPF (M4/L19) স্বয়ংক্রিয়ভাবে একটি প্রতিষ্ঠানের ভেতরে টেবিল তৈরি করে, আর BGP (M4/L20) বিভিন্ন প্রতিষ্ঠানের নেটওয়ার্কের মধ্যে রুট বিনিময় করে। এই তিনটি প্রোটোকলই মূলত এই একই রাউটিং টেবিল স্বয়ংক্রিয়ভাবে সঠিক রাখার কাজ করে।
অনুশীলন
-
চিন্তা করুন: উপরের রাউটিং টেবিলে যদি একটি নতুন এন্ট্রি
10.20.30.128/25যোগ করা হয়, তাহলে ডেস্টিনেশন10.20.30.5-এর জন্য বিজয়ী এন্ট্রি কি বদলাবে?না, বদলাবে না।
10.20.30.128/25শুধু10.20.30.128থেকে10.20.30.255পর্যন্ত ঠিকানাগুলো কভার করে (প্রথম বিটটি ১), কিন্তু10.20.30.5-এর সংশ্লিষ্ট বিটটি ০ — তাই এই নতুন এন্ট্রি একেবারেই মেলে না। বিজয়ী এন্ট্রি এখনও10.20.30.0/24(R3) থেকে যাবে। -
পরীক্ষা করুন: উপরের কোড সেলে
test_destinationsতালিকায়10.20.31.9যোগ করুন এবং Run চেপে দেখুন কোন এন্ট্রি বিজয়ী হয় ও কেন।10.20.31.9/24এন্ট্রি (10.20.30.0/24)-এর সাথে মেলে না, কারণ তিন নম্বর অক্টেট ৩১ ≠ ৩০। কিন্তু এটি10.20.0.0/16-এর সাথে মেলে (প্রথম দুই অক্টেট 10.20 মিলছে) এবং10.0.0.0/8-এর সাথেও। তাই বিজয়ী হবে R2 (/16), কারণ /24 না মেলায় /16-ই এখন সবচেয়ে দীর্ঘ মিল।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ পরবর্তী পাঠ — ডিসট্যান্স ভেক্টর রাউটিং (RIP) — রাউটিং টেবিল কীভাবে স্বয়ংক্রিয়ভাবে তৈরি হয় তা দেখাবে।
- Cloud Computing & DevOps কোর্স সঙ্গী কোর্স ক্লাউডে রুট টেবিল, VPC পিয়ারিং ও গেটওয়ে কীভাবে ব্যবহারিকভাবে কনফিগার করা হয় তা শিখতে দেখুন।
- Cybersecurity & Ethical Hacking কোর্স সঙ্গী কোর্স রাউটিং তথ্য জাল করে কীভাবে ট্রাফিক পুনর্নির্দেশ করা যায় (যেমন BGP হাইজ্যাকিং) তা শিখতে দেখুন।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps ও Computer Networks — সব এক জায়গায়।