NETEM(8) Linux NETEM(8)

tc-netem - شبیه‌ساز شبکه

tc qdisc ... dev DEVICE ] add netem OPTIONS

OPTIONS := [ LIMIT ] [ DELAY ] [ LOSS ] [ CORRUPT ] [ DUPLICATION ] [ REORDERING ] [ RATE ] [ SLOT ] [ SEED ]

LIMIT := limit packets

DELAY := delay TIME [ JITTER [ CORRELATION ]]]
[ distribution { uniform | normal | pareto | paretonormal } ]

LOSS := loss { random PERCENT [ CORRELATION ] |
state p13 [ p31 [ p32 [ p23 [ p14]]]] |
gemodel p [ r [ 1-h [ 1-k ]]] } [ ecn ]

CORRUPT := corrupt PERCENT [ CORRELATION ]]

DUPLICATION := duplicate PERCENT [ CORRELATION ]]

REORDERING := reorder PERCENT [ CORRELATION ] [ gap DISTANCE ]

RATE := rate RATE [ PACKETOVERHEAD [ CELLSIZE [ CELLOVERHEAD ]]]]

SLOT := slot { MIN_DELAY [ MAX_DELAY ] |
distribution { uniform | normal | pareto | paretonormal | FILE } DELAY JITTER }
[ packets PACKETS ] [ bytes BYTES ]

SEED := seed VALUE

انضباط صف (qdisc) netem قابلیت شبیه‌سازی شبکه (Network Emulation) را برای آزمودن پروتکل‌ها از طریق شبیه‌سازی ویژگی‌های شبکه‌های واقعی فراهم می‌کند.

این انضباط صف یک یا چند اختلال شبکه‌ای را روی بسته‌ها اعمال می‌کند؛ از جمله: تأخیر (delay)، اتلاف یا از دست رفتن بسته (loss)، تکثیر بسته (duplication) و خرابی بسته (corruption).

حداکثر تعداد بسته‌هایی را که qdisc می‌تواند هنگام اعمال تأخیر در خود نگه دارد، محدود می‌کند.
TIME [ JITTER [ CORRELATION ]]]
بسته‌ها را پیش از ارسال به تأخیر می‌اندازد. پارامترهای اختیاری امکان معرفی تغییرات تأخیر (jitter) و همبستگی (correlation) را فراهم می‌کنند. مقادیر تأخیر و جیتر بر حسب میلی‌ثانیه بیان می‌شوند؛ همبستگی با تعیین درصدی مشخص می‌شود که نشان می‌دهد تأخیر قبلی تا چه میزان بر مقدار تصادفی فعلی تأثیر خواهد گذاشت.
الگویی را برای توزیع تأخیر مشخص می‌کند.
استفاده از توزیع یکنواخت با وزن برابر برای تأخیر بسته‌ها.
استفاده از توزیع گاوسی برای تأخیرها. گاهی منحنی زنگوله‌ای (Bell Curve) نامیده می‌شود.
استفاده از توزیع پارتو برای تأخیر بسته‌ها. این توزیع برای شبیه‌سازی توزیع‌های با دنباله بلند (long-tail) مفید است.
این گزینه ترکیبی از توزیع‌های pareto و normal است که ویژگی‌های هر دو منحنی زنگوله‌ای و دنباله بلند را در بر دارد.
بسته‌ها را بر اساس یک مدل اتلاف دور می‌اندازد. MODEL می‌تواند یکی از موارد زیر باشد:
اتلاف هر بسته مستقل از سایر بسته‌ها است.
از یک زنجیره مارکوف ۴-حالته برای توصیف اتلاف بسته استفاده می‌کند.
پارامتر P13 بیانگر اتلاف بسته است. پارامترهای اختیاری مدل را به ۲-حالته P31، ۳-حالته P23، P32 و ۴-حالته P14 گسترش می‌دهند.

حالت‌های زنجیره مارکوف عبارتند از:

