بررسی اجمالی Equal-Cost Multipath (ECMP)

منظور از Equal-Cost Multipath یا به اختصار ECMP آن است که اگر به ازای یک مقصد یکسان چندین مسیر با cost یکسان وجود داشته باشد، تمام این مسیرها کشف شده و بین آن ها برای ارسال ترافیک load sharing صورت گیرد. پس در این روش، هر forwarder (روتر) به ازای هر مقصد معینی چندین next-hop داشته و از روش هایی به منظور مشخص کردن آن که از کدام next-hop برای ارسال یک پکت مشخص باید استفاده شود، استفاده می نماید.

ساده ترین روش برای انجام این عمل آن است که مثلا پکت اول از لینک اول، پکت دوم از لینک دوم و الی آخر ارسال شوند. اصطلاحا به این روش per-packet load balancing گفته می شود که در آن از شیوه ی round-robin به منظور ارسال پکت ها بر روی مسیرهای فعال و دارای cost یکسان موجود برای یک مقصد معین استفاده می شود. اما این روش مشکلات متعددی را در پی خواهد داشت که از جمله ی آن ها می توان به موارد زیر اشاره نمود:

  1. مسیرهایی با MTU های مختلف: از آن جایی که هر پکت از مسیر جداگانه ای ارسال می شود و هر مسیر نیز ممکن است MTU متفاوتی نسبت به سایر مسیرها داشته باشد، بنابراین تعیین MTU کل مسیر کار دشواری است.
  2. تفاوت در latency ها: از آن جایی که هر مسیر افزونه ای ممکن است latency متفاوتی نسبت به سایر مسیرهای افزونه داشته باشد، ارسال پکت ها از مسیرهای مختلف می تواند سبب شود که بسته ها خارج از ترتیب به مقصد مورد نظر برسند، تاخیر تحویل پکت ها و هم چنین نیاز به buffering افزایش یابد.
    دریافت پکت ها در مقصد خارج از ترتیب، سبب می شود که TCP تصور کند که پکت های قبل از پکت دریافت شده از دست رفته اند. اگر سه یا بیش از سه پکت با این اوضاع دریافت شوند، TCP به وضعیتی می رود که اصطلاحا fast-retransmit نامیده می شود. در چنین وضعیتی چون تلاش بیهوده ای برای ارسال مجدد پکت یا پکت های تاخیر خورده صورت می گیرد، bandwidth زیادی مصرف می شود که خود میتواند سبب packet loss بیشتر و کاهش throughput گردد و به این ترتیب بر عملکرد شبکه تاثیر منفی گذاشته شود.
  3. دیباگ: در این حالت چون هر پکت از طریق یک مسیر ارسال می شود، ابزارهای دیباگی چون ping و traceroute نتایج غیرقابل اعتماد یا حتی اشتباهی ممکن است به دست دهند.

مشکل دیگر در رابطه با پروتکل های multicast می باشد. این پروتکل ها به منظور جلوگیری از تکرار پکت ها و loop، یک درخت بین تمام دریافت کنندگانی که جز یک آدرس گروه یکسان هستند، ایجاد می کنند. در پروتکل های مالتی کستی که امروزه به طور گسترده استفاده می شوند، درخت کوتاه ترین مسیر یا از طریق یک host که اصطلاحا source خطاب می شود (مثلا یک سرور) منشعب می گردد و یا از طریق روتری که به عنوان Core یا اصطلاحا Rendezvous Point (RP) شناخته می شود. بنابراین مشکلی که در اینجا ایجاد می شود آن است که در درخت ساخته شده، برای جلوگیری از ایجاد duplicate، تنها باید یک next-hop برای حرکت به سمت root یا ریشه ی درخت ایجاد شده وجود داشته باشد.

مشکلات ذکر شده در بالا در حالتی ایجاد می شوند که پکت های متعلق به یک جریان Unicast یا Multicast یکسان از مسیرهای مختلفی ارسال شوند. راه حل طبیعی برای حل این مشکل آن است که پکت هایی که به یک جریان (flow) یکسان تعلق دارند، همیشه از مسیر یکسانی ارسال شوند.

در واقع عملی که ECMP انجام می دهد آن است که به جای per-packet load balancing بر روی مسیرهای موجود به یک مقصد معین، از روشی برای تشخیص پکت هایی که به یک جریان یکسان تعلق دارند استفاده می کند و این روش استفاده از یک تابع hash می باشد.

