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:

Opmerking: wanneer u een bestand stuurt, moet de ander het accepteren. Op dit moment ziet u ‘waiting 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.

Als de onderhandeling slaagt, wordt een TURN-server gebruikt om de overdracht uit te voeren. Als de onderhandeling slaagt, stuurt Bob zijn ips naar Alice om de onderhandeling in de andere richting uit te voeren. Merk op dat de link nog niet is gestuurd, dus zal Bob de ips via de DHT in een gecodeerde boodschap sturen.

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. Een cliënt roept DataTransferFacade::sendFile() . DataTransferFacade is de klasse die overeenkomt met de API die voor de cliënten wordt blootgesteld. Het wordt gebruikt om een weergave van de bestandsoverdrachten te beheren (de overeenkomstige klassen zijn DataTransfer, IncomingFileTransfer, OutgoingFileTransfer en SubOutgoingFileTransfer).

[Diagram: DataTransfer klasdiagram]images/file-transfer-datatransfer-class-diagram.png)

2. De methode DhtPeerConnector: requestConnection() wordt geactiveerd en creëert een verbinding tussen alle aangesloten apparaten van de peer (op de DHT). `DhtPeerConnector wordt gebruikt om de hoofdgebeurtenislus te beheren die verbindingen beheren.

3. Deze methode wordt gebruikt om het ICE-transport in te starten en een PeerConnectionMsg (die het SDP-bericht bevat, zie hieronder) op de DHT te plaatsen en op een reactie te wachten (DhtPeerConnector::Impl::onResponseMsg).

4. Vervolgens wordt een reactie ontvangen van de DHT, die publieke adressen van het peer-apparaat bevat. We kunnen nu een TLS-verbinding onderhandelen (direct via ICE, of via TURN als een terugval).

Wanneer de TLS-schakelaar klaar is, wordt de callback DataTransferFacade::Impl::onConnectionRequestReply genoemd, en wordt een OutgoingFileTransfer als input gekoppeld aan de PeerConnection. Deze OutgoingFileTransfer bevat een lijst van SubOutgoingFileTransfer (één per apparaat) waar elke suboverdracht een overdracht naar één apparaat is.

6. De SubOutgoingFileTransfer zal eerst de header van het bestand overbrengen, wachten op de acceptatie door de collega’s (Een “GO\n” bericht op de socket) en dan het bestand verzenden.

7. Als een annulering wordt ontvangen van de peer of de cliënt of als de file-overdracht eindigt, wordt de verbinding gesloten via een CANCEL bericht op de DhtPeerConnector::eventLoop() en worden de middelen vrijgegeven.

! 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

Waar 0d04b932 is de ufrag en 7c33834e7cf944bf0e367b47 het wachtwoord van de ICE-sessie. 2130706431 en 1694498815 zijn de prioriteit van de kandidaten. 192.168.0.126 42751 type gastheer tcptype passief is een passieve gastheer kandidaat en 1694498815 X.X.X.X 42751 type srflx tcptype passief een passieve gastheer die de publieke ip weerspiegelt (bijvoorbeeld gemappeerd via UPnP).

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.

Opmerking: hiervoor is wat technische kennis nodig. Bovendien moet de TURN-server hetzelfde IP-adres van uw knoop zien als de bestemmingsknop of de peer-verbinding zal falen (omdat de autorisatie verkeerd is)

TODO Lijst

  1. Use libtorrent?

  2. Vertoon status van subtransfers voor uitgaande bestanden