File overdracht

THIS PAGE IS DEPRECATED: READ File transfer

Hoe moet ik het gebruiken?

Android

Als je met iemand op Android praat, heb je de mogelijkheid om een foto op je apparaat te sturen of een foto te maken met deze knoppen:

De volgende pagina’s bevatten een aantal informatie over de gebruikers:

Notitie

When you send a file, the other has to accept it. At this moment you will see ‘awaiting peer’:

De nieuwe technologie is een van de meest gebruikte oplossingen voor het gebruik van de technologie.

Hoe werkt het?

Hoe het werkt

Inleiding

Jami is een gedistribueerde applicatie en moet werken zonder internetverbinding. Dus ook bestandsoverdracht! We gebruiken in principe dezelfde methode om bestandsoverdracht en oproepen uit te voeren, maar in TCP. Om samen te vatten hoe het werkt, kunnen we ons een situatie voorstellen waarin Alice (A) een bestand naar Bob (B) wil overdragen.

First, Alice will request a connection to Bob. To do that, Jami is using ICE (RFC 6544), a protocol used to negotiate links between peers. Alice will send, into an encrypted packet via the DHT the IP address of its device. So, when Bob receives the IP addresses of Alice, they will be able to negotiate a transport where Bob will be able to send packets to Alice. The negotiation can be successful, but if it fails, a TURN server will be used (the one configured into the settings) to perform the transfer. If the negotiation succeeds, Bob will send its IP addresses to Alice to perform the negotiation in the other direction. Note that the link is still not secure, so Bob will send the IP addresses through the DHT network in an encrypted message. If the second negotiation fails, the TURN will be used as a fallback.

Nu de tweerichtings TCP-link hier is, zal de volgende stap zijn om een TLS 1.3 (meestal een (TLS1.3)-(DHE-FFDHE8192)-(RSA-PSS-RSAE-SHA384)-(AES-256-GCM) te onderhandelen tussen Alice en Bob, dan zal Alice beginnen met het overbrengen van het bestand.

Het eerste deel zal een kleine kop zijn om de inhoud van het bestand te beschrijven.

Proces

Een bestand verzenden

De volgende methode wordt gebruikt:

  1. A client will call DataTransferFacade::sendFile(). DataTransferFacade is the class corresponding to the API exposed for the clients. It is used to manage a view of the file transfers (the corresponding classes are DataTransfer, IncomingFileTransfer, OutgoingFileTransfer and SubOutgoingFileTransfer). This method will ask the linked JamiAccount to request a connection. Diagram: DataTransfer class diagram

  2. The method DhtPeerConnector: requestConnection() is triggered and creates a connection between all connected devices of the peer (found on the DHT). DhtPeerConnector is used to manage the main event loop which manage connections. When a device is found, the event loop will create a ClientConnector (which manage the connection for one device) and launch the process() method.

  3. This method is used to initialize the ICE transport and put a PeerConnectionMsg (which contains the SDP message, see below) on the DHT and waits for a response (DhtPeerConnector::Impl::onResponseMsg).

  4. Then a response is received from the DHT, which contains public addresses of the peer device. We can now negotiate a TLS link (directly via ICE, or via TURN as a fallback). This TlsSocketEndpoint is given to the PeerConnection object as an output and the transfer can start.

  5. When the TLS socket is ready, the callback DataTransferFacade::Impl::onConnectionRequestReply is called, and a OutgoingFileTransfer is linked to the PeerConnection as an input. This OutgoingFileTransfer contains a list of SubOutgoingFileTransfer (one per device) where each sub transfer is a transfer to one device. We do that to be able to furnish the most optimistic view of the transfer (if a contact as 3 devices, where the contact cancel the transfer on one device, but accepted the transfer on the two others, the most advanced transfer will be shown).

  6. The SubOutgoingFileTransfer will first transfer the header of the file, wait the peer acceptance (A “GO\n” message on the socket) and then will send the file.

  7. If a cancel is received from the peer or the client or if the file transfer finish, the connection will be closed via a CANCEL message on the DhtPeerConnector::eventLoop() and the resources will be released.

! TLSsocketEndpoint

Ontvangen van een dossier

De tekst wordt gebruikt om bestanden te ontvangen, maar de methode verandert een beetje:

  1. De JamiAccount-klasse wordt gebruikt om berichten van de DHT te ontvangen, omdat het eerste wat wordt ontvangen het DHT-verzoek zal zijn.

  2. Vervolgens wordt dit bericht via het eventLoop aan DhtPeerConnector: onRequestMessage() gegeven.

  3. De DhtPeerConnector::Impl::answerToRequest zal proberen verbinding te maken met de TURN-server (als niet aangesloten) en het ICE-transport in te zetten. Deze methode opent 2 controleverbindingen met een TURN-server (een om IPv4-peers te autoriseren, een andere voor IPv6-peers, als het niet al is geopend) en stelt Peer publieke adressen toe om te verbinden.

  4. Zodra de links klaar zijn, zoals de afzender, wordt een TLS-link onderhandeld en gegeven aan de PeerConnection gegeven aan de IncomingFileTransfer als input. De koppen van het bestand zullen komen en de cliënt kan nu de overdracht accepteren of annuleren.

Hervragen voor een eerdere file-overdracht

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.

Om dit te doen, zal het apparaat een json sturen met het mime-type: applicatie/data-transfer-request+json met conversatie (het ID van het gesprek), interactie (gerelateerde interactie), deviceId het apparaat dat het bestand ontvangt.

De afzender controleert nu of het apparaat een apparaat is van de aangekondigde peer en dat het apparaat lid is van het gesprek, en kan het bestand verzenden via een klassieke bestandsoverdracht.

De ontvanger kan nu de eerste inkomende overdracht accepteren, het bestand downloaden en controleren of de sha3sum correct is.

Schema

Diagram: hoofdschema diagram

SDP verzonden via de 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

Where 0d04b932 is the ufrag and 7c33834e7cf944bf0e367b47 the password of the ICE session. 2130706431 and 1694498815 are the priority of the candidates. 192.168.0.126 42751 typ host tcptype passive is a passive host candidate and 1694498815 X.X.X.X 42751 typ srflx tcptype passive a passive host reflecting the public IP address (mapped via UPnP for example).

Meervoudige apparaten

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.

Eerste aanpak

De eerste aanpak was om een verzoek via de DHT naar alle apparaten te sturen en de eerste apparaten die antwoorden krijgen het bestand te overbrengen.

De huidige aanpak

We sturen een verzoek naar alle apparaten. Het verschil is dat alle apparaten de kennisgeving hebben voor het ontvangen van een bestand en de overdracht kunnen accepteren/weigeren. Het grootste deel van de code voor dat is in data_transfer.cpp.

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.

In data_transfer.cpp definiëren we de OptimisticMetaOutgoingInfo klasse die de optimistische visie vertegenwoordigt om aan de cliënt te tonen. Het is optimistisch omdat als een contact een overdracht op één apparaat accepteert en op andere weigert, deze klasse de lopende file-overdracht zal tonen. En het zal alleen een fout tonen als alle apparaten de overdracht weigeren.

Deze klasse is gekoppeld aan SubOutgoingFileTransfer die de staat van een overdracht met één apparaat vertegenwoordigen.

Gebruik van een andere TURN-server

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 gebruiker: wachtwoord -r "realm"

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

Notitie

This needs some technical knowledge. Moreover, the TURN server should see the same IP address of your node as the destination node, or the peer connection will fail (because the authorization will be incorrect).

TODO Lijst

  1. Use libtorrent?

  2. Vertoon status van subtransfers voor uitgaande bestanden