Zarządca połączeń

Wprowadzenie

Jeśli Alice chce być podłączona do jednego z urządzeń Boba, aby przenieść 2 pliki, poprowadzi ConnectionManager do otwarcia 2 kanałów (jeden na plik).

    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
        }
    });

Za tym ConnectionManager połączy się najpierw z urządzeniem Boba za pośrednictwem DHT (za pośrednictwem ICE) i ustawi TLS Socket. Następnie poprosi o kanał, a gdy kanał będzie gotowy, poinformuj Alice za pośrednictwem oddzwania.

Strona DHT

Jest to samo co call, patrz Exchange ICE kandydatów, ICE negocjacje, Encrypt kontrolny zasłony ale tylko w TCP.

Jednakże, gdy strona otrzymuje nowe wniosek ICE, uruchomi się odwołanie ustawione przez null onICERequest(onICERequestCallback&&& cb);.

Negocjacje o nowym kanale

Kanał jest zdefiniowany przez id (uniek) i uri (nie unikatowy).

W przypadku gdy jest gotowy, ConnectionManager uzna, że istnieje kanał 0. Kanał ten jest nazywany kanałem CONTROL i jest używany do żądania nowych kanałów.

Protokół jest prosty i wygląda jak protokoł RTP:

  1. 16 bitów jest używane do przechowywania długości ciała.

  2. 16 bitów dla identyfikatoru kanału (wybiór)

  3. ciało

Wszystkie pakiety mają 32-bitny len header.

Aby poprosić o nowy kanał, ConnectionManager wysyła obiekt ChannelRequest (msgpack jest używany do serializacji struktury) w kanale 0 w celu wysłania id i nazwy nowego kanału do rówieśnika (z isAnswer = false). Rówieśnik połączy z powrotem połączenie, które zostało podane z ̀ void onChannelRequest(ChannelRequestCallBack&&& cb);` i odmówi lub zaakceptuje wniosek.

Zamknięcie kanału

W przypadku kanału przesyłany jest EOF w przypadku, gdy długość treści wynosi 0.

Struktura połączeniaManager

Właściciel

  1. Konto Jami posiada ConnectionManager i ma dostęp do obiektów ChannelSocket (shared_ptr należący do MultiplexedSocket.

  2. ConnectionManager posiada obiekty MultiplexedSockets i ICE

  3. MultiplexedSockets posiada transport TLS i obiekty ChannelSocket

  4. ChannelSocket jest właścicielem buforów danych

Role

  1. ConnectionManager jest używany do zarządzania połączeniami z rówieśnikami.

  2. MultiplexedSockets są wykorzystywane do wysyłania danych przez TLSSocket, odczytywania wchodzących pakietów i zarządzania kanałami.

  3. ChannelSockets są używane przez klienta do interakcji z innym rówieśnikiem.

Użycie

Scenariusze opisane są w odpowiednich testach jednostkowych (test/unitTest/connectionManager/connectionManager.cpp)