Przekazanie plików

THIS PAGE IS DEPRECATED: READ File transfer

Jak go użyć?

Android

Kiedy rozmawiasz z kimś na Androida, masz możliwość wysłania zdjęcia na urządzenie lub robienia zdjęcia za pomocą tych przycisków:

! Android_file_butons

Uwaga: gdy wysyłasz plik, drugi musi go zaakceptować.

/ (Android_waiting_peer)

Jak to działa?

Jak to działa

Wprowadzenie

Jami jest rozproszoną aplikacją i musi działać bez żadnego połączenia internetowego. Więc transfer plików również! zasadniczo używamy tej samej metody do przeprowadzania transferu plików i połączeń, ale w TCP. Aby podsumować, jak to działa, możemy wyobrazić sobie sytuację, w której Alice (A) chce przenieść plik do Boba (B).

Po pierwsze, Alice poprosi o połączenie z Bobem. Aby to zrobić, Jami używa ICE (RFC 6544), protokołu używanego do negocjacji połączeń między rówieśnikami. Alice wysyła, w szyfrowany pakiet za pośrednictwem DHT IP swojego urządzenia. Więc, gdy Bob otrzymuje ips Alice, będą mogli negocjować transport, w którym Bob będzie w stanie wysłać pakiety do Alice. Negocjacja może być udana, ale jeśli nie powiodła, serwer TURN zostanie wykorzystany (ten skonfigurowany w ustawieniach) do przeprowadzenia przelewu. Jeśli negocjacja się uda, Bob wysyła swoje ips do Alice, aby przeprowadzić negocjacje w innym kierunku.

Teraz, gdy jest tu dwukierunkowy link TCP, następnym krokiem będzie negocjacja TLS 1.3 (zwykle (TLS1.3) - DHE-FFDHE8192) - RSA-PSS-RSAE-SHA384) - AES-256-GCM) między Alice a Bob, a potem Alice rozpocznie przenoszenie pliku.

Pierwsza część będzie małą nagłówką opisaną w treści pliku.

Proces

Wysyłanie pliku

Wykorzystuje się następującą metodę:

1. Klient zadzwoni do DataTransferFacade::sendFile() . DataTransferFacade jest klasą odpowiadającą API ekspozycji dla klientów. Używany jest do zarządzania widokiem transferów plików (odpowiednie klasy to DataTransfer, IncomingFileTransfer, OutgoingFileTransfer i SubOutgoingFileTransfer).

![Diagram: Diagram klasy przelewu danych]images/file-transfer-dataatransfer-class-diagram.png)

2. Metody DhtPeerConnector: requestConnection() jest uruchomiona i tworzy połączenie między wszystkimi połączonymi urządzeniami peer (nawiązanymi na DHT). DhtPeerConnector jest używany do zarządzania głównym śliskem zdarzeń, które zarządzają połączeniami.

3. Ta metoda jest używana do inicjalizacji transportu ICE i umieszczania PeerConnectionMsg (który zawiera wiadomość SDP, patrz poniżej) na DHT i czeka na odpowiedź (DhtPeerConnector::Impl::onResponseMsg).

4. Następnie otrzymuje się odpowiedź z DHT, który zawiera publiczne adresy urządzenia peer. Możemy teraz negocjować połączenie TLS (bezpośrednio za pośrednictwem ICE lub za pośrednictwem TURN jako back-back).

5.\ Kiedy zakład TLS jest gotowy, odwołanie DataTransferFacade::Impl::onConnectionRequestReply jest wezwane, a OutgoingFileTransfer jest połączone z PeerConnection jako wejście.

SubOutgoingFileTransfer przeniesie najpierw nagłówek pliku, czeka na akceptację przez rówieśników (powiadomienie „GO\n” na zakładce), a następnie wysyła plik.

7. Jeśli od peer lub klienta zostanie otrzymywana anulacja lub jeśli transfer plików zostanie zakończony, połączenie zostanie zamknięte za pośrednictwem wiadomości CANCEL na DhtPeerConnector::eventLoop() i zasoby zostaną uwolnione.

! TLSsocketEndpoint

Otrzymanie pliku

