Plugin:Jabber/ru/Передача файлов

From Miranda NG
Jump to navigation Jump to search

Теория

В Jabber существует 4 «способа» передачи файлов.

In-Band Bytestreams (IBB)

Файл передается в основном XML-потоке, как простые сообщения, но со специальным флагом, чтобы клиент принимающей стороны понимал, что это часть файла, а не передаваемый текст (XEP'ы 0047 + 0095/0096). Принцип работы — такой же, как и у плагина FileAsMessage.

Преимущества
  • Самый простой и надежный вариант, работающий в 99% случаев (с условием, что оба клиента поддерживают этот вариант передачи).
Недостатки
  • Так как в этом случае бинарные данные передаются как текст, данные жмутся в base64, из-за чего трафик увеличится в среднем на 33%.
  • Самый медленный.
  • При передаче файлов возникают проблемы c обменом сообщениями с контактом, с которым происходит файлообмен.

Через прокси

Файл передаётся через прокси Jabber-сервера. Это — не обычный socks-прокси, а специально заточенный для передачи файлов джаббер-сервис! Этот способ подойдёт, если нет возможности прямого соединения с контактом (передающий находится за непрозрачным NAT, прокси) и у передающего правильно указан адрес данного сервиса (который может быть как на сервере передающего, так и на других серверах). Работает следующим образом: передающий подсоединяется к этому серверу (через изменённый протокол SOCKS5), запрашивает сервер на инициализацию передачи файла. Сервер выделяет IP или ID сессии, после чего передающий отправляет этот адрес принимающему. Принимающий подсоединяется к серверу и передает ID. Если ID совпадают, инициализируется передача файла (XEP'ы 0065 + 0095/0096).

Преимущества
  • Помогает, если отправляющая сторона сидит за непрозрачным NAT или прокси.
  • Скорость передачи данных выше, чем у IBB.
  • Отсутствуют недостатки, присущие IBB.
Недостатки
  • Не все серверы поддерживают эту возможность (хотя иногда встречаются серверы с таким сервисом, открытым для незарегистрированных на этом сервере пользователей).
  • Скорость в большинстве случае ниже, чем у DC.

Direct Connect (DC)

Устанавливается прямое соединение передающего с принимающим (XEP'ы 0065 + 0095/0096).

Преимущества
  • Самый быстрый и надёжный способ передачи файлов.
Недостатки
  • Не работает, если передающий подключен к интернету через непрозрачный NAT или прокси.

Out of Band Data (OOB)

Упрощённо это можно представить так: клиент передающей стороны открывает у себя HTTP-сервер и даёт HTTP-ссылку другому клиенту, тот подключается и скачивает файл (XEP 66). Преимущества и недостатки аналогичны Direct Connect'у.


Практика

Рис. 1

Теперь рассмотрим возможности использования и настройки для каждого из способов.

Приём файлов

Чтобы принимать файлы способом, отличным от IBB, необходимо снять галку «Разрешать передачу файлов только внутри потока» (Accept only in band incoming filetransfers) в настройках вашей учётной записи Jabber (рис. 1).

Передача файлов

Рис. 2

In-Band Bytestreams (IBB)

Работает всегда и везде. Единственное условие — клиент принимающего должен поддерживать данный способ передачи файла, ибо многие клиенты его режут. Для использования этого способа нужно снять все 3 галки в настройках джаббера (рис. 2).

Рис. 3

Через прокси

Узнать, имеет ли ваш сервер прокси для передачи файлов, и, если имеет, то узнать его адрес, можно следующим образом: зайти в Просмотр служб (Service Discovery) учётной записи Jabber и найти сервис с identity «SOCKS5 Bytestreams» или «Proxy bytestreams» (обычно это proxy.servername.domain, например, для сервера jabber.ru это proxy.jabber.ru). Ставим соответствующую галку в настройках и указываем адрес нашего прокси (рис. 3).

Рис. 4
Рис. 5

Direct Connect (DC)

Для успешной установки прямого соединения необходимо одно из следующих условий:

  • Прямое соединение вашего компьютера с интернетом (прямой канал от провайдера с реальным («белым») IP-адресом)
  • Если у вас прямой канал от провайдера с реальным («белым») IP-адресом, но установлен роутер, то роутер должен быть:
    • а) или с поддержкой и активированным UPnP, а в настройках сети Миранды для протокола Jabber должна стоять галка «Включить перенаправление портов UPnP» (Enable UPnP port mapping)
    • б) или сконфигурирован для приёма на определённый диапазон адресов, совпадающий с настройками сети Миранды для протокола Jabber (рис. 4).

Если вы подключены к интернету через прозрачный NAT, то нужно в настройках Jabber прописать ваш реальный («белый») IP-адрес (рис. 5).

Если выставлены галки на передаче файлов и через DC, и через proxy, то передача файла пойдет через прокси.

Out of Band Data (OOB)

Необходимы те же условия, что и для DC. Миранда сама будет пробовать данный способ, никакой дополнительной настройки не требуется. Но так как приоритет OOB низок, используется он довольно редко.


Информация для продвинутых пользователей

Выбор способа передачи файлов

Как происходит выбор способа передачи файлов:

  • Получаем капсы от клиента.
  • Если умеет SI/FT (XEP 95/96), то отправляем список транспортов, через которые мы можем отправить файл. По умолчанию в списке всегда присутствует 47 XEP, если стоят галки директ-коннекта (BsDirect) или прокси (BsProxyManual), то еще дополнительно добавляем в список 65 XEP.
  • Клиент принимает этот список, решает какой транспорт для передачи файла выбрать. Если стоит галка IBB only, то выбирает 47 XEP, если галка не стоит, то выбирает 65 XEP.
  • После выбора получателем 47 XEP'а отправитель высылает файл, при выборе 65 XEP'а отправитель высылает список из одного IP-адреса (только direct-connect) или двух IP-адресов (direct-connect и proxy)
  • Получатель к этим IP коннектится (проверяет, куда удалось) и отправляет выбранный IP отправителю, отправитель передаёт файл.
  • Если же клиент не умеет SI/FT, то проверяем умеет ли OOB (XEP 66), если умеет OOB, то отправляем ссылку и через HTTP у нас забирают файл.
  • Если же не умеет ни SI/FT, ни OOB, то выдается ошибка передачи файла.

Приоритеты

(При условии, что в Миранде настроены все 3 пункта в поле «File Transfers», наверху — самый приоритетный):

  • IBB (если у принимающего стоит галка IBB only)
  • Proxy
  • DC
  • OOB
  • IBB (только если в настройках Jabber не выставлено ни одной из трех галок в секции «File Transfers»)

Proxy имеет приоритет перед DC в целях приватности.

Прочее

Proxy и DC описаны одним 65-м XEP'ом. Протоколы там очень похожие, разница только в том, что в первом случае идет коннект до прокси, а во втором — до отправителя.

SI/FT (XEP'ы 95/96) в теории могут быть реализованы друг без друга, но по сути они идут вместе и существует проверка на их наличие в коде.

Миранда умеет принимать файлы по IBB с использованием и message, и iq, но посылает только через message.

Проблемы при передаче файлов через IBB обусловлены тем, что все данные отправляются в цикле в общем потоке, но на сервере есть лимит на количество kB/s от клиента. И, так как нет возможности проверить, принялись ли уже данные от клиента, банально забивается очередь. Все сообщения приходят и уходят, но из-за очереди и лимитов это происходит уже после появления окошка о таймауте.