Fileroverførsel
THIS PAGE IS DEPRECATED: READ File transfer
Hvordan skal man bruge den?
Android
Når du taler med nogen på Android, har du mulighed for at sende et billede på din enhed eller tage et billede med disse knapper:
Bemærk: når du sender en fil, skal den anden acceptere den.
Hvordan fungerer det?
Hvordan det fungerer
Indledning
Jami er en distribueret applikation og skal fungere uden internetforbindelse. Så filoverførsel også! I bund og grund bruger vi samme metode til at udføre filoverførsel og opkald, men i TCP. For at opsummere hvordan det fungerer, kan vi forestille os en situation, hvor Alice (A) ønsker at overføre en fil til Bob (B).
For at gøre det bruger Jami ICE (RFC 6544), en protokol, der bruges til at forhandle forbindelser mellem kammerater. Alice sender, i en krypteret pakke via DHT ip af sin enhed. Så, når Bob modtager ips fra Alice, vil de være i stand til at forhandle en transport, hvor Bob vil være i stand til at sende pakker til Alice. Forhandlingen kan være vellykket, men hvis den fejler, vil en TURN server (den, der er konfigureret i indstillingerne) blive brugt til at udføre overførslen. Hvis forhandlingen lykkes, Bob vil sende sine ips til Alice for at udføre forhandlingen i den anden retning. Bemærk, at forbindelsen stadig ikke er sendt, så Bob vil sende ips gennem DHT i en krypteret besked. Hvis den anden forhandling fejler, vil TURN bruges som en tilbagefald.
Nu hvor den bidirectionelle TCP link er her, næste skridt vil være at forhandle en TLS 1.3 (generelt en (TLS1.3) - DHE-FFDHE8192) - RSA-PSS-RSAE-SHA384) - AES-256-GCM) når jeg skriver disse linjer) mellem Alice og Bob, så Alice vil begynde at overføre filen.
Den første del vil være en lille overskrift til at beskrive filens indhold.
Proces
Sende en fil
Følgende metode anvendes:
1. En klient vil ringe til DataTransferFacade::sendFile()
. DataTransferFacade
er klassen svarende til API’en, der er eksponeret for klienter. Den bruges til at administrere et syn på filoverførslerne (de tilsvarende klasser er DataTransfer
, IncomingFileTransfer
, OutgoingFileTransfer
og SubOutgoingFileTransfer
). Denne metode beder den tilknyttede JamiAccount
om at anmode om en forbindelse.
![Diagram: DataTransfer klasse diagram]images/file-transfer-datatransfer-class-diagram.png)
2. Metoden DhtPeerConnector: requestConnection()
aktiveres og opretter en forbindelse mellem alle de tilkoblede enheder i peer (finder sig på DHT). DhtPeerConnector
bruges til at administrere den vigtigste begivenhedslus, der administrerer forbindelser. Når en enhed er fundet, opretter event loop en ClientConnector
(der administrerer forbindelsen til en enhed) og starter processen)
3. Denne metode anvendes til at initialisere ICE-transporten og sætte en PeerConnectionMsg (som indeholder SDP-meddelelsen, se nedenfor) på DHT og vente på et svar (DhtPeerConnector::Impl::onResponseMsg
).
4. Derved modtages et svar fra DHT, som indeholder de offentlige adresser til peer-enheden. Vi kan nu forhandle en TLS-link (direkte via ICE eller via TURN som en back-up).
5.\ Når TLS-sjekket er klar, opkaldes tilbagekaldelsen DataTransferFacade::Impl::onConnectionRequestReply
, og en OutgoingFileTransfer
er knyttet til PeerConnection
som indgang. Denne OutgoingFileTransfer
indeholder en liste over SubOutgoingFileTransfer
(en pr. enhed), hvor hver suboverførsel er en overførsel til en enhed. Vi gør det for at kunne levere det mest optimistiske syn på overførslen (hvis en kontakt som 3 enheder, hvor kontakten annullerer overførslen på en enhed, men accepterer overførslen på de to andre, vil den mest avancerede overførsel vises).
6. SubOutgoingFileTransfer
vil først overføre filens overskrift, vente på peer accept (En »GO\n« besked på socket) og derefter sende filen.
7. Hvis der modtages en annullering fra peer eller kunden, eller hvis filoverførslen er afsluttet, lukkes forbindelsen via en CANCEL
meddelelse på DhtPeerConnector::eventLoop()
og ressourcerne frigives.
Modtagelse af en fil
Den samme struktur bruges til at modtage filer, men metoden ændrer sig lidt:
JamiAccount
-klassen bruges til at modtage meddelelser fra DHT, fordi det første, der modtages, vil være DHT-forespørgslen.Derefter gives denne besked til
DhtPeerConnector: onRequestMessage()
gennem eventLoop.DhtPeerConnector::Impl::answerToRequest
vil forsøge at oprette forbindelse til TURN-serveren (hvis ikke forbundet) og initialisere ICE-transporten. Denne metode åbner 2 kontrolforbindelser til en TURN-server (en til at autorisere IPv4-kammerater, en anden til IPv6-kammerater, på grund af RFC 6156) hvis den ikke allerede er åben og tillader Peer offentlige adresser at oprette forbindelse.Når linkene er klar, som afsenderen, forhandles en TLS-link og gives til
PeerConnection
givet tilIncomingFileTransfer
som indgang.
Gennemfør en tidligere filoverførsel
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.
Til dette formål sender en enhed en json med mime-typen: application/data-transfer-request+json
indeholdende conversation
(samtale id), interaction
(relateret interaktion), deviceId
den enhed, der modtager filen.
Afsenderen kontrollerer nu, om enheden er en enhed fra den annoncerede peer og om enheden er medlem af samtalen, og kan sende filen via en klassisk filoverførsel.
Modtageren kan nu acceptere den første indgående overførsel, downloade filen og kontrollere, at sha3sum er korrekt.
Forordning
SDP sendt over 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
Hvor 0d04b932
er ufrag og 7c33834e7cf944bf0e367b47
passordet til ICE-sessionen. 2130706431
og 1694498815
er kandidaternes prioritet. 192.168.0.126 42751 type host tcptype passiv
er en passiv host kandidat og 1694498815 X.X.X.X 42751 type srflx tcptype passiv
en passiv host, der afspejler den offentlige ip (mappet via UPnP for eksempel).
Flere enheder
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.
Første tilgang
Den første tilgang var at sende en anmodning gennem DHT til alle enheder, og de første enheder, der svarer får filen til at overføre.
Den nuværende tilgang
Vi sender stadig en anmodning til alle enheder. Forskellen er, at alle enheder vil have meddelelsen om at modtage en fil og kan acceptere/afvise overførslen.
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.
I data_transfer.cpp definerer vi klassen OptimisticMetaOutgoingInfo som repræsenterer den optimistiske visning at vise til klienten. Det er optimistisk, fordi hvis en kontakt accepterer en overførsel på en enhed og nægter på andre, vil denne klasse vise den igangværende filoverførsel. Og det vil kun vise en fejl, hvis alle enheder nægter overførslen.
Denne klasse er forbundet med SubOutgoingFileTransfer som repræsenterer status for en overførsel med en enhed.
Ved hjælp af en anden 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 bruger: adgangskode -r "realm"
Then, you can configure the TURN server in the advanced settings of the app.
Bemærk: dette kræver en vis teknisk viden. Desuden skal TURN-serveren se den samme ip-adresse for din node, som destinationnoden eller peer-forbindelsen vil fejle (for at autorisationen vil være forkert)
Liste over alle
Use libtorrent?
Vis status for underoverførsler for udgående filer