سفر به اعماق پروتکل های مسیریابی: 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 نداريد، اينترنت نداريد و حتی نقشه ی کاغذی هم نداريد! و تنها راه نجات برای فرار از این مخمصه ای که در آن گرفتار شده اید خودتان می باشید، در طي تلاشتان برای پيدا کردن يک راه فرار از اين مخمصه، به يک دو راهی می رسید که سر يکی از اين راه ها تابلویی است که به سمت یکی از جاده ها اشاره می کند و روی آن نوشته ای است با اين مضمون که ” تا فلان شهر 5 کيلومتر باقی است”. شما اصلا نمی دانید که آیا جهت اين تابلو درست هست يا نه و اين که اگر 5 کيلومتر از اين مسير بروید آیا اصلا به همچين شهری ميرسيد يا نه، اما از طرف دیگر عقلتان مدام به شما گوش زد می کند که اين تنها نقطه ی اميد شماست و چاره ای نداريد جز اين که به آن اعتماد کنيد، در نتيجه همان مسير را انتخاب می کنيد.

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

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

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

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

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

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

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

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

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

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

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

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.