Fileröverföring
THIS PAGE IS DEPRECATED: READ File transfer
Hur ska vi använda den?
Android
När du pratar med någon på Android har du möjlighet att skicka en bild på din enhet eller ta ett foto med dessa knappar:
Observera: när du skickar en fil måste den andra acceptera den.
Hur fungerar det?
Hur det fungerar
Inledning
Jami är en distribuerad applikation och måste fungera utan någon internetanslutning. Så filöverföring också! i princip använder vi samma metod för att utföra filöverföring och samtal, men i TCP. För att sammanfatta hur det fungerar, kan vi föreställa oss en situation där Alice (A) vill överföra en fil till Bob (B).
Först och främst kommer Alice att begära en anslutning till Bob. För att göra det använder Jami ICE (RFC 6544), ett protokoll som används för att förhandla länkar mellan kamrater. Alice kommer att skicka in i ett krypterat paket via DHT ip av sin enhet. Så när Bob får ips från Alice, kommer de att kunna förhandla om en transport där Bob kommer att kunna skicka paket till Alice. Förhandlingen kan vara framgångsrik, men om den misslyckas, kommer en TURN-server (den som konfigureras i inställningarna) att utföra överföringen. Om förhandlingen lyckas, Bob kommer att skicka sina ips till Alice för att utföra förhandlingen i den andra riktningen. Observera att länken fortfarande inte skickas, så Bob kommer att säkra ips genom DHT i ett krypterat meddelande. Om den andra förhandlingen misslyckas, kommer TURN att användas som en fallback.
Nu när den två riktade TCP-länken är här, nästa steg kommer att vara att förhandla en TLS 1.3 (vanligtvis en (TLS1.3) - DHE-FFDHE8192) - RSA-PSS-RSAE-SHA384) - AES-256-GCM) när jag skriver dessa linjer) mellan Alice och Bob, då kommer Alice att börja överföra filen.
Den första delen kommer att vara en liten rubrik som beskriver innehållet i filen.
Process
Skicka en fil
Följande metod används:
1. En klient kommer att ringa DataTransferFacade::sendFile()
. DataTransferFacade
är klassen motsvarande API som exponeras för klienten. Den används för att hantera en bild av filöverföringarna (svarande klasser är DataTransfer
, IncomingFileTransfer
, OutgoingFileTransfer
och SubOutgoingFileTransfer
). Denna metod kommer att be den länkade JamiAccount
att begära en anslutning.
![Diagram: DataTransfer klassdiagram]images/file-transfer-datatransfer-class-diagram.png)
2. Metoden DhtPeerConnector: requestConnection()
aktiveras och skapar en anslutning mellan alla anslutna enheter av peer (finns på DHT). DhtPeerConnector
används för att hantera den huvudsakliga händelseloppet som hanterar anslutningar. När en enhet hittas skapar event loop en ClientConnector
(som hanterar anslutningen för en enhet) och startar processen)
3. Denna metod används för att initialisera ICE-transporten och sätta en PeerConnectionMsg (som innehåller SDP-meddelandet, se nedan) på DHT och vänta på ett svar (DhtPeerConnector::Impl::onResponseMsg
).
4. Sedan får man ett svar från DHT, som innehåller offentliga adresser till peer-enheten. Vi kan nu förhandla om en TLS-länk (direkt via ICE eller via TURN som en fallback).
När TLS-säkten är klar kallas tillbaka DataTransferFacade::Impl::onConnectionRequestReply
, och en OutgoingFileTransfer
länkas till PeerConnection
som ett inmatningsmaterial. Denna OutgoingFileTransfer
innehåller en lista över SubOutgoingFileTransfer
(en per enhet) där varje suböverföring är en överföring till en enhet. Vi gör det för att kunna ge den mest optimistiska synen på överföringen (om en kontakt som 3 enheter, där kontakten avbryter överföringen på en enhet, men accepterar överföringen på de två andra, visas den mest avancerade överföringen).
6. SubOutgoingFileTransfer
kommer först att överföra filens header, vänta på peer acceptance (Ett ”GO\n” meddelande på socket) och sedan skicka filen.
7. Om en avbokning mottas från peer eller kunden eller om filöverföringen avslutas, kommer anslutningen att stängas via ett meddelande CANCEL
på DhtPeerConnector::eventLoop()
och resurserna kommer att frigöras.
Att ta emot en fil
Samma struktur används för att ta emot filer, men metoden ändras lite:
Klassen
JamiAccount
används för att ta emot meddelanden från DHT, eftersom det första som kommer att tas emot kommer att vara DHT-användningen.Därefter ges detta meddelande till
DhtPeerConnector: onRequestMessage()
genom eventLoop.Den
DhtPeerConnector::Impl::answerToRequest
kommer att försöka ansluta till TURN-servern (om inte ansluten) och initialisera ICE-transporten. Denna metod öppnar 2 kontrollanslutningar till en TURN-server (en för att auktorisera IPv4-kamrater, en annan för IPv6-kamrater, på grund av RFC 6156) om den inte redan är öppen och tillåter Peer offentliga adresser att ansluta.När länkarna är klara, som avsändaren, förhandlas en TLS-länk och ges till
PeerConnection
som ges tillIncomingFileTransfer
som en inmatning.
Överskjuta en tidigare filöverföring
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.
För att göra detta skickar en json med mime-typen: application/data-transfer-request+json
som innehåller conversation
(samtalens id), interaction
(relaterat interaktion), deviceId
den enhet som tar emot filen.
Sändaren kontrollerar nu om enheten är en enhet från den annonserade peern och att enheten är en medlem i konversationen, och kan skicka filen via en klassisk filöverföring.
Mottagaren kan nu acceptera den första inkommande överföringen, ladda ner filen och kontrollera att sha3sum är korrekt.
Förordning
! [Diagram: huvudschemat diagram](bilder/filöverföring- huvudschemat diagram.png)
SDP skickas via 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
Där 0d04b932
är ufrag och 7c33834e7cf944bf0e367b47
lösenordet för ICE-sessionen. 2130706431
och 1694498815
är kandidaternas prioritet. 192.168.0.126 42751 typ värd tcptype passiv
är en passiv värdkandidat och 1694498815 X.X.X.X 42751 typ srflx tcptype passiv
en passiv värd som återspeglar den offentliga ip (mappad via UPnP till exempel).
Multifunktionella enheter
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örsta tillvägagångssättet
Det första sättet var att skicka en begäran via DHT till alla enheter och de första enheter som svarar får filen att överföras.
Nuvarande strategi
Vi skickar fortfarande en begäran till alla enheter. Skillnaden är att alla enheter kommer att ha meddelandet om att ta emot en fil och kan acceptera/avvisa överföringen.
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 definierar vi klassen OptimisticMetaOutgoingInfo som representerar den optimistiska utsikten att visa till klienten. Det är optimistiskt eftersom om en kontakt accepterar en överföring på en enhet och vägrar på andra, kommer denna klass att visa den pågående filöverföringen. Och det kommer bara att visa ett fel om alla enheter vägrar överföringen.
Denna klass är kopplad till SubOutgoingFileTransfer som representerar tillståndet för en överföring med en enhet.
Använd en annan 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 användare: lösenord -r "realm"
Then, you can configure the TURN server in the advanced settings of the app.
Obs!: detta kräver vissa tekniska kunskaper. Dessutom bör TURN-servern se samma ip-adress på din nod som destinationsnoden eller peer-anslutningen kommer att misslyckas (eftersom auktoriseringen kommer att vara felaktig)
Listan över alla
Use libtorrent?
Visa status för underöverföringar för utgående filer