dadv: (chuck)
Choose your future ([personal profile] dadv) wrote2014-06-14 01:39 pm

Переупорядочивание пакетов: PPtP и GRE

В продолжение темы.

Умение протоколов компрессии/шифрования трафика автоматически восстанавливаться после потерь или переупорядочивания пакетов в сети это, конечно, хорошо. Но если с потерями почти ничего сделать нельзя (разве что передавать данные с избыточностью/перепосылками на транспортном уровне :-), то с небольшим переупорядочиванием можно и побороться.

Представим себе, что недалеко от точки приёма такого трафика возникают неподконтрольные нам перестановки пакетов - то есть, все пакеты доставляются без потерь, но очень часто соседние пакеты приходят переставленными местами (с таким я столкнулся на практике при использовании арендованной виртуалки в LeaseWeb). В таких условиях MPPE вынужден непрерывно выполнять re-keying и скорость на туннеле, проброшенном через такую сеть, падает ниже плинтуса. И даже если использовать PPP-туннель без шифрования/компрессии, мы получаем огромный процент потерь внутри туннеля, потому что GRE вынужден дропать "опоздавшие" фреймы PPP, так как не имеет права доставлять их с нарушением порядка (дропать - имеет право).

Но если обучить GRE восстанавливать порядок пакетов, то PPP/MPPE даже и не узнают, что были проблемы с доставкой (пока не начнутся настоящие потери). Для ноды ng_pptpgre(4), которую использует mpd при создании PPtP-туннелей, сделал патч. Update 07.09.2016: обновление патча для 11.0

Патч даёт возможность управлять глубиной очереди ожидания переупорядоченных пакетов через sysctl net.graph.pptpgre.reorder_max (ноль отключает восстановление порядка) и таймаутом ожидания "опоздавших" пакетов (в милисекундах) через net.graph.pptpgre.reorder_timeout. Тесты показали хороший результат при reorder_max=16 и таймаутом в 1ms, когда точка переупорядочивания близко к нам и в 50ms, если далеко. Изменять значения этих параметров можно "на лету", без переустановки туннелей. В итоге CCP даже не дергается, если низлежащий GRE успешно восстанавливает порядок.

Патч предварительный в том смысле, что параметры глобальные для всех PPtP-туннелей в системе. Можно улучшить его, сделав эти настройки локальными для каждого туннеля, но, к сожалению, этого нельзя сделать без того, чтобы не сломать ABI ноды ng_pptpgre, после чего старые сборки mpd перестанут вообще работать с патченной нодой. С текущим патчем пересобирать ничего не нужно, кроме ng_pptpgre.ko (или ядра, если нода статически слинкована с ним).

[identity profile] http://users.livejournal.com/_slw/ 2014-06-14 06:43 am (UTC)(link)
а взять да порулить настройками через ngctl config?

[identity profile] dadv.livejournal.com 2014-06-14 06:46 am (UTC)(link)
Если делать настройки per-tunnel, то всё равно mpd патчить, добавлять команды set pptp reorder_max/reorder_timeout.
Edited 2014-06-14 06:53 (UTC)

[identity profile] http://users.livejournal.com/_slw/ 2014-06-14 07:21 am (UTC)(link)
из if_link_up или как там его давать

[identity profile] dadv.livejournal.com 2014-06-14 07:05 am (UTC)(link)
Есть ещё другой путь - вместо того, чтобы патчить каждую ноду в отдельности (pptpgre, l2tp etc.) можно было бы создать новую ноду с хуками "pptpgre", "l2tp" и "upper", в которую перенести алгоритм реордеринга, и научить mpd5 при наличии команд set pptp/l2tp reorder* вставлять новую ноду в граф. А сами ноды pptpgre/l2tp вообще не трогать. Но это больше работы :-)
Edited 2014-06-14 07:06 (UTC)