Dateifügelübertragung
THIS PAGE IS DEPRECATED: READ File transfer
Wie soll ich es benutzen?
Android
Wenn Sie mit jemandem auf Android sprechen, haben Sie die Möglichkeit, ein Bild auf Ihrem Gerät zu senden oder ein Foto mit diesen Tasten zu machen:
Hinweis: Wenn Sie eine Datei senden, muss die andere sie akzeptieren.
Die Kommission hat die Kommission mit der Einführung eines neuen Systems zur Erreichung der Anwendungsmöglichkeiten für die Nutzung von Daten und Daten über die Nutzung von Daten und Daten.
Wie funktioniert das?
Wie funktioniert es?
Einführung
Jami ist eine verteilte Anwendung und muss ohne Internetverbindung funktionieren. Also auch Dateitransfer! Grundsätzlich verwenden wir dieselbe Methode, um Dateitransfer und Anrufe durchzuführen, aber in TCP. Um zusammenzufassen, wie es funktioniert, können wir uns eine Situation vorstellen, in der Alice (A) eine Datei an Bob (B) übertragen möchte.
Als erstes wird Alice eine Verbindung zu Bob anfordern. Dafür verwendet Jami ICE (RFC 6544), ein Protokoll, das verwendet wird, um Verbindungen zwischen Peers zu verhandeln. Alice sendet über die DHT den IP ihres Geräts in ein verschlüsseltes Paket. Wenn Bob die ips von Alice empfängt, können sie also einen Transport verhandeln, bei dem Bob Pakete an Alice senden kann. Die Verhandlung kann erfolgreich sein, aber wenn sie versagt, wird ein TURN-Server (der in die Einstellungen konfiguriert) verwendet werden, um die Übertragung durchzuführen. Wenn die Verhandlung erfolgreich ist, wird Bob seine ips an Alice senden, um die Verhandlung in die andere Richtung durchzuführen. Beachten Sie, dass der Link immer noch nicht geschickt ist, so wird Bob die ips durch die DHT in einer verschlüsselten Nachricht schicken. Wenn die zweite Verhandlung versagt, wird die TURN als Rückschlag verwendet werden.
Jetzt, da der zweiseitige TCP-Link hier ist, wird der nächste Schritt darin bestehen, zwischen Alice und Bob ein TLS 1.3 (in der Regel ein (TLS1.3) - ((DHE-FFDHE8192) - ((RSA-PSS-RSAE-SHA384) - ((AES-256-GCM) zu verhandeln, wenn ich diese Zeilen schreibe)
Der erste Teil wird eine kleine Überschrift sein, die den Inhalt der Datei beschreibt.
Prozess
Eine Datei zu senden
Die folgende Methode wird angewendet:
1. Ein Client ruft DataTransferFacade::sendFile()
. DataTransferFacade
ist die Klasse, die der API entspricht, die für die Kunden ausgesetzt ist. Es wird verwendet, um eine Ansicht der Dateitransfer zu verwalten (die entsprechenden Klassen sind DataTransfer
, IncomingFileTransfer
, OutgoingFileTransfer
und SubOutgoingFileTransfer
). Diese Methode wird den verknüpften JamiAccount
um eine Verbindung zu beantragen.
![Diagramm: Datentransfer-Klassendiagramm]images/file-transfer-datatransfer-class-diagramm.png)
2. Die Methode DhtPeerConnector: requestConnection()
wird ausgelöst und erstellt eine Verbindung zwischen allen angeschlossenen Geräten des Peers (auf der DHT). DhtPeerConnector
wird zur Verwaltung der Hauptveranstaltungsschleife verwendet, die Verbindungen verwaltet. Wenn ein Gerät gefunden wird, erstellt die event loop einen ClientConnector
(der die Verbindung für ein Gerät verwaltet) und startet den prozess)
.
3. Diese Methode wird verwendet, um den ICE-Transport zu initialisieren und ein PeerConnectionMsg (das die SDP-Nachricht enthält, siehe unten) auf das DHT zu setzen und auf eine Antwort zu warten (DhtPeerConnector::Impl::onResponseMsg
).
4. Dann wird eine Antwort vom DHT erhalten, der öffentliche Adressen des Peer-Geräts enthält. Wir können nun eine TLS-Verbindung (direkt über ICE oder über TURN als Rückfall) verhandeln. Dieser TlsSocketEndpoint
wird dem PeerConnection
Objekt als Ausgang gegeben und der Transfer kann beginnen.
5.\ Wenn die TLS-Socket bereit ist, wird der Callback DataTransferFacade::Impl::onConnectionRequestReply
angerufen, und ein OutgoingFileTransfer
wird als Eingabe an die PeerConnection
gekoppelt. Dieser OutgoingFileTransfer
enthält eine Liste von SubOutgoingFileTransfer
(eine pro Gerät), wo jede Subtransfer eine Übertragung auf ein Gerät ist. Wir tun dies, um die optimistischste Sicht auf die Übertragung zu liefern (wenn ein Kontakt als 3 Geräte, wo der Kontakt die Übertragung auf einem Gerät storniert, aber die Übertragung auf den anderen beiden akzeptiert, wird die fortschrittlichste Übertragung angezeigt).
6. Die SubOutgoingFileTransfer
wird zunächst den Header der Datei übertragen, auf die Peer-Akzeptanz warten (Eine „GO\n“ Nachricht auf der Steckdose) und dann die Datei senden.
7. Wenn ein Abbruch von dem Peer oder dem Kunden erfolgt oder die Dateiübertragung abgeschlossen ist, wird die Verbindung über eine CANCEL
Nachricht auf dem DhtPeerConnector::eventLoop()
geschlossen und die Ressourcen freigegeben.
Erhalt einer Datei
Die gleiche Struktur wird verwendet, um Dateien zu empfangen, aber die Methode ändert sich ein wenig:
Die
JamiAccount
-Klasse wird verwendet, um Nachrichten vom DHT zu empfangen, da das erste, was empfangen wird, die DHT-Anfrage ist.Dann wird diese Nachricht an
DhtPeerConnector: onRequestMessage()
über den EventLoop übermittelt.Der
DhtPeerConnector::Impl::answerToRequest
wird versuchen, sich mit dem TURN-Server zu verbinden (wenn nicht verbunden) und den ICE-Transport zu initialisieren. Diese Methode öffnet 2 Steuerverbindungen zu einem TURN-Server (einer für die Berechtigung von IPv4-Pare, ein anderer für IPv6-Pare, aufgrund von RFC 6156) wenn es noch nicht geöffnet ist und Peer-öffentliche Adressen zur Verbindung erlaubt. Wenn dann die empfangene SDP keine ICE-Kandidaten enthält, wird die TURN verwendet und die SDP-Antwort erstellt, um auf den Peer zu warten. Wenn die SDP ICE-Kandidaten enthält, wird die Methode versuchen, den Link zu verhandeln (oder sich auf die TURN zurückzuziehen) und dann die SDP (mit ICE-Kandidaten oder nicht) zu beantworten.Sobald die Links wie der Absender fertig sind, wird ein TLS-Link ausgehandelt und der
PeerConnection
als Eingabe an dieIncomingFileTransfer
gegeben. Die Header der Datei kommen und der Kunde kann nun die Übertragung akzeptieren oder stornieren.
Wiederforderung einer vorherigen Dateiübertragung
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.
Dazu wird das Gerät einen json mit dem Mime-Typ: application/data-transfer-request+json
senden, der conversation
(die Konversations-ID), interaction
(verwandte Interaktion) enthält, deviceId
das Gerät, das die Datei empfängt.
Der Absender überprüft nun, ob das Gerät ein Gerät des angekündigten Peers ist und dass das Gerät ein Mitglied der Konversation ist, und kann die Datei über eine klassische Dateiübertragung senden.
Der Empfänger kann nun die erste eingehende Übertragung akzeptieren, die Datei herunterladen und überprüfen, ob die sha3sum korrekt ist.
Schema
Die Daten sind nicht mehr in der Lage, zu übertragen.
SDP über die DHT gesendet
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
Wo 0d04b932
ist die ufrag und 7c33834e7cf944bf0e367b47
das Passwort der ICE-Sitzung. 2130706431
und 1694498815
sind die Priorität der Kandidaten. 192.168.0.126 42751 Typ-Host tcptype passive
ist ein passiver Host-Kandidat und 1694498815 X.X.X 42751 typ srflx tcptype passive
ein passiver Host, der die öffentliche IP widerspiegelt (zum Beispiel über UPnP gemappt).
Mehrfachgeräte
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.
Erster Ansatz
Die erste Ansatz war, eine Anfrage über die DHT an alle Geräte zu senden und die ersten Geräte, die antworten, erhalten die Datei zu übertragen. Dies ist schlecht für Ihren Kontakt, weil sie nicht wissen, welches Gerät die Übertragung erhält.
Aktueller Ansatz
Wir schicken immer noch eine Anfrage an alle Geräte. Der Unterschied ist, dass alle Geräte die Benachrichtigung für den Erhalt einer Datei haben und die Übertragung akzeptieren/ablehnen können. Der größte Teil des Codes für das ist 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 definieren wir die OptimisticMetaOutgoingInfo Klasse, die die optimistische Ansicht darstellen, die dem Client angezeigt wird. Es ist optimistisch, weil wenn ein Kontakt eine Übertragung auf einem Gerät akzeptiert und auf anderen ablehnt, diese Klasse die laufende Dateiübertragung anzeigt. Und es zeigt nur einen Fehler an, wenn alle Geräte die Übertragung ablehnen.
Diese Klasse ist mit SubOutgoingFileTransfer verbunden, die den Zustand einer Übertragung mit einem Gerät darstellen.
Mit einem anderen 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 Benutzer: Passwort -r „Realm“
Then, you can configure the TURN server in the advanced settings of the app.
Hinweis: Dies erfordert einige technische Kenntnisse. Außerdem sollte der TURN-Server die gleiche IP-Adresse Ihres Knoten sehen, wie der Zielenknoten oder die Peer-Verbindung fehlschlägt (weil die Berechtigung falsch ist).
Liste der
Use libtorrent?
Anzeigen Sie den Status der Subtransfers für ausgehende Dateien