1
دریافت مناسب بسته (بدون اتلاف).
2
دریافت مناسب در یک رگبار (burst).
3
اتلاف‌های رگباری (burst losses).
4
اتلاف‌های مستقل.
استفاده از مدل گیلبرت-الیوت (اتلاف رگباری) بر پایه:
احتمال شروع حالت بد (همراه با اتلاف).
احتمال خروج از حالت بد.
1-H
احتمال اتلاف در حالت بد.
1-K
احتمال اتلاف در حالت خوب.
استفاده از اعلان صریح ازدحام (ECN یا Explicit Congestion Notification) برای علامت‌گذاری بسته‌ها به جای دور انداختن آن‌ها. برای فعال شدن این قابلیت، باید از یک مدل اتلاف استفاده شده باشد.
محتوای بسته را در یک موقعیت تصادفی بر اساس PERCENT دچار تغییر و خرابی می‌کند.
پیش از قرار دادن در صف، یک نسخه تکراری از بسته ایجاد می‌کند.
ترتیب بسته‌ها را در صف تغییر می‌دهد.
برخی بسته‌ها را بلافاصله ارسال می‌کند. تعداد (DISTANCE - 1) بسته اول با تأخیر فرستاده شده و بسته بعدی بلافاصله ارسال می‌گردد.
بسته‌ها را بر اساس اندازه آن‌ها به تأخیر می‌اندازد تا یک سرعت لینک ثابت را شبیه‌سازی کند. پارامترهای اختیاری:
سربار به ازای هر بسته را بر حسب بایت مشخص می‌کند. برای شبیه‌سازی هدرهای اضافی لایه پیوند به کار می‌رود. یک مقدار منفی می‌تواند برای شبیه‌سازی حالتی به کار رود که هدر اترنت برداشته شده است (مثلاً -14) یا از فشرده‌سازی هدر استفاده می‌شود.
طرح‌های لایه پیوند مانند ATM را شبیه‌سازی می‌کند.
سربار به ازای هر سلول را مشخص می‌کند.

محدودسازی نرخ تحت تأثیر عوامل متعددی از جمله دانه‌بندی و دقت ساعت هسته قرار دارد. این امر خود را به شکل فشرده‌سازی ساختگی بسته (رگبارها یا bursts) نشان می‌دهد.

امکان شبیه‌سازی شبکه‌های شکاف‌دار (slotted) را فراهم می‌کند. تحویل بسته‌های انباشته‌شده را به درون یک شکاف زمانی موکول می‌کند. هر شکاف زمانی در دسترس، با یک حداقل تأخیر برای دستیابی و یک حداکثر تأخیر اختیاری پیکربندی می‌شود.
slot distribution
امکان پیکربندی بر اساس توزیع را، مشابه با گزینه distribution برای تأخیر بسته‌ها، فراهم می‌سازد.

این گزینه‌های slot می‌توانند تقریب اولیه‌ای از پروتکل‌های MAC با ترافیک رگباری نظیر DOCSIS، وای‌فای (WiFi) و LTE فراهم کنند.

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

امکان ترکیب ساختار شکاف‌دار (slotting) با نرخ (rate) وجود دارد، که در این صورت رفتارهای پیچیده‌ای رخ می‌دهد که طی آن یا نرخ و یا محدودیت‌های بایت یا بسته در هر شکاف زمانی، بر نرخ واقعی تحویل حاکم می‌شوند.

یک مقدار بذر (seed) را برای هدایت و بازتولید رویدادهای تصادفی تولیدشده اتلاف یا خرابی مشخص می‌کند.

ابزار Netem توسط دانه‌بندی تایمر در هسته محدود می‌شود. نرخ و تأخیر ممکن است تحت تأثیر وقفه‌های ساعت قرار گیرند.

ترکیب شکل‌های گوناگون تغییر ترتیب ممکن است به نتایج غیرمنتظره منجر شود. برای کارکرد هر روش تغییر ترتیب، وجود مقداری تأخیر ضروری است. اگر تأخیر کمتر از زمان رسیدن بین‌بسته‌ای (inter-packet arrival time) باشد، هیچ تغییر ترتیبی مشاهده نخواهد شد. به دلیل سازوکارهایی نظیر TSQ (صف‌های کوچک TCP)، برای واقع‌گرایانه بودن نتایج آزمایش کارایی TCP، باید netem را در بخش ورودی (ingress) میزبان گیرنده قرار داد.

ترکیب netem با سایر qdiscها امکان‌پذیر است، اما ممکن است همیشه کار نکند زیرا netem از بلوک کنترل skb برای تنظیم تأخیرها استفاده می‌کند.

# tc qdisc add dev eth0 root netem delay 100ms
افزودن مقدار ثابتی تأخیر به تمام بسته‌های خروجی روی دستگاه eth0. به هر بسته 100ms ± 10ms تأخیر اضافه خواهد شد.
# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
این دستور باعث اعمال تأخیر اضافه 100ms ± 10ms می‌شود و مقدار تأخیر بسته بعدی به میزان ۲۵٪ وابسته به جدیدترین تأخیر خواهد بود. این یک همبستگی آماری واقعی نیست، بلکه یک تقریب است.
# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
این دستور بسته‌ها را بر اساس توزیع نرمال (منحنی زنگوله‌ای) در بازه 100ms ± 20ms به تأخیر می‌اندازد.
# tc qdisc change dev eth0 root netem loss 0.1%
این دستور باعث می‌شود یک‌دهم درصد (یعنی ۱ از هر ۱۰۰۰ بسته) به طور تصادفی دور انداخته شوند.

