Управляющий связи

Введение

Управляющий соединения - это первый элемент группового чата. Этот класс управляет соединениями с одноклассниками и предлагает пользователю мультиплексованные сокеты к устройствам, которые они хотят соединить. Например, если Алиса хочет быть подключена к одному из устройств Боба для передачи 2 файлов, она попросит Управляющего соединения открыть 2 каналы (один за файл) для Боба.

    aliceAccount->connectionManager().connectDevice(bobDeviceId, "file://file1",
        [](std::shared_ptr<ChannelSocket> socket) {
        if (socket) {
            // transfer first file
        }
    });

    aliceAccount->connectionManager().connectDevice(bobDeviceId, "file://file2",
        [](std::shared_ptr<ChannelSocket> socket) {
        if (socket) {
            // transfer second file
        }
    });

За этим ConnectionManager сначала подключит устройство Боба через DHT (по ICE) и настроит TLS Socket. Затем он попросит канал, а когда канал будет готов, сообщите Алисе через обратный звонок. Для второго файла он будет использовать первую замку и просто откроет новый канал (необходимо только 2 пакета TLS, поэтому это быстро)

ДHT-страна

Это то же самое, что call, см. Exchange ICE candidates, ICE negotiation, Encrypt the control socket, но только в TCP.

Однако, когда сторона получает новое запрос ICE, возвратный звонок, установленный null onICERequest(onICERequestCallback&&& cb);, запускается.

Переговоры о новом канале

Канал определяется идентификатором (уникальный) и ури (не уникальный).

Когда он готов, ConnectionManager считает, что канал 0 существует. Этот канал называется каналом CONTROL и используется для запроса новых каналов.

Используемый протокол довольно прост и похож на протокол RTP:

  1. 16 бит используются для хранения длины тела.

  2. 16 бит для идентификатора канала (направления)

  3. тело

Так что все пакеты имеют 32-битный len header.

Для запроса нового канала ConnectionManager отправит объект ChannelRequest (msgpack используется для сериализации структуры) в канале 0 для отправки идентификатора и имени нового канала к коллеге (с isAnswer = false).

Закрытие канала

EOF передается для канала, если длина содержания составляет 0.

Структура соединенияУправляющий

Собственность

  1. У аккаунта Jami есть ConnectionManager и доступ к объектам ChannelSocket (shared_ptr, принадлежащий MultiplexedSocket).

  2. ConnectionManager владеет объектами MultiplexedSockets и ICE

  3. MultiplexedSockets владеет транспортом TLS и объектами ChannelSocket

  4. ChannelSocket владеет буферами данных

Роли

  1. ConnectionManager используется для управления связями с одноклассниками.

  2. MultiplexedSockets используются для отправки данных через TLSSocket, чтения входящих пакетов и управления каналами.

  3. ChannelSockets используются клиентом для взаимодействия с другими партнерами.

Использование

Сценарии описаны в соответствующих единичных тестах (test/unitTest/connectionManager/connectionManager.cpp)