سفر به اعماق پروتکل های مسیریابی: Distance Vector ها (۱)

سلام به تمام مهندسین شبکه ی فارسی زبان در سراسر دنیا، من این افتخار رو پیدا کردم که در وبلاگی بنویسم که همیشه با شوق مطالبش رو میخوندم و همیشه صحبت کردن با صاحب این وبلاگ جز بزرگترین آرزوهام بوده.
به پاس اعتماد آقای مهندس مقدس نسبت به من و این که این فرصت رو در اختیار من گذاشتند که در وبلاگشون بنویسم، از ایشون صمیمانه سپاسگزارم و امیدوارم بتونم در جهت کمک به امر آموزش به زبان فارسی و شرح مسایلی که شاید خیلی کم مطلبی به زبان فارسی راجع به اون ها پیدا بشه بتونم قدم مثبتی بردارم.

تقریبا کل دیروز و داشتم در رابطه با این فکر می کردم که نقطه ی شروع مباحثم چی می تونه باشه، نهایتا یاد چند ماه پیش افتادم که تصمیم گرفتم پروتکل های مسیریابی رو خیلی جزیی بررسی کنم. تو شروع این راه فهمیدم اگر میخوام رفتار یک پروتکل مسیریابی رو خوب درک کنم باید هرچی که تا اون لحظه یاد گرفتم رو بذارم کنار و دوباره شروع کنم به یادگیری. من باید تمام پیش فرض ها رو فراموش میکردم و از صفر شروع میکردم. فهمیدم تو این راه مدام ذهنم باید بپرسه چرا؟ چطور؟ و این که پشت هر مساله ی سختی یک مفهوم خیلی ساده بوده که فراموش شده، پس باید از اول با همون مفاهیم ساده که خیلی بهشون اهمیت نمی دادم کارم رو شروع کنم.

تصمیم بر این هست که اون چه دارم تو این مسیر از اول فرا میگیرم با شما به اشتراک بذارم. اما قبل از رفتن سراغ یک پروتکل مسیریابی مشخص و بررسی نحوه ی عملکرد حقیقی یک پروتکل، شروع داستان سفرم رو قصد دارم با همون مفاهیم ساده ولی خیلی مهم که به فراموشی سپرده میشن شروع کنم یعنی: بررسی عملکرد دو دسته ی کلی Distance Vector ها و Link State ها! همیشه داشتن اطلاعات در رابطه با منشا یک موضوع، دید بازتری به آدم در تحلیل اون موضوع خواهد داد (البته به نظر من 🙂 )
برای همین قسمت اول “سفر به اعماق پروتکل های مسیریابی” رو به بررسی رفتار کلی Distance Vector ها اختصاص دادم.

***
پروتکل های مسیریابی Distance Vector

به زبان خیلی ساده: پروتکل های مسیریابی Distance Vector از الگوریتم مسیریابی استفاده میکنند که بر طبق آن پیام های آپدیت به صورت دوره ای به تمام همسایه ها به صورت Broadcast ارسال شده و شامل تمام Route Table می شود.
عملکرد اصلی پروتکل های Distance vector از همین یک پاراگراف استنتاج می شود:

  • اول، آپدیت های دوره ای یا Periodic Update ها: Distance Vector ها در پایان یک بازه زمانی مشخص، باید پیام های آپدیت را ارسال کنند.
  • دوم، همسایه ها: همسایه از دید روتری که بر روی آن یک پروتکل مسیریابی Distance Vector پیاده سازی شده، یعنی هر روتر دیگری که با آن یک لینک ارتباطی مشترک داشته باشد یا از طریق همسایگی های سطوح بالاتر (مثلا UDP) با روترهای مجاور خود ارتباط برقرار کرده باشد. هر همسایه آپدیتی را که دریافت می کند به تمام همسایه های خود ارسال می کند (آپدیت به صورت hop-by-hop)
  • سوم، پیام های آپدیت Broadcast: به نظر شما هنگامی که روتر برای اولین بار در شبکه ای فعال می شود چطور می تواند سایر روترها را پیدا کند؟ یا چطور می تواند خود را به سایر روترها معرفی کند؟ ساده ترین جواب برای این سوالات ارسال Broadcast پیام ها توسط روتر می باشد.به این ترتیب هر روتر دیگری که پروتکل مسیریابی یکسانی بر روی آن پیاده سازی شده باشد، این آپدیت را دریافت کرده و عمل مناسب را در ارتباط با آن انجام می دهد.
  • چهارم، آپدیتی شامل کل Route Table: پروتکل های Distance Vector زیاد اهل به زحمت انداختن خود نیستند و هرآن چه را که می دانند در اختیار بقیه قرار میدهند. سیاست آن ها این گونه است که یک آپدیت شامل کل Route table خود را به صورت Broadcast ارسال می کنند!