همچنین می‌توان یک همبستگی اختیاری اضافه کرد. این کار باعث می‌شود مولد اعداد تصادفی کمتر تصادفی عمل کند و می‌توان از آن برای شبیه‌سازی اتلاف‌های رگباری بسته‌ها استفاده کرد.

# tc qdisc change dev eth0 root netem duplicate 1%
این دستور باعث می‌شود یک درصد از بسته‌های ارسال‌شده روی eth0 تکثیر شوند (کپی شوند).
# tc qdisc change dev eth0 root netem loss 0.3% 25%
این دستور باعث می‌شود ۰.۳٪ از بسته‌ها از دست بروند، و احتمال هر یک وابسته به ۲۵٪ از احتمال قبلی خواهد بود.

دو روش مختلف برای مشخص کردن تغییر ترتیب (reordering) وجود دارد. روش gap از یک توالی ثابت استفاده کرده و ترتیب هر N‌امین بسته را تغییر می‌دهد.

# tc qdisc change dev eth0 root netem gap 5 delay 10ms
این دستور باعث می‌شود هر پنجمین (دهمین، پانزدهمین و ...) بسته بلافاصله ارسال شود و هر بسته دیگر به مدت 10ms با تأخیر فرستاده شود. این روش قابل پیش‌بینی است و برای آزمایش‌های پروتکل پایه نظیر سرهم‌بندی مجدد (reassembly) مفید است.

روش reorder از درصدی از بسته‌ها برای به هم ریختن ترتیب استفاده می‌کند.

# tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%

در این مثال، ۲۵٪ از بسته‌ها (با همبستگی ۵۰٪) بلافاصله ارسال می‌شوند، بقیه به مدت 10ms به تأخیر می‌افتند.

اگر جیتر به اندازه کافی بزرگ باشد نیز ترتیب بسته‌ها تغییر خواهد کرد.

# tc qdisc change dev eth0 root netem delay 100ms 75ms
اگر بسته اول تأخیر تصادفی 100ms دریافت کند (100ms پایه - 0ms جیتر) و بسته دوم 1ms بعد ارسال شده و تأخیر 50ms دریافت کند (100ms پایه - 50ms جیتر)؛ بسته دوم زودتر ارسال خواهد شد. این امر به این دلیل است که انضباط صف tfifo درون netem، بسته‌ها را به ترتیب زمان ارسال در صف نگاه می‌دارد.

اگر خواهان این رفتار نیستید، انضباط صف داخلی tfifo را با یک انضباط صف ساده FIFO جایگزین کنید.

# tc qdisc add dev eth0 root handle 1: netem delay 10ms 100ms
# tc qdisc add dev eth0 parent 1:1 pfifo limit 1000

نمونه‌ای از استفاده از کنترل نرخ و اندازه سلول‌ها:

# tc qdisc add dev eth0 root netem rate 5kbit 20 100 5
تمام بسته‌های خروجی روی دستگاه eth0 را با نرخ 5kbit، سربار به ازای هر بسته ۲۰ بایت، اندازه سلول ۱۰۰ بایت و سربار به ازای هر سلول ۵ بایت به تأخیر می‌اندازد.

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

# tc qdisc add dev eth0 root handle 1: prio
# tc qdisc add dev eth0 parent 1:3 handle 30:    tbf rate 20kbit buffer 1600 limit  3000
# tc qdisc add dev eth0 parent 30:1 handle 31:    netem delay 200ms 10ms distribution normal
# tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32    match ip dst 65.172.181.4/32 flowid 1:3
این مثال از یک انضباط صف‌بندی اولویت‌دار استفاده می‌کند؛ یک TBF برای انجام کنترل نرخ اضافه شده است؛ به همراه یک تأخیر ساده netem. یک فیلتر تمام بسته‌های ارسالی به 65.172.181.4 را در اولویت ۳ دسته‌بندی می‌کند.

1.
Hemminger S. , "Network Emulation with NetEm", Open Source Development Lab, April 2005 http://devresources.linux-foundation.org/shemminger/netem/LCA2005_paper.pdf
2.
Salsano S., Ludovici F., Ordine A., "Definition of a general and intuitive loss model for packet networks and its implementation in the Netem module in the Linux kernel", available at http://netgroup.uniroma2.it/NetemCLG

tc(8)

ابزار Netem توسط Stephen Hemminger در Linux foundation نوشته شده و از NISTnet الهام گرفته شده است.

صفحه راهنمای اصلی توسط Fabio Ludovici <fabio.ludovici at yahoo dot it> و Hagen Paul Pfeifer <hagen@jauu.net> نوشته شده است.

25 November 2011 iproute2