Титла: TC -въпрос Публикувано от: bonbon в Jan 17, 2006, 09:47 Здарвейте.
От няколко дена се мъча със следният проблем. Имам следната ситуация: internet-->eth0-->ruter-->eth1-->lan Ограничавам download и upload трафика с htb, като предварително маркирам съответните пакети. Проблема ми е следният: Имам клас, който е закачен за eth0 и има лимит 16KBps -тоест tc class add dev eth0 parent 2:10 classid 2:11 htb rate 8KBps ceil 16KBps prio 0 burst 2k. IP-тата попаднали в този клас могат да upload-ват с около 16к. Когато пусна уплоад през Azureus, upload-a наистина е около 16к, но download-a пада на 1-2 к. Огранича ли upload-a на Azureus на 10к, download си тръгва с нормалният размер. Как мога да направя така, upload-а да не влияе на download-a. Благодаря предварително. Титла: TC -въпрос Публикувано от: any в Jan 17, 2006, 13:12 Не можеш.
При download се използва и една част от upstream канала (т.е. освен, че получаваш пакети - също и изпращаш такива). При положение, че напълниш upstream канала - няма как да не страда download-а ти. Титла: TC -въпрос Публикувано от: Hapkoc в Jan 17, 2006, 13:23 Не мога да дам конкретна идея за tc/htb, но принципно ако можеш да сложиш по-висок приоритет на tcp ack пакетите (които всъщност се изпращат при download от теб) би трябвало да се реши проблема.
Ако искаш разгледай това: http://www.benzedrine.cx/ackpri.html Там е обяснено по-подробно, но както споменах ще трябва да видиш дали може да се реализира с tc/htb. Поздрави Титла: TC -въпрос Публикувано от: bonbon в Jan 17, 2006, 13:39 Благодаря на всички.
![]() Титла: TC -въпрос Публикувано от: в Jan 17, 2006, 13:44 В подкрепа на предложението на Наркос - можеш да си направиш два подкласа на класа за upload - единия за ACK пакетите, а другия за останалите
![]() Титла: TC -въпрос Публикувано от: Dean79 в Jan 18, 2006, 01:46 Можеш да контролираш трафика в двете посоки независимо един от друг. За целта в ХТБ-то опиши и изходящия интерфейс, аз го правя, но с ЦБКю
Огледай примерите в htb.init Дано съм бил полезен Титла: TC -въпрос Публикувано от: bonbon в Jan 18, 2006, 07:15 Работата е там, че пакета вече е маркиран - примерно с 0x01.
Не е проблем да разделя класа на два под-класа, но как да направя филтрите. Титла: TC -въпрос Публикувано от: alex_c в Jan 18, 2006, 11:38 Ето ти едно решение за маркиране на ACK пакетите:
/sbin/iptables -t mangle -A POSTROUTING -o eth0 -p tcp -m length --length :64 -j MARK --set-mark 11 /sbin/iptables -t mangle -A POSTROUTING -o eth0 -p tcp -m length --length :64 -j ACCEPT Това трябва да ти е накъде в началото на скрипта за маркирането, за да може да улови всички TCP пакети с дължина до 64 байта (тук ще попаднат и ACK пакетие). Дали ще избереш POSTROUTING или PREROUTING веригата си зависи от теб, както и съответната марка. При мен работи нормално, така че при правилно конфигуриране не би трябвало да има проблем. Best wishes! Alex Титла: TC -въпрос Публикувано от: в Jan 18, 2006, 11:51 Титла: TC -въпрос Публикувано от: bonbon в Jan 18, 2006, 12:27 Явно не съм обеснил правилно.
Всеки пакет се маркира според това дали е BG или INT, дали е входяш или изходяш, и отделно според това с каква скорост ще се ограничава. Доколкото разбрах трябва upload-пакетите да се разделят на две и да се маркират според ACK. Не може ли да се направи по по-елегантен нечин? Благодаря на всички още веднъж Титла: TC -въпрос Публикувано от: Hapkoc в Jan 18, 2006, 13:07 Не трябва ли да е нещо от рода на:
# iptables -t mangle -p tcp -m tcp --tcp-flags SYN,ACK ACK -j MARK --set-mark <MARK> Пак да кажа, че не съм особено навътре с iptables, така че не приемайте на доверие горното. Титла: TC -въпрос Публикувано от: в Jan 18, 2006, 17:40 Че какво не му е елгентаното на това?
Това, дали е межд./БГ не би трябвало да те интересува - просто имаш един клас (за всеки интерфейс), който е шейпнат с достатъчно скорост и с най-висок приоритет. Този клас ще приема да кажем пакетите маркирани с 200. А в iptables си правиш правилата за ACK и SYN пакетите да се маркират с 200, когато дължината на пакета е до 64 ... Титла: TC -въпрос Публикувано от: bonbon в Jan 18, 2006, 18:07 Благодаря VladSun
Титла: TC -въпрос Публикувано от: alex_c в Jan 19, 2006, 23:25 Наркос, за съжаление не става, тъй като има пакети, в които освен вдигнат ACK флаг има и payload и по този начин вместо да изпишеш вежди ще избодеш очи.
Best wishes! Alex Титла: TC -въпрос Публикувано от: bonbon в Jan 20, 2006, 05:56 С маркирането на ACK пакетите downloada се оправи, но страниците се отварят много бавно - с около 1к.
Явно трябва и още нещо да се пусни с по-голям приоритет, но незнам какво. Ще съм много благодарех, ако някой помогне. Титла: TC -въпрос Публикувано от: alex_c в Jan 20, 2006, 09:12 bonbon, май нещо си противоречиш. За да се зареждат страниците бавно или не си оправил download-a, или пък не си оправил приоритизирането на изходящите ACK и SYN пакети. Според мен е по-скоро второто, т.к. при зареждането на една страница с много елементи в нея, се генерират ACK и SYN пакети за всеки елемент (разбирай картинка или каквото и да е друго от страницата). В зависимост от начина на рендиране на браузъра е и изобразяването на страницата - при някои трябва да се изтеглят всички елементи и чак тогава страницата се изобразява. Това може да създаде усещането за ниска скорост на сваляне, макар реалната причина да е съвсем друга.
Best wishes! Alex Титла: TC -въпрос Публикувано от: bonbon в Jan 20, 2006, 10:02 Създавам клас:
tc class add dev eth0 parent 2:0 classid 2:200 htb rate 500KBps prio 0 и филтър към него: tc filter add dev eth0 parent 2:0 protocol ip handle 200 fw classid 2:200 2:0 ми е root класа закачен на eth0 tc class add dev eth0 parent 1:0 classid 1:200 htb rate 500KBps prio 0 tc filter add dev eth0 parent 1:0 protocol ip handle 200 fw classid 1:200 1:0 ми е root класа закачен на eth1 Всички останали класове са ми с prio 5. Маркирам : iptables -t mangle -A POSTROUTING -o eth1 -p tcp -m length --length :64 -j MARK --set-mark 200 iptables -t mangle -A POSTROUTING -o eth0 -p tcp -m length --length :64 -j MARK --set-mark 200 iptables -t mangle -A POSTROUTING -o eth1 -p tcp -m length --length :64 -j ACCEPT iptables -t mangle -A POSTROUTING -o eth0 -p tcp -m length --length :64 -j ACEEPT Пускам azureus и той upload-ва с около 16К - на толкова е шейпнат. След това пускам kget да тегли нещо. След около 7-8 сек. kget тръгва с нормалната си скорост. Явно някъде бъркам, но незнам къде. Благодаря предварително. Титла: TC -въпрос Публикувано от: alex_c в Jan 20, 2006, 22:27 Щом 1:0 ти е класа за eth1, защо го закачаш на eth0:
tc class add dev eth0 parent 1:0 classid 1:200 htb rate 500KBps prio 0 tc filter add dev eth0 parent 1:0 protocol ip handle 200 fw classid 1:200 или е копи/пейст грешка. Освен това, защо маркираш и входящите и изходящите малки пакети с една марка? Може би не е грешно, но какво ти пречи да го промениш? Титла: TC -въпрос Публикувано от: bonbon в Jan 21, 2006, 08:00 Грешката наистина е при copy/paste.
Естествено,че 1:0 ми е класа за eth1. |