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

THIS PAGE IS DEPRECATED: READ File transfer

Как его использовать?

Android

Когда вы разговариваете с кем-то на Android, у вас есть возможность отправить фотографию на своем устройстве или сделать фотографию с помощью этих кнопок:

Android_file_button

Примечание: когда вы отправляете файл, другой должен принять его.

! Android_waiting_peer

Как это работает?

Как это работает

Введение

Jami - это распределенное приложение и должно работать без каких-либо интернет-соединений. Так что передача файлов тоже!

Сначала Алиса попросит связь с Бобом. Для этого Джами использует ICE (RFC 6544), протокол, используемый для переговоров о связях между сверстниками. Алиса отправит в зашифрованный пакет через DHT ip своего устройства. Так, когда Боб получит ips от Алисы, они смогут договориться о транспорте, где Боб сможет отправить пакеты Алисе. Переговор может быть успешным, но если он не удастся, для выполнения передачи будет использован сервер TURN (один, настроенный в настройках). Если переговоры будут успешны, Боб отправит свои ips Алисе для выполнения переговоров в другом направлении. Обратите внимание, что ссылка все еще не отправлена, поэтому Боб будет отправлять ips через DHT в зашифрованном сообщении. Если вторая переговор не удастся, TURN будет использоваться в качестве обратной связи.

Теперь, когда здесь двусторонняя связь TCP, следующим шагом будет переговоры TLS 1.3 (обычно (TLS1.3) - DHE-FFDHE8192) - RSA-PSS-RSAE-SHA384) - AES-256-GCM) между Алисом и Бобом, а затем Алиса начнет передавать файл.

Первая часть будет небольшой заголовком для описания содержания файла.

Процесс

Посылаю файл

Используется следующий метод:

1. Клиент позвонит DataTransferFacade::sendFile() . DataTransferFacade является классом, соответствующим API, выявленным для клиентов. Он используется для управления просмотром передач файлов (соответствующие классы: DataTransfer, IncomingFileTransfer, OutgoingFileTransfer и SubOutgoingFileTransfer).

![Diagram: Диаграмма класса передачи данных]images/file-transfer-dataatransfer-class-diagram.png)

2. Метод DhtPeerConnector: requestConnection() запускается и создает соединение между всеми подключенными устройствами пира (находимыми на DHT). DhtPeerConnector используется для управления цепью основного события, которое управляет соединениями.

3. Этот метод используется для инициирования ICE-транспорта и размещения PeerConnectionMsg (в котором содержится сообщение SDP, см. ниже) на DHT и ожидания ответа (DhtPeerConnector::Impl::onResponseMsg).

4. Затем получается ответ от DHT, который содержит публичные адреса однорангового устройства. Теперь мы можем договориться о TLS-связи (посредственно через ICE или через TURN в качестве обратной связи).

5.\ Когда замок TLS готов, обратный звонок DataTransferFacade::Impl::onConnectionRequestReply называется, и OutgoingFileTransfer связан с PeerConnection в качестве ввода. Этот OutgoingFileTransfer содержит список SubOutgoingFileTransfer (один на устройство), где каждый подперевод представляет собой перевод на одно устройство. Мы делаем это, чтобы обеспечить наиболее оптимистичный вид передачи (если контакт в качестве 3 устройств, где контакт отменил передачу на одном устройстве, но принял передачу на двух других, будет показана наиболее продвинутая передача).

6. SubOutgoingFileTransfer сначала переводит заголовок файла, ждет приема сверстников (сообщение «GO\n» на замку), а затем отправляет файл.

7. Если отмена получается от партнёра или клиента или если передача файлов завершается, соединение будет закрыто через сообщение CANCEL на DhtPeerConnector::eventLoop() и ресурсы будут высвобождены.

! [TLSsocketEndpoint](изображения/файловый перевод-tlssocketendpoint-diagram.png)

Прием файла

Для получения файлов используется та же структура, но метод немного меняется:

  1. Класс JamiAccount используется для получения сообщений от DHT, потому что первым полученным будет запрос DHT.

  2. Затем это сообщение передается DhtPeerConnector: onRequestMessage() через eventLoop.

  3. DhtPeerConnector::Impl::answerToRequest попытается подключиться к серверу TURN (если он не подключен) и инициировать транспорт ICE. Этот метод открывает 2 контрольные соединения с сервером TURN (один для авторизации IPv4 peers, другой для IPv6 peers, из-за RFC 6156) если он еще не открыт и позволяет публичным адресам Peer подключаться.

  4. После того, как ссылки готовы, как и отправитель, ссылка TLS будет переговорён и передана PeerConnection, передана IncomingFileTransfer в качестве ввода.