البته در این مواردی که گفته شد چند استثنا نیز وجود دارد (مثلا EIGRP، که ذاتا Distance Vector است ولی از تمام این قوانین پیروی نمی کند، در قسمت های بعد این مجموعه در رابطه با این موضوع بحث خواهد شد.)

اما نکته ی دیگری که از همان پاراگراف نخست می توان برداشت کرد آن است که، روتر هر آن چه همسایه هایش به آن تبلیغ کنند فرا می گیرد، به این عمل اصطلاحا مسیریابی بر اساس شایعه گویند یعنی همسایه ی روتر به آن چیزی می گوید، بعد آن روتر آن چیز را به همسایه هایش میگوید، آن همسایه نیز به همسایه هایش میگوید و این عمل به همین روال ادامه پیدا می کند.

اما همسایه ها به هم چی میگویند؟ برای جواب به این سوال باید به سراغ این که Distance Vector ها از چه الگوریتم مسیریابی استفاده میکنند، رفت.
الگوریتم مورد استفاده ی اکثر پروتکل های Distance Vector، الگوریتم Bellman-Ford (یا Ford- Fulkerson) می باشد، وظیفه ی این الگوریتم پیدا کردن کوتاهترین مسیر از یک نود تا سایر نودهاست، در واقع با ساخت گرافی که در آن یال ها دارای وزن (یا همون Cost) هستند، هر نود فاصله ی خود تا سایر نودها را حساب می کند. پس به این ترتیب هر روتر فاصله ی خود تا سایر مقاصد را حساب کرده، نتیجه ی حاصل را به جدول روت خود اضافه می کند و طی یک آپدیت جدول روتش را برای همسایه هایش ارسال می کند، همسایه های آن نیز بر اساس آپدیتی که دریافت کردند، فاصله ی خود تا سایر مقاصد را حساب می کنند و به همسایه های خود اطلاع می دهند و این عمل همینطور ادامه پیدا می کند(hop-by-hop Updates) پس به این ترتیب هر نود فقط مسیر به مقاصد مختلف را گزارش می دهد و نوع گزارش مسیرها نیز به صورت برداری از direction/distance می باشد، به این معنی که  مثلا روتر آپدیتی دریافت می کند که در آن آپدیت به آن گفته می شود به عنوان مثال مقصد A پنج گام دورتر است(distance) و از سمت (direction) روتر X باید برای رسیدن به آن اقدام شود.

تا به این جا همه چیز مرتب و خوب پیش می رود، روتر مسیرها به مقاصد مختلف را از همسایه های خود فرا گرفته و اکنون می داند که برای رسیدن به هر مقصد باید از چه مسیری اقدام کنم، اما چه اتفاقی می افتد اگر همین اوضاع خوب کمی خراب شود:

تصور کنید شما با گروهی از دوستانتان تصمیم می گیرید به گردشی در کوهستانی که تاکنون به آن جا نرفته اید، بروید. در طول این گردش تا زمانی که با دوستان خود و راهنمای گروهتان همراه هستید همه چیز عالی پیش میرود اما ناگهان شما در مسیری گام میگذارید که همراهان خود را گم می کنید. در این هنگام دیگر هیچ چیزی عالی به نظر نمی رسد! فرض کنید به همراه خود GPS ندارید، اینترنت ندارید و حتی نقشه ی کاغذی هم ندارید! و تنها راه نجات برای فرار از این مخمصه ای که در آن گرفتار شده اید خودتان می باشید، در طی تلاشتان برای پیدا کردن یک راه فرار از این مخمصه، به یک دو راهی می رسید که سر یکی از این راه ها تابلویی است که به سمت یکی از جاده ها اشاره می کند و روی آن نوشته ای است با این مضمون که ” تا فلان شهر ۵ کیلومتر باقی است”. شما اصلا نمی دانید که آیا جهت این تابلو درست هست یا نه و این که اگر ۵ کیلومتر از این مسیر بروید آیا اصلا به همچین شهری میرسید یا نه، اما از طرف دیگر عقلتان مدام به شما گوش زد می کند که این تنها نقطه ی امید شماست و چاره ای ندارید جز این که به آن اعتماد کنید، در نتیجه همان مسیر را انتخاب می کنید.

پروتکل های Distance Vector دقیقا همانند همان تابلو بر سر دو راهی عمل می کنند. به این معنی که روتر، روتی را دریافت کرده که فقط از میزان فاصله اش تا مقصد آن روت و این که از کدام طرف می تواند به آن دسترسی داشته باشد اطلاع دارد، اما این که آیا این اطلاعات درست می باشند یا نه، تضمینی وجود ندارد، به همین دلیل در معرض خطا در مسیریابی قرار دارند.

بر حسب آن چه تا به اینجا گفته شد، یکسری سوالات مطرح می شود که ارزش فکر کردن دارند:

  • اول این که آیا واقعا ارسال کل Route Table به همسایه ها ضروری است؟
  • ارسال Broadcast آپدیت ها بر روی یک ساختار Broadcast به صورت همزمان، توسط همه ی روترهایی که روی آن ساختار قرار دارند آیا منجر به بروز collision نخواهد شد؟
  • چه اتفاقی می افتد اگر تغییری در توپولوژی ساختار شبکه ای مبتنی بر پروتکل های Distance Vector رخ دهد؟ آیا روترها باید منتظر بمانند تا تایم آپدیت بعدی فرا رسد؟
  • اگر روتری که مقصدی از طریق آن در دسترس بوده بنا به هر دلیلی fail شود، چه اتفاقی برای روت هایی که از طریق این روتر fail شده در دسترس بودند، در جدول روت سایر روترها می افتد؟ آیا راهی هست که سایر روترها متوجه شوند این مقاصد، دیگر در دسترس نیستند؟
  • اگر روترها در فراگیری مسیرها فقط به همسایه های خود گوش دهند، اگر مقصدی fail شود و آپدیت مربوط به fail شدن مسیر رسیدن به آن مقصد از روتری که به آن مقصد متصل می باشد، دریافت شود ولی همزمان همسایه ی دیگری ادعا کند که به آن مقصد دسترسی دارد، چه اتفاقی می افتد؟! روتی مدام بین روترها دست به دست می شود که در واقع اصلا وجود خارجی ندارد! آیا این loop ایجاد شده در ساختار تا بی نهایت ادامه پیدا می کند؟

این ها همه مشکلاتی است که پروتکل های Distance Vector با آن ها مواجه خواهند شد، اما آیا Distance Vector ها راهی برای حل این مشکلات خواهند داشت؟

در قسمت دوم این سفر همراه ما باشید 🙂

نویسنده: مینا رضائی

محقق و همیشه در حال یادگیری، عاشق نقاشی، گاهی هم نویسندگی یا تألیف کتابای بزرگ :) (مسئولیت و صحت و سقم کلیه ی مطالب منتشر شده از جانب من تنها بر عهده ی خودم می باشد)

2 دیدگاه برای “سفر به اعماق پروتکل های مسیریابی: Distance Vector ها (۱)”

  1. واقعا عالیه واقعا عالیه بسیار لذت بردم و مقاله شماباعث شد مباحثی رو که به صورت طوطی وار حفظ کرده بودیم رو باعمقی بیشتر یادبگیریم و درک بالاتری تحلیلشون کنیم و زیباترین بخش هم اینجاست که همه این ها به زبان پارسی، واقعا از زحماتی که کشیدید و این مقاله رو نوشتید تشکر میکنم .

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

This site uses Akismet to reduce spam. Learn how your comment data is processed.