علت آن که گفته می شود عمل ECMP در واقع load sharing است و نه load balancing به همین دلیل است. چرا که در load balance توزیع یکسان ترافیک بر روی مسیرهای موجود به سمت یک مقصد یکسان را خواهیم داشت در صورتی که در load sharing توزیع پکت ها بر روی مسیرهای فعال موجود بر اساس یک تابع hash را خواهیم داشت و این توزیع بر روی مسیرها ممکن است کاملا غیرهمسان باشد به این صورت که از طریق یک مسیر، بار ترافیک بیشتری نسبت به سایر مسیرهای موجود ارسال گردد.

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

  • آدرس مقصد
  • 3Tuple: سه گانه‌ی آدرس IP مبدا، آدرس IP مقصد و protocol-id
  • 5Tuple: پنج گانه‌ی آدرس های IP مبدا و مقصد، protocol-id و شماره پورت های مبدا و مقصد

مشکل دیگری که ECMP ممکن است با آن مواجه گردد آن است که به یک next-hop چند لینک وجود داشته باشد (اصطلاحا Redundant Parallel Links). در چنین حالتی راه حل پیشنهادی تجمیع لینک هاست.

ECMP نخستین بار در RFC 2991 معرفی گردید و برای آشنایی با توابع و الگوریتم های hash مورد استفاده توسط آن می توانید RFC 2992 را مطالعه نمایید.

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

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

6 دیدگاه برای “بررسی اجمالی Equal-Cost Multipath (ECMP)”

  1. خیلی عالی بود
    بخصوص که بالاخره به داستان Load sharing vs load balancing و کاربرد ها و تفاوت هر کدوم خاتمه دادید. مطلبی که حتی در اسناد رسمی میکروتیک هم رعایت نمی شه. البته باید بگم تو اسناد سیسکو هم همچین خیلی دقیق و تکنیکی مطرح نشده. اما خیلی خیلی خوبه که این متن بالاخره تونست حتی خود منو قانع کنه چه تفاوت های زیر ساختی ای در پیاده سازی ها نهفته هست تا یکی بشه لود بالانس و اون یکی بشه لود شیرینگ.

    1. سلام ممنون از توجه و لطف شما
      همه ی وندورها خوبن و قابل احترام 🙂 شاید علت توصیف این دو موضوع و تاکید بر اون ها در این مقاله این بود که خود من همیشه این دو اصطلاح رو به اشتباه به کار می بردم و آقای مهندس مقدس به شدت روی این دو واژه و تفاوتشون تاکید میکردن و نهایتا انقد ایشون روی این دو واژه و کاربرد صحیحشون اصرار کردن که من مجبور شدم برم دنبالش و بلاخره تفاوتشون رو کشف کنم :))
      و این که ما تمام تلاشمون رو می کنیم که بگیم در پشت پیاده سازی هایی که در دیوایس ها شده چی می گذره و واقعا خوشحالم که این زاویه دید به مسایل هم مورد توجه مخاطبینمون قرار گرفته 🙂

  2. ممنون؛
    خیلی عالی بود :)). از این دست مطالب که معمولا توی کتابای عمومی شبکه (ccna/ccnp) ذکر نمیشن؛ بازم قرار بدید .
    خیلی ممنونم

  3. سلام و خسته نباشید!
    واقعا متن خوبی بود!
    برای من به عنوان یک تازه وارد به این فیلد چند سوال پیش اومده! امکان داره در مورد چند نکته که اشاره کردین بیشتر بحث کنین!
    یکی این که فرمودین در per-packet load balancing امکان داره جواب ping با trace اشتباه باشه! در مسیر مثل اینترنت تمام مسیر از تایع Hash استفاده میشه یا حتما یه جاهایی هم از per-packet load balancing استفاده شده! یعنی trace یه سرور اینترنتی میتونه جوابی اشتباه بده!
    دوم اینکه در حالتی که شما در روتر مرزی دو اینترنت فعال داشته باشین آیا استفاده از تابع Hash باعث استفاده غیر بهینه از پهنای باند خریداری شده میشه ؟یه مسیر حجم بشتری از دیتا رو عبور بده و دیگری بدون استفاده بمونه؟ یعنی خرید چندین ارتباط اینترنتی عملا در مجموع باعث افزایش کلی پهنای باند خروجی نمیشه؟ اصلا وقتی دو یا چند مسیر خروچی وجود داره (default gateway) انتخاب بین per-packet load balancing و تابع hash امکان پذیر است؟
    خیلی خیلی ممنونم برای وقت و زمانی که میزارین!

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

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

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