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

ডিসট্যান্স ভেক্টর রাউটিং — RIP

Distance vector routing — RIP
৯ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • ডিসট্যান্স ভেক্টর রাউটিং-এর মূল ধারণা ও Bellman-Ford-এর সাথে সম্পর্ক
  • RIP প্রোটোকলের নির্দিষ্ট বৈশিষ্ট্য — হপ কাউন্ট মেট্রিক, ১৫ হপ সীমা
  • Count-to-infinity সমস্যা — কেন এটি ডিসট্যান্স ভেক্টরের একটি বাস্তব দুর্বলতা
  • Python দিয়ে distance-vector আপডেট নিয়ম বাস্তবায়ন ও একটি নেটওয়ার্কে চালিয়ে দেখা

১ · ডিসট্যান্স ভেক্টর রাউটিং কীভাবে কাজ করে

L17-এ আমরা দেখেছি রাউটিং টেবিল কীভাবে ব্যবহৃত হয় — কিন্তু টেবিলটা আসে কোথা থেকে? ডিসট্যান্স ভেক্টর রাউটিংDistance Vector Routingএকটি রাউটিং কৌশল যেখানে প্রতিটি রাউটার শুধু প্রতিটি গন্তব্যের দূরত্ব ও পরবর্তী হপ জানে, এবং প্রতিবেশীদের সাথে পর্যায়ক্রমে পুরো টেবিল শেয়ার করে। একটি সহজ কিন্তু কার্যকর ধারণা — প্রতিটি রাউটার শুধু জানে "প্রতিটি গন্তব্যে পৌঁছাতে কত দূর, আর কোন প্রতিবেশীর দিকে পাঠাতে হবে।" এটি নিজের পুরো টেবিল নিয়মিতভাবে তার সরাসরি-সংযুক্ত প্রতিবেশীদের কাছে পাঠায় — আর প্রতিটি রাউটার নিজের টেবিল আপডেট করে যদি কোনো প্রতিবেশী কোনো গন্তব্যে কম খরচের একটি পথের কথা জানায়।

মূল নিয়ম — Bellman-Ford রিলাক্সেশন

প্রতিটি গন্তব্য d-এর জন্য: যদি (আমার প্রতিবেশী n-এর দূরত্ব d-এ) + (আমার থেকে n-এ যাওয়ার লিংক খরচ) < (আমি বর্তমানে যা জানি d-এ পৌঁছাতে) — তাহলে আমি এই নতুন, কম খরচের পথটি গ্রহণ করি, আর n-কে আমার next hop হিসেবে চিহ্নিত করি। এটিই বিখ্যাত Bellman-Ford শর্টেস্ট-পাথ অ্যালগরিদমের একটি বিতরণকৃত (distributed) সংস্করণ — প্রতিটি রাউটার নিজে থেকেই এই নিয়ম বারবার প্রয়োগ করে, কোনো কেন্দ্রীয় সমন্বয়কারী ছাড়াই।

২ · RIP (Routing Information Protocol)

RIP হলো ক্লাসিক ডিসট্যান্স-ভেক্টর প্রোটোকল — এর মেট্রিক হলো শুধু হপ কাউন্ট (কতগুলো রাউটার পেরোতে হবে), লিংক গতি বা লেটেন্সি বিবেচনা করে না। RIP-এর সর্বোচ্চ মেট্রিক ১৫ — ১৬-কে "অসীম" বা অপৌঁছানযোগ্য হিসেবে গণ্য করা হয়। এই ইচ্ছাকৃতভাবে ছোট সীমাটি নিচের সমস্যাটির প্রভাব সীমিত রাখার জন্যই বসানো হয়েছে —

Count-to-Infinity সমস্যা

যখন কোনো লিংক ব্যর্থ হয়, ডিসট্যান্স-ভেক্টর রাউটারগুলো সাময়িকভাবে একে অপরকে ক্রমবর্ধমান (এবং ভুল) হপ-কাউন্ট জানাতে পারে — একজন রাউটার ভাবে অন্যজন এখনও পথটি জানে, তাই নিজের (এখন অকেজো) দূরত্বের উপর ১ যোগ করে আবার প্রচার করে, আর এটি বারবার চলতে থাকে যতক্ষণ না সংখ্যাটা "অসীম" (RIP-এ ১৬) ছুঁয়ে ফেলে ও সবাই বুঝতে পারে গন্তব্যটি অপৌঁছানযোগ্য। এই ধীর, ভুল-তথ্য-ছড়ানো কনভার্জেন্সই RIP-এর প্রধান দুর্বলতা — এবং লিংক-স্টেট রাউটিং (L19, OSPF) এই সমস্যা এড়াতেই ডিজাইন করা হয়েছে।