Повторное запрос на предыдущую передачу файлов

As specified in Other mime types, the data-transfer interactions are now synced and stored into conversations. So, a device can easily detects if a file was downloaded or not. If not, it can asks all members in the conversation to transmits the file again.

Для этого устройство будет отправлять json с типами mime: application/data-transfer-request+json, содержащий conversation (ID разговора), interaction (связанное взаимодействие), deviceId устройство, получающее файл.

Теперь отправитель проверяет, является ли устройство устройством от объявленного партнера и что устройство является членом разговора, и может отправлять файл через классическую передачу файлов.

Теперь получатель может принять первую поступающую передачу, загрузить файл и проверить, что сумма sha3 является правильной.

Схема

! [Diagram: главный схема диаграмма](изображения/файловый перевод-главный схема-diagram.png)

СДП отправлено через DHT
0d04b932
7c33834e7cf944bf0e367b47
H6e6ca682 1 TCP 2130706431 2607:fad8:4:6:9eb6:d0ff:dead:c0de 50693 typ host tcptype passive
H6e6ca682 1 TCP 2130706431 2607:fad8:4:6:9eb6:d0ff:dead:c0de 9 typ host tcptype active
H42c1b577 1 TCP 2130706431 fe80::9eb6:d0ff:fee7:1412 50693 typ host tcptype passive
H42c1b577 1 TCP 2130706431 fe80::9eb6:d0ff:fee7:1412 9 typ host tcptype active
Hc0a8007e 1 TCP 2130706431 192.168.0.123 42751 typ host tcptype passive
Hc0a8007e 1 TCP 2130706431 192.168.0.123 9 typ host tcptype active
Sc0a8007e 1 TCP 1694498815 X.X.X.X 42751 typ srflx tcptype passive
Z.Z.Z.Z:YYYY
A.A.A.A:YYYY

где 0d04b932 является ufrag и 7c33834e7cf944bf0e367b47 пароль сессии ICE. 2130706431 и 1694498815 являются приоритетом кандидатов. 192.168.0.126 42751 тип хозяина tcptype пассивный является пассивным хозяином кандидатом и 1694498815 X.X.X 42751 type srflx tcptype пассивный пассивный хозяин, отражающий публичный ip (например, отображаемый через UPnP).

Многоустройства

A user can link its account to several devices. So, we need to implement the transfer when a user send a file to a contact who have multiple devices linked to this account.

Первый подход

Первый подход заключался в отправке запроса через DHT на все устройства, и первые устройства, которые отвечают, получают файл для передачи.

Современный подход

Теперь мы все еще отправляем запрос на все устройства. Разница в том, что все устройства будут иметь уведомление о получении файла и могут принимать / отказываться от передачи.

Now (since https://review.jami.net/c/jami-daemon/+/9327), when a user send a file, it will request a PeerConnection with all peer devices. And for all connections, we attach a new input stream to have the ability to accept/refuse/cancel each transfer separately.

В data_transfer.cpp мы определяем класс OptimisticMetaOutgoingInfo, который представляет собой оптимистичный взгляд, чтобы показать клиенту. Это оптимистично, потому что если контакт принимает передачу на одном устройстве и отказывается от других, этот класс покажет текущий передача файлов. И он покажет ошибку только если все устройства отказываются от передачи.

Этот класс связан с SubOutgoingFileTransfer, которые представляют собой состояние передачи с одним устройством. Клиенты смогут показать субперевод вместо оптимистичного позже (см. список TODO).

Используя другой сервер TURN

Actually the default TURN server is turn.jami.net. But you can host your own TURN server. For example by running a coturn server.

`sudo turnserver -a -v -n -u пользователь: пароль -r «колеса»

Then, you can configure the TURN server in the advanced settings of the app.

Примечание: для этого требуется некоторое техническое знание. Кроме того, сервер TURN должен видеть тот же IP-адрес вашего узла, как и пункт назначения или не будет подключения (потому что авторизация будет неверной)

Список всех

  1. Use libtorrent?

  2. Показывать статус субпередач для исходящих файлов