Tiedostojen siirto
THIS PAGE IS DEPRECATED: READ File transfer
Miten sitä käytetään?
Android
Kun puhut Android-käyttäjälle, sinulla on mahdollisuus lähettää kuva laitteellesi tai ottaa kuva näillä nappilla:
Huomautus: lähettämällä tiedosto, toinen on hyväksyttävä sen.
Miten se toimii?
Miten se toimii
Esitelmä
Jami on jakautunut sovellus ja sen on toimittava ilman internetyhteyttä. Joten tiedostojen siirto myös! Periaatteessa käytämme samaa menetelmää tiedostojen siirron ja puhelujen suorittamiseksi, mutta TCP:ssä.
Aliisin mukaan Aliisin IP-osoitteen lähettäminen on tehtävä yhdessä, ja sen jälkeen Aliisin IP-osoitteen lähettäminen on mahdollista. Aliisin IP-osoitteen lähettäminen on mahdollista, jos Bob voi lähettää paketteja Aliisin luo. Neuvottelu voi onnistua, mutta jos se epäonnistuu, siirtoa varten käytetään TURN-palvelinta (se, joka on määritelty asetuksiin). Jos neuvottelu onnistuu, Bob lähettää aliisin IP-osoitteen sen kanssa, jotta se suorittaa neuvottelut toisella suunnalta. Huomaa, että linkki ei vielä lähetä, joten Bob lähettää IP-osoitteet DHT:n kautta salautetussa viestissä.
Nyt kun kaksisuuntainen TCP-yhteys on täällä, seuraava askel on neuvotella TLS 1.3 (yleensä (TLS1.3) - DHE-FFDHE8192) - RSA-PSS-RSAE-SHA384) - AES-256-GCM) -aineiden kirjoittamisen yhteydessä Alice ja Bobin välillä, sitten Alice alkaa siirtää tiedostoa.
Ensimmäinen osa on pieni otsikko, jossa kuvataan tiedoston sisältö.
Prosessi
Lähetä tiedosto
Käytetään seuraava menetelmä:
1. Asiakas soittaa DataTransferFacade::sendFile()
. DataTransferFacade
on luokkaan, joka vastaa asiakkaan paljastettuja API:tä. Sitä käytetään tiedostojen siirtojen näkymän hallintaan (vastavat luokkat ovat DataTransfer
, IncomingFileTransfer
, OutgoingFileTransfer
ja SubOutgoingFileTransfer
).
![Diagramma: DataTransfer-luokan diagramma]images/file-transfer-dataatransfer-class-diagram.png)
2. Menetelmä DhtPeerConnector: requestConnection()
käynnistetään ja luodaan yhteys kaikkien vertaisesta (DHT:n) liittyvien laitteiden välillä. DhtPeerConnector
käytetään yhteyksiä hallinnoivan päätapahtuman pyörimiseen.
3. Tätä menetelmää käytetään ICE-liikenteen käynnistämiseen ja DHT:lle PeerConnectionMsg (joka sisältää SDP-viestin, ks. alla) ja odottaa vastausta (DhtPeerConnector::Impl::onResponseMsg
).
4. Sitten DHT:stä vastaanotetaan vastaus, joka sisältää vertaislaitteen julkiset osoitteet. Nyt voimme neuvotella TLS-yhteyden (suoraan ICE:n kautta tai TURN:n kautta takaisin). Tämä TlsSocketEndpoint
annetaan PeerConnection
kohteelle ulkona ja siirto voi alkaa.
5.\ Kun TLS-liike on valmis, takaisinsoitusta kutsutaan DataTransferFacade::Impl::onConnectionRequestReply
, ja OutgoingFileTransfer
yhdistetään PeerConnection
sisäänkäyntiksi. Tämä OutgoingFileTransfer
sisältää luettelon SubOutgoingFileTransfer
(yhdestä laitteesta) jossa jokainen alasiirto on siirto yhdelle laitteelle.
6. SubOutgoingFileTransfer
siirtää ensin tiedoston otsikon, odottaa vertaisopimus (Sähköllä oleva ”GO\n” viesti) ja lähettää sitten tiedoston.
7. Jos pari- tai asiakas vastaanottaa peruutuksen tai jos tiedostojen siirto päättyy, yhteys suljetaan DhtPeerConnector::eventLoop()
-viestien kautta ja resurssit vapautetaan.
! [TLSsocketEndpoint](kuvia/tiedostojen siirto-tlssocketendpoint-diagram.png)
Saadaan tiedosto
Tiedostojen vastaanottamiseen käytetään samaa rakenteetta, mutta menetelmä muuttuu hieman:
JamiAccount
luokka käytetään DHT:n viestejen vastaanottamiseen, koska ensimmäinen vastaanotettu asia on DHT-pyyntö.Tämän jälkeen tämä viesti toimitetaan
DhtPeerConnector:onRequestMessage()
tapahtuma-lähtöllä.DhtPeerConnector::Impl::answerToRequest
yrittää yhdistyä TURN-palvelimelle (jos ei ole yhteydessä) ja käynnistää ICE-kuljetuksen. Tämä menetelmä avaa 2 ohjausyhteyttä TURN-palvelimelle (yhdinen IPv4-verkkotyypille, toinen IPv6-verkkotyypille, RFC 6156) jos se ei ole jo auki ja salli verkkotyyppien julkisten osoitteiden yhteyden. Sitten, jos vastaanotettu SDP ei sisällä ICE-ehdokastajia, käyttää TURN:tä ja suunnittelee SDP-vastauksen, jotta se odottaa verkkotyypää. Jos SDP sisältää ICE-ehdokastajia, menetelmä yrittää neuvotella linkin (tai pudottaa TURN:tä) ja vasta sitten SDP:lle (ICE-ehdokastajien kanssa tai ei).Kun linkit ovat valmiita, kuten lähettäjä, TLS-linkki neuvotellaan ja annetaan
PeerConnection
, joka annetaanIncomingFileTransfer
sisäänpääsyä.
Pyydä uudelleen aiempaa tiedostojen siirtoa
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.
Tätä varten laite lähettää json: mime-tyyppinen json: application/data-transfer-request+json
, joka sisältää conversation
(talkinnan tunnus), interaction
(yhteenliittynyt vuorovaikutus), deviceId
tiedostoon vastaanottavan laitteen.
Lähettäjä tarkistaa nyt, onko laite ilmoitetun vertaisen laite ja onko laite keskustelun jäsen ja voi lähettää tiedoston klassisen tiedoston siirron kautta.
vastaanottaja voi nyt hyväksyä ensimmäisen tulonsiirron, ladata tiedosto ja tarkistaa, että sha3sum on oikea.
Skeema
! [Kirjoitus: pääskema-kirjoitus]
SDP lähetettiin DHT:n kautta
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
Jos 0d04b932
on ufrag ja 7c33834e7cf944bf0e367b47
ICE-istunnossa oleva salasana. 2130706431
ja 1694498815
ovat ehdokkaiden ensisijainen tehtävä. 192.168.0.126 42751 tyyppi isäntä tcptype passiivinen
on passiivinen isäntäkandidaatti ja 1694498815 X.X.X.X 42751 typ srflx tcptype passiivinen
passiivinen isäntä, joka heijastaa julkista ip-kääntöä (esimerkiksi UPnP:n kautta kartoitettu).
Monenlaiset laitteet
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.
Ensimmäinen lähestymistapa
Ensimmäinen lähestymistapa oli lähettää pyyntö DHT:n kautta kaikille laitteille ja ensimmäiset laitteet, jotka vastaavat saavat tiedoston siirretyksi. Tämä on huonoa yhteyteen, koska he eivät tiedä, mikä laite vastaanottaa saa siirron.
Nykyinen lähestymistapa
Nyt lähetämme edelleen pyynnön kaikille laitteille. Erotuksena on, että kaikilla laitteilla on tiedonanto tiedoston vastaanottamisesta ja ne voivat hyväksyä/ kieltäytyä siirrosta.
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.
data_transfer.cpp -luokassa määritellään OptimisticMetaOutgoingInfo -luokka, joka edustaa asiakkaalle esitettävää optimistista näkymistä. Se on optimistista, koska jos yhteys hyväksyy siirron yhdellä laitteella ja kieltäytyy muista, tämä luokka näyttää jatkuvan tiedostojen siirron.
Tämä luokka on sidottu * SubOutgoingFileTransfer* -järjestelmään, jotka edustavat yhden laitteen siirron tilaa. Asiakkailla on mahdollisuus näyttää jälkikäteen optimistiikkainen siirto (ks. TODO-luettelo).
Käyttämällä toista TURN-palvelimen
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 käyttäjä: salasana -r "realm"
Then, you can configure the TURN server in the advanced settings of the app.
Huomautus: tämä vaatii tiettyjä teknisiä tietoja. Lisäksi TURN-palvelimella pitäisi nähdä sama yhteys, kun kohde-yhteys epäonnistuu (sillä valtuutus on virheellinen)
Koko lista
Use libtorrent?
Näytä ulottuvien tiedostojen alisiirtojen tila