Python
# ডিসট্যান্স ভেক্টর আপডেট — এক রাউন্ড এক্সচেঞ্জের সত্যিকারের সিমুলেশন

INF = float("inf")

# নেটওয়ার্ক টপোলজি: প্রতিটি রাউটারের সরাসরি-সংযুক্ত প্রতিবেশী ও লিংক খরচ
topology = {
    "X": {"Y": 1, "Z": 5},
    "Y": {"X": 1, "Z": 1},
    "Z": {"X": 5, "Y": 1, "W": 1},
    "W": {"Z": 1},
}
all_routers = list(topology.keys())

def initial_table(router):
    """শুরুতে প্রতিটি রাউটার শুধু নিজের সরাসরি প্রতিবেশীদের দূরত্ব জানে, বাকিটা INF।"""
    table = {r: INF for r in all_routers}
    table[router] = 0
    for neighbor, cost in topology[router].items():
        table[neighbor] = cost
    return table

tables = {r: initial_table(r) for r in all_routers}

def update_distance_vector(router, tables, topology):
    """Bellman-Ford রিলাক্সেশন — প্রতিটি প্রতিবেশীর টেবিল দেখে, উন্নত রুট থাকলে গ্রহণ করে।"""
    updated = dict(tables[router])
    changes = []
    for neighbor, link_cost in topology[router].items():
        neighbor_table = tables[neighbor]
        for dest, neighbor_dist in neighbor_table.items():
            candidate = link_cost + neighbor_dist
            if candidate < updated[dest]:
                old = updated[dest]
                updated[dest] = candidate
                changes.append((dest, old, candidate, neighbor))
    return updated, changes

def fmt(v):
    return "∞" if v == INF else str(v)

print("এক রাউন্ড এক্সচেঞ্জের পর প্রতিটি রাউটারের পরিবর্তন —\n")
for router in all_routers:
    new_table, changes = update_distance_vector(router, tables, topology)
    print(f"রাউটার {router}:")
    if not changes:
        print("   কোনো উন্নতি হয়নি এই রাউন্ডে।")
    for dest, old, new, via in changes:
        print(f"   {dest}-এর দূরত্ব {fmt(old)} -> {fmt(new)}  (via {via})")

# --- স্ব-যাচাই: X-এর Z পর্যন্ত দূরত্ব সরাসরি লিংক (5) থেকে Y হয়ে (1+1=2) কমা উচিত ---
new_X, changes_X = update_distance_vector("X", tables, topology)
assert new_X["Z"] == 2, "X থেকে Z-এ Y হয়ে যাওয়ার পথ (cost 2) সরাসরি লিংকের (cost 5) চেয়ে ভালো হওয়া উচিত ছিল!"
assert new_X["W"] == 6, "X থেকে W-এ Z হয়ে যাওয়ার পথের cost 6 হওয়া উচিত ছিল!"
print("\nস্ব-যাচাই পাস: X->Z এখন 5 থেকে 2-এ নেমেছে (সরাসরি লিংকের বদলে Y-এর মাধ্যমে)।")

    
লক্ষ্য করুন — X-এর সরাসরি Z-এর সাথে লিংক আছে (খরচ ৫), কিন্তু Y থেকে জানার পর X বুঝতে পারে Y হয়ে যাওয়া পথটাই সস্তা (১+১=২)। এটাই ডিসট্যান্স ভেক্টরের শক্তি — প্রতিটি রাউটার প্রতিবেশীদের কাছ থেকে শিখে নিজের টেবিল ধীরে ধীরে উন্নত করে, এমনকি সরাসরি সংযোগ থাকলেও।
মূল কথা · Key takeaway

ডিসট্যান্স ভেক্টর রাউটিং সহজ ও কম মেমরি ব্যবহার করে (শুধু প্রতিবেশীর তথ্য দরকার), কিন্তু ভুল তথ্য ছড়ানো ও ধীর কনভার্জেন্সের ঝুঁকি থাকে (count-to-infinity)। L19-এ আমরা দেখব কীভাবে লিংক-স্টেট রাউটিং (OSPF) সম্পূর্ণ ভিন্ন দর্শন নিয়ে — প্রতিটি রাউটার পুরো নেটওয়ার্কের মানচিত্র রেখে — এই সমস্যাগুলো এড়ায়।

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

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

প্র ০১ RIP-এর সর্বোচ্চ হপ সীমা ১৫ কেন — কেন ১০০ বা ১০০০ নয়?

