Материал из Tkabber Wiki
Здесь рассказано как уменьшить трафик, "развиваемый" Ткаббером, для пользователей очень дорого интернета.
Важно понимать, что далеко не все описанные здесь приёмы проходят без последствий: большинство действий по уменьшению трафика, не относящихся к его сжатию, означают отключение тех или иных "фич" Ткаббера, то есть — уменьшение функциональности этого клиента.
Содержание
Сжатие трафика
Это — единственный по-настоящему действенный способ уменьшить трафик.
Существует, в принципе, три варианта сжатия трафика, из них реальный интерес представляет только первый — "Stream Compression":
XEP-0138: Stream Compression
Использует один из зарегистрированных (и поддерживаемых) в XMPP методов сжатия и сжимает весь XML-поток (то есть компрессор находится между XML-потоком и TCP/IP-потоком в сетевом стеке). Ткаббер поддерживает метод сжатия zlib.
Сжатие в протоколе TLS
Формально протокол TLS (SSL) поддерживает сжатие, однако, этот вопрос на уровне спецификации протокола проработан плохо — процитируем SSL_COMP_add_compression_method(3) из OpenSSL: > The TLS standard (or SSLv3) allows the integration of compression methods into the communication. The TLS RFC does however not specify compression methods or their corresponding identifiers, so there is currently no compatible way to integrate compression with unknown peers. It is therefore currently not recommended to integrate compression into applications. Applications for non-public use may agree on certain compression methods. Using different compression methods with the same identifier will lead to connection failure. Кроме того, в пакете tcltls, который служит прослойкой между Ткаббером и OpenSSL, отсутствуют "крутилки" для управления сжатием; статус этой фичи в драйвере TLS, реализованном в ejabberd, также неизвестен. Одним словом, сжатие средствами TLS в Ткаббере невозможно.
PGP (GnuPG)
PGP сжимает данные перед их шифрованием, что, в принципе, способно уменьшить трафик. Однако, не надо быть чрезмерно оптимистичными относительно этого способа; об этом — читайте ниже.
Важно понимать, что Stream Compression не может работать вместе с TLS (SSL), то есть Вам придётся выбирать между сжатием и защитой канала. По крайней мере в ejabberd они вместе не работают, а потому и Ткаббер не даст включить их одновременно.
О том, что Вы теряете, отказываясь от SSL, можно прочитать здесь.
Стоит добавить, что в контексте XMPP практически невозможно достичь такой же степени сжатия, которую способны показать алгортимы zlib на "простых файлах", в силу того, что в Stream Compression они рассматривают отдельно каждую станцу, а не весь сплошной XML-поток. Это происходит из-за того, что требуется обеспечивать передачу "почти в реальном времени" и передавать станцы по мере их готовности к передаче; сжатие же файлов может рассматривать такое количество байт, которое ограничено лишь размерами внутренних буферов, словаря, и требованиями к вычислительным ресурсам.
Stream Compression/zlib
"Обычный" Ткаббер
Для включения сжатия в "обычном" Ткаббере Вам потребуется установить пакет ztcl и пакет tclmore, от которого тот зависит (о том, где их взять, — чуть ниже).
Установив пакет, перезапустите Ткаббер. При этом в окне логина закладка SSL будет называться теперь SSL & Сжатие. Идите туда и отметьте галочку "Сжатие".
Где взять:
(Раньше они хостились в соответствующих проектах на gna.org, но они были удалены из-за неактивности автора.)
- Неофициальные сборки:
- Пакеты для Debian sarge авторства Сергея Голованя Teo доступны в его репозитории — найдите ниже вопрос про этот репозиторий и действуйте в соответствии с инструкциями.
- eXire поддерживает пакеты для Arch Linux.
- Mellon собрал эти пакеты для Gentoo — они доступны в её багзилле: tclmore, ztcl.
- Также пакеты должны быть доступны в портах FreeBSD.
- kostix собрал оба пакета под Windows; их установке посвящён следующий раздел.
Установка ztcl и tclmore в Windows
Во-первых, вам понадобятся сами пакеты ztcl и tclmore, собранные под Win32. Они доступны здесь.
Для установки необходимо распаковать пакеты в каталог модулей тикля (обычно это C:\Tcl\lib).
Во-вторых, Вам понадобится поставить Win32-версию библиотеки zlib, которую следует взять здесь.
Установка библиотеки zlib
Из скачанного архива вам потребуется файл zlib1.dll. Его нужно положить в любой каталог, содержащийся в переменной окружения PATH. Если эта фраза Вам ни о чём не говорит, у Вас есть три варианта:
- Обучить себя локально;
- Обучить себя глобально;
- Тупо положить zlib1.dll в каталог C:\Windows\system32, если с предыдущими пунктами ничего не вышло.
Вниманию пользователей Windows XP 64-bit Edition: поскольку ztcl и tclmore собраны под x86, они требуют zlib, собранную также под x86 (именно такая и находится по ссылке, приведённой выше). Однако, имейте в виду две вещи:
- zlib1.dll из пакета zlib не должна лежать в %WINDIR%\system32 из-за того, что там ищутся только "родные" (64-битные) библиотеки. Положите её в %WINDIR%\system — она как раз предназначена для "старых", 32-битных библиотек.
- Доступная в Интернет версия zlib1.dll, собранная под x64, с ztcl не работает.
- На всякий случай: бессмысленно просить авторов собрать библиотеки под x64 — это потребует 64-битных версий всего Tcl/Tk и всех остальных бинарных пакетов.
Ткаббер-пак (Win32)
Kostix собрал Ткаббер-пак под Windows. Он поддерживает сжатие (как и все возможные расширения Ткаббера и стандартные плагины) "из коробки".
Старпаки Ткаббера
Пользователи старпака использовать внешние модули, в принципе, могут, но их прикручивание связано с серьёзными трудностями (особенно в случае с ztcl).
Вследствие некоторых проблем поддержка сжатия в старпаке — вещь нетривиальная и требующая серьёзных "приседаний" для реализации.
Посему официальные старпаки пока что сжатие не поддерживают. Про неофициальные старпаки с поддержкой сжатия нам также неизвестно.
Более подробно о внешних старкитах к "упакованным" дистрибутивам Ткаббера рассказано здесь.
PGP/GnuPG
У сжатия в PGP есть две проблемы:
- В отличие от Stream Compression, который сжимает каждую станцу перед отправкой, PGP сжимает текст каждого сообщения перед шифрованием. После этого зашифрованный текст передаётся "вместо" оригинального сообщения, будучи закодирован при помощи base64. Как известно, этот метод кодирования потока байтов с кодами 0..255 в поток символов ASCII способен увеличить размер оригинального сообщения на 30%, что может эффективно "сожрать" выгоду от сжатия, особенно на небольших сообщениях.
- Кроме того, PGP подписывает каждое отправляемое сообщение, и эта подпись также представляет собой элемент XML, содержащий около 100 символов base64.
Уменьшение XML-трафика
Следовать указаниям этого раздела стоит лишь в том случае, если у вас ничего не вышло с zlib, или вы по каким-то причинам не можете его использовать (хотя единственная серьёзная причина — это необходимость использовать SSL).
Действия, предложенные здесь, преследуют цель уменьшения количества XML-данных, пересылаемых в ходе соединения.
Замечание о бинарных данных
Протокол XMPP является в некотором роде "ASCII-протоколом" — любые бинарные данные вроде RAR-архивов и картинок передаются им в виде base64-представления оригинальных данных. Поэтому имейте в виду, что картинка размером 5 килобайт "на линии" будет весить до 6.5 килобайт.
Настройки Ткаббера
Ещё раз напомним, что в борьбе с трафиком вы легко можете побороть функциональность и удобство работы! Поэтому руководствуйтесь принципом:
семь раз отмерь, один — отрежь
и глубоко обдумывайте каждый пункт.
Пункты расположены по предполагаемой (автором) "трафикопрожорливости".
Внутриканальная передача файлов
весьма неэффективна в плане использования трафика, так как файл фактически передаётся в виде шестибитного текста (base64).
Аватары
В отличие от эмоциконок (смайликов) аватары посылаются и принимаются в виде картинок. Картинки бывают довольно большими. Поэтому, если Вы не хотите тратить свой трафик на эту чушь, убедитесь, что у Вас выключена опция меню Службы → Расширения → Аватара → Разрешение загрузки.
История комнат
При заходе в комнату Ткаббер запрашивает у сервера некоторое количество последних сообщений чтобы поместить пользователя в контекст происходящей в комнате дискуссии. Возможно настроить несколько параметров, находящихся в Customize → Chat:
::muc::options(history_maxstanzas)
задаёт максимальное количество сообщений, которые Ткаббер попросит у сервера. 0 означает, что сообщения запрошены не будут.
::muc::options(history_maxchars)
определяет максимальный объём текста сообщений в символах. 0 означает, что ничего принято не будет.
::muc::options(request_only_unseen_history)
эта опция полезна при переконнектах к серверу _— если она включена, Ткаббер вынимает только те сообщения, которые пользователь ещё не прочитал, _если окно с конференцией открыто. Одним словом, не выгребаются те сообщения, которые уже есть в окне комнаты.
Модуль Conference Info
Этот модуль, который включен по умолчанию, осуществляет периодические запросы списков участников тех конференций, закладки на которые присутствуют в вашем ростере, но в которых вы не находитесь в данный момент. Делается это для того, чтобы вы могли увидеть список участников конференции во всплывающей подсказке к закладке комнаты в ростере, не входя в комнату и не рассматривая её в дискавери. Чтобы отключить эти запросы, выключите флаг
::plugins::conferenceinfo::options(autoask)
в Customize → Conference Info. Вместо отключения запросов можно настроить их частоту в том же разделе настроек.
Уведомления о событиях чата
это отсылка информации о Вашей активности в окне приватного чата Вашему корреспонденту. Сюда входит информация вроде "пишет ответ", "увидел сообщение" и т.п. Отключить это можно, выключив флаги
::plugins::chatstate::options(enable)
в Customize → Chat → Chatstate и
::plugins::events::options(enable)
в Customize → Chat → Events.
Ответы на IQ-запросы
На некоторые IQ-запросы отвечает Jabber-клиент. Сюда относятся запросы версии клиента, времени, запрос jabber:iq:last (время неактивности пользователя) и прочие, на которые не может ответить сервер. Посему, если вы хотите сэкономить трафик на ответах, запретите все или некоторые опции в Customize → IQ, начинающиеся со строк "reply_" и "report_"; наиболее "прожорливой", по-видимому, является опция
::muc::options(report_muc_rooms)
Имейте, однако, в виду, что на запрещённые в конфигурации IQ-запросы Ткаббер всё же посылает IQ-ответы с уведомлениями о неудавшемся запросе; это может "съесть" часть выгоды от запрещения нормальных ответов.
Некоторые плагины также могут "втихую" пожирать ваш траффик, например:
georoster
Для выяснения географических координат пользоватей запрашивает vCard у каждого контакта в вашем ростере.
Autoretrieve (неофициальный плагин)
автоматически запрашивает vCard у каждого пользователя, входящего в комнату. Собственно, в этом и состоит цель его работы, но некоторые пользователи отличаются оголтелым стремлением к установке всех плагинов, до которых дотягиваются их руки... Так что глядите в оба.
Списки приватности
Если какой-то негодяй льёт вам в приват тонны сообщений, пытаясь завесить клиент или раскрутить на трафик, вы можете внести его в списки приватности (войти в меню Tkabber → Обеспечение приватности и внести в правила либо реальный джид (если флуд идёт напрямую, либо "комнатный" джид вида
room_name@conference.jabber.ru/flooder's_nick
). Не путайте списки приватности с игнором, который можно включить, щёлкнув правой кнопкой мыши на участнике конференции — игнор не блокирует трафик, он лишь скрывает сообщения от глаз. Списки же приватности обрабатываются на сервере, поэтому вы перестанете получать от этого джида всё, что отметите, устанавливая на него правило, включая его запросы и презенс. Но помните, что если флудер сменит ник в комнате, правило придётся либо переписывать, либо добавлять новое.
Настройка пользователя
(То есть настройка себя.)
- Ограничьте себя в просмотре чужих vCards — они зачастую содержат фотографии большого размера (и, к сожалению, подавляющее большинство из них содержат какую угодно ахинею, но не фотографию владельца).
- Не используйте плагины типа Autoretrieve, которые запрашивают vCard у каждого заходящего в комнату пользователя.
- Старайтесь попусту не "ходить" в дискавери на список конференций — к примеру, таковой
на jabber.ru "весит" примерно 180 килобайт; если вам интересна информация по конкретной
комнате, наберите её имя в адресной строке окна дискавери в виде
имя_комнаты@conference.jabber.ru
— перейдёте прямо к ней, минуя полный список комнат.
Сделать: по-видимому, плагин whiteboard неплохо жрёт трафик
Настройка сервера
При помощи списков приватности на сервере можно останавливать некоторые виды входящего трафика прямо на сервере.
Сделать: доработать
Средства самоконтроля
Плагин Traffic
В Ткаббере имеется плагин Traffic авторства feez'а. Установив его и запустив через Службы → Расширения → Статистика по трафику, вы сможете следить за тем, какие "примочки" Ткаббера поедают драгоценный трафик. Имейте, однако, в виду, что этот плагин меряет только объём XML-трафика, то есть он не способен учесть выгоду от применения Stream Compression, которое происходит "ниже" — перед передачей данных стеку TCP/IP.
Расскажем вкратце о том, как пользоваться этим плагином.
Итак, окно плагина открыто, и теперь нам надо выбрать соединение, которое мы хотим мониторить. Справа вверху есть выпадающий список, в котором видна надпись "0 None". Разверните список и выберите в нём нужное соединение (если их открыто больше одного). Установите интервал обновления в поле "Таймер" (5 секунд вполне достаточно) и удостоверьтесь, что кнопка справа от него стоит в значении "Выкл" (это означает, что автообновление работает, и при нажатии на кнопку отключится). Если вы не хотите пользоваться автообновлением окна (оно всё-таки потребляет ресурсы), можете обновлять его вручную с помощью кнопки "Обновить", расположенной справа от выпадающего списка.
Автоматически ли или вручную, окно рано или поздно заполнится информацией. По горизонтали идут контакты ростера (в Настройках → Плагины → Traffic можно указать, показывать ли их в виде ника или джида): ваши друзья, а также конференции и фиды RSS. Самой последней строкой идёт суммарный трафик соединения. По вертикали — типы трафика: Pres (Presence, присутствие), Iq (Info-query, информация-запросы), Msg (Messages, сообщения), All (всего). IN — входящий трафик, OUT — исходящий. Нетрудно заметить, что наибольшую проблему создаёт сервис Info-query, особенно если у каких-либо контактов в vcard вставлены аватары и фотографии — их сразу же видно по увеличению трафика в несколько раз.
Когда плагин установлен, статистика считается автоматически с момента старта Ткаббера. Её можно сохранить для последуюего анализа с помощью скриптов или других инструментов (правда, нельзя загрузить сохранённый файл), а можно и обнулить, чтобы начать считать заново (к примеру, чтобы промерить отдельно "час пик"). Напоминаем ещё раз, что меряется только XML-трафик.
Проведём интересный опыт (он будет просто потрясающ, если среди ваших контактов есть пользователи MSN Messenger'а).
- Выберите момент затишья, чтобы собеседники не забивали статистику лишними строчками в окне.
- Поставьте ручное обновление окна.
- Обнулите счётчики.
- Отлогиньтесь от MSN-гейта.
- Обновите статистику. Если некоторые из контактов были в онлайне, они появятся в списке, имея чуть меньше 250 байт трафика Pres IN. Сам транспорт, естественно, тоже вышлет свой презенс в 87 байт размером в обмен на ваш ему Pres OUT.
- Сбросьте счётчики снова.
- Снова залогиньтесь к гейту и снова обновите статистику.
- При логине трафик презенса увеличивается: у транспорта в три раза, у контактов — больше, чем в четыре!
- Но это ещё цветочки: один-единственный запрос Iq порождает трафик в 40-70 килобайт (если у контакта в vcard не вставлена фотка размером с wallpaper)!!!
- Вход или выход одного человека из конференции увеличивают её входящий презенс-трафик на 250-500 байт. На первый взгляд немного, но в час пик, когда входит и выходит много народу, набегает...
- Померяйте сами трафик, создаваемый плагинами chess, checkers, reversi, whiteboard и так далее.
Сетевые средства
Существуют всевозможные мерялки трафика, которые как раз способны вести учёт того, что оказывается непосредственно "на линии".
Для измерения TCP/IP трафика под виндами можно порекоммендовать бесплатный (для простых применений) TMeter.
Если у вас модем, то очень хорошим решением является ModemSpd с модулем декодирования Unimodem-диагностики.
К сожалению, измерения такими средствами страдают от невозможности классифицировать трафик XMPP (так, как это делает плагин Traffic, к примеру) — без ухищрений можно померять только "сколько всего" и "с какой скоростью".
Поправьте меня: Впрочем, если память мне не изменяет, файерволл Agnitum Outpost даже в бесплатной версии меряет трафик, который накручивает каждая программа в отдельности.
Невошедшее
В процессе разбирательств с добрым Йоххо-тяном в комнате Ткаббера по поводу сравнительного меряния трафика с включённым сжатием между Бомбусом и Ткаббером, kostix 02:36, 22 апреля 2008 (MSD) выяснил, что Ткаббер жмёт трафик, используя степерь сжатия, которую zlib использует по умолчанию (Mellon сообщает, что она равна 6).
Увеличить её до максимального значения можно, изменив в процедуре transport::zlib::import
,
определённой в файле jabberlib/transports.tcl, строку
zlib stream $sock RDWR -output compress -input decompress
на
zlib stream $sock RDWR -output compress -input decompress -level 9
Тестирование на получении ростера (~120 контактов + закладки на конференции + аннотации к некоторым элементам) и начального присутствия от JID'ов всех его элементов, к которым это относится:
- открытый текст, без zlib:
- принято: 65 пакетов, 37969 байтов
- отправлено: 46 пакетов, 11134 байтов
- открытый текст, zlib (уровень сжатия по умолчанию):
- принято: 53 пакетов, 8990 байтов
- отправлено: 39 пакетов, 3805 байтов
- открытый текст, zlib (уровень сжатия на клиенте — 9):
- принято: 51 пакетов, 8886 (8941) байтов
- отправлено: 38 пакетов, 3754 (3750) байтов
- TLS (SSL):
- принято: 58 пакетов, 18863 байтов
- отправлено: 45 пакетов, 5307 байтов
Комментарий: TLS — наше всё. Он сам уже жмёт всё в два раза, и надо быть завидным
скупердяем очень бедным человеком, чтобы пожертвовать защищённым соединением
ради сжатия ещё в два раза.
Следует также понимать, что изменение коэффициента сжатия на клиенте никак не влияет на коэффициент сжатия на сервере, который скорее всего установлен в значение по умолчанию (как минимум, в ejabberd нет опций конфигурации для управления коэффициентом сжатия потока). В итоге, "хакнув" указанный кусок кода в Ткаббере, можно добиться только практически незаметного уменьшения трафика, идущего "вверх" — от клиента на сервер; при этом трафик "вниз" (от сервера — клиенту) обычно значительно выше (если только мы не занимаемся активной посылкой файлов при помощи внутриканальных протоколов передачи).