পাঠ ১৭ · ৫৭-এর মধ্যে · মডিউল ৪
Home / Courses / Computer Networks / রাউটিং বেসিকস

রাউটিং বেসিকস — রাউটিং টেবিল ও ফরওয়ার্ডিং

Routing basics — tables & forwarding
৮ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • রাউটিং ও সুইচিং-এর মধ্যে মৌলিক পার্থক্য
  • রাউটিং টেবিলের গঠন — নেটওয়ার্ক প্রিফিক্স, next hop, ইন্টারফেস
  • Longest Prefix Match নিয়ম — কেন এটি নির্ভুলভাবে কাজ করাতে হবে
  • ডিফল্ট রুট কীভাবে একটি catch-all হিসেবে কাজ করে
  • Python দিয়ে একটি সত্যিকারের longest-prefix-match লুকআপ ফাংশন লেখা ও যাচাই করা

১ · রাউটিং বনাম সুইচিং

M3-এ আমরা দেখেছি একটি সুইচSwitchডেটা লিংক লেয়ারের ডিভাইস, যা ডেস্টিনেশন MAC অ্যাড্রেস দেখে একই LAN-এর ভেতরে ফ্রেম ফরওয়ার্ড করে (M3/L12)। কীভাবে ডেস্টিনেশন MAC অ্যাড্রেস দেখে ফ্রেম ফরওয়ার্ড করে — কিন্তু সেটা শুধু একটি LAN-এর ভেতরেই কাজ করে। রাউটারRouterনেটওয়ার্ক লেয়ারের ডিভাইস, যা ডেস্টিনেশন IP অ্যাড্রেস দেখে বিভিন্ন নেটওয়ার্কের মধ্যে প্যাকেট ফরওয়ার্ড করে। ভিন্ন কাজ করে — এটি ডেস্টিনেশন IP অ্যাড্রেস দেখে বিভিন্ন নেটওয়ার্কের মধ্যে প্যাকেট ফরওয়ার্ড করে। এক কথায় —

সুইচিং (M3)
ডেস্টিনেশন MAC অ্যাড্রেস দেখে, একই LAN-এর ভেতরে, ফ্লাট ফরওয়ার্ডিং টেবিল দিয়ে।
রাউটিং (M4)
ডেস্টিনেশন 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 নিয়ম কাজ করে —

Longest Prefix Match নিয়ম

একাধিক রাউটিং টেবিল এন্ট্রি একটি ডেস্টিনেশনের সাথে মিললে, রাউটার সবসময় সবচেয়ে দীর্ঘ প্রিফিক্সওয়ালা (অর্থাৎ সবচেয়ে নির্দিষ্ট) এন্ট্রিটি ব্যবহার করে। উপরের উদাহরণে /24 এন্ট্রি জিতবে — কারণ ৮ বা ১৬ বিটের চেয়ে ২৪ বিট মেলানো অনেক বেশি নির্দিষ্ট তথ্য দেয়। এই নিয়মটি এতটাই মৌলিক যে প্রতিটি IP রাউটার হার্ডওয়্যার/সফটওয়্যারে এটি প্রয়োগ করে।

৪ · ডিফল্ট রুট — সব-কিছুর জন্য একটি Catch-All

0.0.0.0/0 — এই বিশেষ এন্ট্রিটি প্রিফিক্স লেন্থ শূন্য, তাই এটি যেকোনো ডেস্টিনেশন IP-এর সাথে মেলে। একে ডিফল্ট রুট বলা হয় — "আমার কাছে এর চেয়ে বেশি নির্দিষ্ট কোনো রুট না থাকলে, এখানে পাঠাও" — সাধারণত এটি একটি ISP গেটওয়ের দিকে নির্দেশ করে। যেহেতু এর প্রিফিক্স লেন্থ সবচেয়ে ছোট (শূন্য), LPM নিয়ম অনুযায়ী এটি সবসময় সবার শেষে বিবেচিত হয় — অন্য কোনো নির্দিষ্ট এন্ট্রি থাকলে সেটাই আগে জেতে।

Python
# 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 সঠিকভাবে কাজ করছে।")

    
প্যাকেট আসে (dest IP) টেবিলের সব এন্ট্রির সাথে প্রিফিক্স মিলাও একাধিক মিললে — সবচেয়ে দীর্ঘ prefix_length বেছে নাও (LPM) সেই এন্ট্রির next hop-এ ফরওয়ার্ড করো
রাউটার প্রতিটি এন্ট্রির প্রিফিক্স মিলিয়ে দেখে, তারপর সবচেয়ে দীর্ঘ (সবচেয়ে নির্দিষ্ট) মিলটি বেছে নেয়।
লক্ষ্য করুন কোডের আউটপুটে — 10.20.30.5-এর জন্য /8, /16, ও /24 তিনটি এন্ট্রিই মিলেছে, কিন্তু বিজয়ী শুধু /24 এন্ট্রিটি (R3), কারণ সেটাই সবচেয়ে দীর্ঘ প্রিফিক্স। এটাই LPM নিয়মের বাস্তব প্রমাণ — কোনো hand-derived উত্তর নয়, উপরের কোড সত্যিই এটি হিসাব করে দেখিয়েছে।
মূল কথা · Key takeaway

রাউটিং টেবিল লুকআপ কোনো "প্রথম যেটা মেলে সেটাই" নিয়ম নয় — এটি সবসময় সবচেয়ে নির্দিষ্ট মিল খোঁজে। ডিফল্ট রুট (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) বিভিন্ন প্রতিষ্ঠানের নেটওয়ার্কের মধ্যে রুট বিনিময় করে। এই তিনটি প্রোটোকলই মূলত এই একই রাউটিং টেবিল স্বয়ংক্রিয়ভাবে সঠিক রাখার কাজ করে।

অনুশীলন

  1. চিন্তা করুন: উপরের রাউটিং টেবিলে যদি একটি নতুন এন্ট্রি 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) থেকে যাবে।

  2. পরীক্ষা করুন: উপরের কোড সেলে 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-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
IPv6 পরিচিতি