W przypadku przyjmowania plików używa się tej samej struktury, ale metoda się nieco zmienia:

  1. Klasy JamiAccount są używane do otrzymywania wiadomości od DHT, ponieważ pierwszą rzeczą otrzymaną będzie wniosek DHT.

  2. Następnie przekazuje się to wiadomość do DhtPeerConnector: onRequestMessage() za pośrednictwem eventLoop.

  3. DhtPeerConnector::Impl::answerToRequest będzie próbował połączyć się z serwerem TURN (jeśli nie jest połączony) i inicjować transport ICE. Ta metoda otworzy 2 połączenia kontrolne do serwera TURN (jedna do autoryzowania IPv4 peers, druga dla IPv6 peers, z powodu RFC 6156) jeśli nie jest już otwarta i umożliwi połączenie publicznych adresów Peer. Następnie, jeśli otrzymany SDP nie zawiera kandydatów ICE, użyje TURN i wypracuje odpowiedź SDP, aby poczekać na peer. Jeśli SDP zawiera kandydatów ICE, metoda będzie próbować negocjować połączenie (lub odwrócić się na TURN) i następnie odpowiedzieć na SDP (z kandydatami ICE czy nie).

  4. Po gotowości linków, podobnie jak odesłaniec, link TLS jest negocjowany i przekazany PeerConnection, przekazany IncomingFileTransfer jako wejście.

Powtórne żądanie poprzedniego przesyłania plików

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.

W celu tego urządzenie wysyła json z typem mime: application/data-transfer-request+json zawierający conversation (id rozmowy), interaction (związane interakcje), deviceId urządzenie otrzymujące plik.

Odesłaniec sprawdza, czy urządzenie jest urządzeniem ogłoszonego rówieśnika i czy urządzenie jest członkiem rozmowy, i może wysłać plik za pośrednictwem klasycznego przesyłania plików.

Odbiorca może teraz zaakceptować pierwszy przychodzący przekaz, pobrać plik i sprawdzić, czy sha3sum jest prawidłowy.

Wymóg

[Diagram: główny schemat diagram](obrazy/pływ plików-przekaz-główny schemat-diagram.png)

SDP wysłany przez 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

0d04b932 jest ufrag i 7c33834e7cf944bf0e367b47 hasło sesji ICE. 2130706431 i 1694498815 są priorytetem kandydatów. 192.168.0.126 42751 typ host tcptype pasywny jest pasywnym host candidatem i 1694498815 X.X.X.X 42751 typ srflx tcptype pasywny pasywny host odzwierciedlający publiczne ip (na przykład wykonane w UPnP).

Wykorzystywane w różnych urządzeniach

Użytkownik może powiązać swoje konto z kilkoma urządzeniami. Musimy więc zaimplementować transfer, gdy użytkownik wysyła plik do kontaktu, który ma wiele urządzeń powiązanych z tym kontem.

Pierwszy podejście

Pierwszym sposobem było wysłanie wniosku przez DHT do wszystkich urządzeń, a pierwsze urządzenia, które odpowiadają, otrzymują plik do przesyłania.

Obecny podejście

Wciąż wysyłamy wniosek do wszystkich urządzeń. Różnica jest taka, że wszystkie urządzenia będą miały powiadomienie o otrzymaniu pliku i mogą zaakceptować/odmówić przekazanie.

Teraz (od https://review.jami.net/c/jami-daemon/+/9327), gdy użytkownik wysyła plik, zażąda PeerConnection ze wszystkimi urządzeniami równorzędnymi. Dla wszystkich połączeń dołączamy nowy strumień wejściowy, aby mieć możliwość zaakceptowania/odrzucenia/anulowania każdego transferu osobno.

W data_transfer.cpp definiujemy klasę OptimisticMetaOutgoingInfo reprezentującą optymistyczny widok do pokazania klientowi. Jest optymistyczny, ponieważ jeśli kontakt przyjmuje transfer na jednym urządzeniu i odrzuca na innych, ta klasa wykaże trwający transfer plików.

Ta klasa jest powiązana z SubOutgoingFileTransfer które reprezentują stan przekazu z jednym urządzeniem. Klienci będą mogli wyświetlić subtransfer zamiast optymistycznego później (patrz lista TODO).

Korzystając z innego serwera TURN

W rzeczywistości domyślnym serwerem TURN jest turn.jami.net. Można jednak hostować własny serwer TURN. Na przykład uruchamiając serwer coturn.

`sudo turnserver -a -v -n -u użytkownik: hasło -r „królestwo”

Następnie można skonfigurować serwer TURN w ustawieniach zaawansowanych aplikacji.

Uwaga: potrzeba pewnych wiedzy technicznych. Ponadto serwer TURN powinien zobaczyć ten sam adres IP węzła, w którym węzł docelowy lub połączenie rówieśników nie działa (ponieważ autoryzacja będzie nieprawidłowa)

Lista TODO

  1. Używać libtorrent?

  2. Wyświetlać status podprzekazu dla plików wyjściowych