HTB(8) Linux HTB(8)

tc-htb - سطل توکن سلسله‌مراتبی (Hierarchy Token Bucket) در کنترل ترافیک

HTB - سطل توکن سلسله‌مراتبی

tc qdisc ... dev dev ( parent classid | root) [ handle major: ] htb [ default minor-id ] [ r2q divisor ] [ offload ]

tc class ... dev dev parent major:[minor] [ classid major:minor ] htb rate rate [ ceil rate ] burst bytes [ cburst bytes ] [ prio priority ] [ quantum bytes ]

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

الگوریتم HTB شکل‌دهی ترافیک (traffic shaping) را بر اساس الگوریتم فیلتر سطل توکن (Token Bucket Filter یا TBF) انجام می‌دهد؛ این الگوریتم به ویژگی‌های رابط وابسته نیست و بنابراین نیازی به دانستن پهنای باند زیرساختی رابط خروجی ندارد.

شکل‌دهی ترافیک همان‌گونه که در tc-tbf(8) مستند شده است عمل می‌کند.

درون یک نمونه از HTB می‌تواند کلاس‌های متعددی وجود داشته باشد. هر یک از این کلاس‌ها شامل یک qdisc دیگر است که به صورت پیش‌فرض tc-pfifo(8) می‌باشد.

هنگام قرار دادن بسته در صف (enqueueing)، انضباط HTB از ریشه (root) شروع کرده و از روش‌های مختلفی برای تعیین کلاسی که باید داده را دریافت کند استفاده می‌نماید.

در نبود گزینه‌های پیکربندی نامتداول، این فرآیند نسبتاً ساده است. در هر گره ما به دنبال یک دستورالعمل می‌گردیم و سپس به کلاسی که دستورالعمل ما را به آن ارجاع می‌دهد می‌رویم. اگر کلاسِ یافته‌شده یک گره برگ بدون فرزند (barren leaf-node) باشد، بسته را در همان‌جا در صف قرار می‌دهیم. اگر هنوز یک گره برگ نباشد، کل این مراحل را از نو و با شروع از آن گره تکرار می‌کنیم.

اقدامات زیر در هر گره‌ای که بررسی می‌کنیم به ترتیب انجام می‌شوند، تا زمانی که یکی از آن‌ها ما را به گره دیگری هدایت کند یا فرآیند خاتمه یابد:

(i)
فیلترهای متصل به کلاس بررسی می‌شوند. اگر بسته به یک گره برگ هدایت شود، کار تمام است؛ در غیر این صورت فرآیند مجدداً آغاز می‌گردد.
(ii)
اگر هیچ‌یک از موارد بالا منجر به دریافت دستورالعملی نشد، بسته در همین گره در صف قرار داده می‌شود.

این الگوریتم تضمین می‌کند که یک بسته همواره در جایی جای‌گذاری شود، حتی زمانی که در حال ساخت و ویرایش پیکربندی خود هستید.

FIXME

ریشه درخت کلاس‌های یک qdisc از نوع HTB دارای پارامترهای زیر است:

این پارامتر اجباری مکان نمونه HTB را مشخص می‌کند که یا در root یک رابط شبکه و یا درون یک کلاس موجود قرار می‌گیرد.
مشابه تمامی qdiscهای دیگر، به HTB نیز می‌توان یک دستگیره (handle) اختصاص داد. این مقدار باید تنها شامل یک عدد اصلی (major) و به دنبال آن یک دو نقطه (:) باشد. این گزینه اختیاری است، اما اگر قرار است کلاس‌هایی درون این qdisc ایجاد شوند بسیار مفید خواهد بود.
ترافیک دسته‌بندی‌نشده به کلاسی با این شناسه فرعی (minor-id) ارسال می‌شود.
مقسوم‌علیهی که برای محاسبه مقادیر quantum برای کلاس‌ها استفاده می‌شود. کلاس‌ها مقدار rate را بر این عدد تقسیم می‌کنند. مقدار پیش‌فرض 10 است.
برون‌سپاری الگوریتم HTB به سخت‌افزار (نیازمند پشتیبانی درایور و دستگاه).

کلاس‌ها دارای مجموعه‌ای از پارامترها برای پیکربندی نحوه عملکرد خود هستند.

جایگاه این کلاس درون سلسله‌مراتب. در صورتی که مستقیماً به یک qdisc متصل شده باشد و نه به کلاسی دیگر، بخش فرعی (minor) می‌تواند حذف شود. اجباری است.
مشابه qdiscها، کلاس‌ها نیز می‌توانند نام‌گذاری شوند. عدد اصلی (major) باید برابر با عدد اصلی qdisc متعلق به آن باشد. اختیاری است، اما اگر این کلاس قرار باشد دارای فرزندانی باشد، ضروری خواهد بود.
در فرآیند نوبت‌گردشی (round-robin)، ابتدا کلاس‌هایی با کمترین فیلد اولویت (priority) برای ارسال بسته‌ها آزموده می‌شوند.
حداکثر نرخی که برای این کلاس و تمام فرزندان آن تضمین می‌شود. اجباری است.
حداکثر نرخی که یک کلاس می‌تواند در صورت داشتن پهنای باند مازاد توسط والد خود، با آن نرخ ارسال انجام دهد. مقدار پیش‌فرض برابر با نرخ پیکربندی‌شده (rate) است که به معنای عدم قرض‌گیری پهنای باند می‌باشد.
میزان بایت‌هایی که می‌توان با سرعت ceil و مازاد بر مقدار rate پیکربندی‌شده به صورت توده‌ای (burst) ارسال کرد. این مقدار باید دست‌کم به اندازه بالاترین مقدار burst در میان تمام فرزندان باشد.
میزان بایت‌هایی که می‌توان با سرعت «نامحدود» یا به عبارتی دیگر با بیشترین سرعتی که رابط شبکه قادر به مخابره آن است، به صورت توده‌ای ارسال کرد. برای توزیع کاملاً یکنواخت، این مقدار باید حداکثر برابر با اندازه یک بسته متوسط باشد. همچنین باید دست‌کم به اندازه بالاترین مقدار cburst در میان تمام فرزندان باشد.
تعداد بایت‌هایی که باید از این کلاس سرویس‌دهی شود پیش از آنکه زمان‌بند به سراغ کلاس بعدی برود. مقدار پیش‌فرض برابر با مقدار rate تقسیم بر پارامتر r2q مربوط به qdisc است. در صورت تعیین مستقیم این پارامتر، مقدار r2q نادیده گرفته می‌شود.

به دلیل محدودیت‌های زمان‌بندی در یونیکس، حداکثر نرخ ceil نامحدود نبوده و در عمل ممکن است نسبتاً کم باشد. در معماری اینتل (Intel)، ۱۰۰ رویداد تایمر در ثانیه وجود دارد؛ حداکثر نرخ برابر با نرخی است که در آن بایت‌های 'burst' در هر تیک تایمر ارسال می‌شوند. بر این اساس، می‌توان حداقل اندازه burst را برای یک نرخ مشخص محاسبه کرد. برای نمونه در i386، نرخ 10mbit نیازمند ۱۲ کیلوبایت burst است، چرا که 10mbit برابر با 100*12kb*8 می‌باشد.

tc(8)

وب‌سایت HTB: http://luxik.cdi.cz/~devik/qos/htb

Martin Devera <devik@cdi.cz>. نگهداری این صفحه راهنما توسط bert hubert <ahu@ds9a.nl> انجام شده است.

10 January 2002 iproute2