একটি ছোট সীমা count-to-infinity সমস্যার সময়কাল সীমিত রাখে — যদি সর্বোচ্চ ১৫ হয়, তাহলে সবচেয়ে খারাপ ক্ষেত্রেও "অসীম" (১৬)-এ পৌঁছাতে বেশি সময় লাগে না। এটি একটি ট্রেড-অফ — RIP ছোট থেকে মাঝারি আকারের নেটওয়ার্কের জন্য ডিজাইন করা হয়েছিল, যেখানে ১৫ হপের বেশি বাস্তবসম্মত রুট খুব বিরল। বড়, জটিল নেটওয়ার্কে (যেমন পুরো ইন্টারনেট) RIP ব্যবহারই করা হয় না — সেখানে OSPF (L19) বা BGP (L20) ব্যবহৃত হয়।

প্র ০২ ডিসট্যান্স ভেক্টর রাউটিং-এ একটি রাউটার কি কখনো পুরো নেটওয়ার্কের মানচিত্র জানতে পারে?

না — এটাই ডিসট্যান্স ভেক্টরের মূল বৈশিষ্ট্য (এবং সীমাবদ্ধতা)। প্রতিটি রাউটার শুধু জানে "কোন গন্তব্যে কত দূর, কোন প্রতিবেশীর দিকে" — কোন রাউটার কার সাথে সংযুক্ত তার সম্পূর্ণ ছবি কখনোই থাকে না। এই বিপরীতে, লিংক-স্টেট রাউটিং (L19)-এ প্রতিটি রাউটার সত্যিই পুরো টপোলজির মানচিত্র রাখে — এটাই দুই পদ্ধতির মৌলিক দার্শনিক পার্থক্য।

প্র ০৩ উপরের কোডে X কেন সরাসরি Z-এর সাথে সংযুক্ত থাকা সত্ত্বেও Y-এর মাধ্যমে যাওয়ার পথ বেছে নিলো?

কারণ ডিসট্যান্স ভেক্টর রাউটিং সবসময় সর্বনিম্ন মোট খরচের পথ খোঁজে, "সরাসরি সংযোগ" থাকা মানেই "সেরা পথ" নয়। X-Z সরাসরি লিংকের খরচ ৫, কিন্তু X-Y-Z পথের মোট খরচ মাত্র ২ (১+১)। রাউটার সবসময় প্রতিটি প্রতিবেশীর কাছ থেকে পাওয়া তথ্য দিয়ে বর্তমান সেরা পথের সাথে তুলনা করে — সস্তা পথ পেলে সেটাই গ্রহণ করে, সংযোগ সরাসরি হোক বা না হোক।

অনুশীলন

  1. চিন্তা করুন: উপরের নেটওয়ার্কে W রাউটার এই প্রথম রাউন্ডে X-এর দূরত্ব কত জানবে, এবং কোন প্রতিবেশীর মাধ্যমে?

    W-এর একমাত্র প্রতিবেশী Z (লিংক খরচ ১)। Z-এর প্রাথমিক টেবিলে X-এর দূরত্ব ৫ (সরাসরি লিংক)। তাই W হিসাব করে ১ + ৫ = ৬ — W শিখবে X-এর দূরত্ব ৬, Z-এর মাধ্যমে। (পরের রাউন্ডে, Z নিজেই Y-এর মাধ্যমে X-এ পৌঁছানোর সস্তা পথ (২) শিখে ফেললে, W-ও পরে ৩-এ উন্নীত হবে — ডিসট্যান্স ভেক্টর ধীরে ধীরে, রাউন্ড-বাই-রাউন্ড কনভার্জ করে।)

  2. পরীক্ষা করুন: উপরের কোডে topology["W"]-এ একটি নতুন সরাসরি লিংক "Y": 10 যোগ করুন এবং Run চেপে দেখুন এটি W-এর প্রথম-রাউন্ড আপডেটে কোনো প্রভাব ফেলে কি না।

    হ্যাঁ, প্রভাব ফেলবে — এখন W-এর দুটি প্রতিবেশী থাকবে (Z ও Y)। নতুন পথ বিবেচনা করা হবে: Y-এর মাধ্যমে X-এ পৌঁছাতে ১০+১=১১, যেটা Z-এর মাধ্যমের ৬-এর চেয়ে খারাপ, তাই সেটা গ্রহণ হবে না। কিন্তু Y-এর মাধ্যমে অন্য কোনো গন্তব্যে (যেমন নিজেই Y) সরাসরি একটি নতুন, সস্তা এন্ট্রি যোগ হবে।

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

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