Dosya aktarımı

THIS PAGE IS DEPRECATED: READ File transfer

Nasıl kullanılır?

Android

Android’de biriyle konuşurken, cihazınıza bir resim gönderme veya fotoğraf çekme şansınız vardır:

! Android_file_button

Not: dosya gönderdiğinizde diğer dosya kabul edilmelidir.

! (Android_waiting_peer)

Nasıl çalışıyor? (teknik)

Nasıl işliyor?

Giriş

Jami dağıtılı bir uygulama ve herhangi bir internet bağlantısı olmadan çalışmak zorunda. Yani, dosya aktarımı da! Temelde, dosya aktarımı ve aramaları yapmak için aynı yöntemi kullanıyoruz, ancak TCP’de. Nasıl çalıştığını özetlemek için, Alice (A) bir dosyayı Bob (B) ‘e aktarmak istediği bir durumu düşünebiliriz.

İlk olarak Alice, Bob’a bir bağlantı talep edecek. Bunu yapmak için Jami, DHT üzerinden cihazının ip’ini şifrelenmiş bir paketine gönderecek. Böylece Bob’un Alice’in ip’lerini aldığında, Bob’un Alice’e paket gönderebileceği bir nakliye konusunda müzakere edebilecekler. müzakere başarılı olabilir, ancak başarısız olursa, transfer yapmak için TURN sunucusu (sağlamlıklara yapılandırılan) kullanılacak. Eğer müzakere başarılı olursa, Bob, diğer yönde müzakere yapmak için Alice’e ip’lerini gönderecektir.

Şimdi iki yönlü TCP bağlantısı burada, bir sonraki adım Alice ve Bob arasında TLS 1.3 (genellikle (TLS1.3)-(DHE-FFDHE8192)-(RSA-PSS-RSAE-SHA384)-(AES-256-GCM) bir anlaşma yapmak olacak.

İlk bölüm dosyanın içeriğini açıklayan küçük bir başlık olacak.

İşlem

Dosya göndermek

Aşağıdaki yöntem kullanılır:

1. Bir istemci DataTransferFacade::sendFile() . DataTransferFacade, istemciler için açılan API’ye karşılık gelen sınıftır. Dosya transferlerinin görünümünü yönetmek için kullanılır (ait sınıfları DataTransfer, IncomingFileTransfer, OutgoingFileTransfer ve SubOutgoingFileTransfer). Bu yöntem bağlantılı JamiAccount bağlantı istemek isteyecektir.

![Diagram: DataTransfer sınıfı diyagramı]images/file-transfer-datatransfer-class-diagram.png)

2. Metod DhtPeerConnector: requestConnection() tetiklenir ve peer’in tüm bağlantılı cihazları arasında bir bağlantı oluşturur (DHT’de bulunur). DhtPeerConnector bağlantıları yöneten ana olay döngüsünü yönetmek için kullanılır. Bir cihaz bulunduğunda event döngüsü ClientConnector (bir cihaz için bağlantıyı yöneten) oluşturur ve process) yöntemini başlatır.

3. Bu yöntem ICE nakliye işlemini başlatmak için kullanılır ve DHT’ye PeerConnectionMsg (daha aşağıda SDP mesajı bulunan) yerleştirilmektedir ve bir yanıt beklenmektedir (DhtPeerConnector::Impl::onResponseMsg).

4. DHT’den bir cevap alınıyor, bu da eş cihazının kamu adreslerini içerir. Artık TLS bağlantısı (doğrudan ICE üzerinden veya TURN üzerinden geri dönüş olarak) müzakere edebiliriz. Bu TlsSocketEndpoint PeerConnection nesneye çıkış olarak verilir ve aktarım başlanabilir.

5.\ TLS soketi hazır olduğunda, geri çağrı DataTransferFacade::Impl::onConnectionRequestReply çağrılır ve OutgoingFileTransfer giriş olarak PeerConnection ile bağlanır. Bu OutgoingFileTransfer SubOutgoingFileTransfer (her bir cihaz için bir tane) listesini içerir.

SubOutgoingFileTransfer önce dosyanın başlığını aktarır, eşlerin kabulünü bekler (socket’te “GO\n” mesajı) ve ardından dosyayı gönderir.

7. Eğer bir peer veya müşteri tarafından iptal edilirse veya dosya aktarımı sona erirse, DhtPeerConnector::eventLoop() ‘deki CANCEL mesajı ile bağlantı kapatılır ve kaynaklar serbest bırakılır.

! [TLSsocketEndpoint](resimler/file transfer-tlssocketendpoint-diagram.png)

Dosya alıyorum

Dosyaları almak için aynı yapı kullanılır, ancak yöntem biraz değişir:

  1. JamiAccount sınıfı DHT’den mesajlar almak için kullanılır, çünkü ilk alınan şey DHT talebi olacaktır.

  2. Sonra, bu mesaj DhtPeerConnector: onRequestMessage() tarafından etkinlikLoop üzerinden verilir.

  3. DhtPeerConnector::Impl::answerToRequest, TURN sunucusu ile bağlantı kurmaya çalışacak (ağrı bağlantı yoksa) ve ICE nakliyesi başlatılacak. Bu yöntem, bir TURN sunucusu ile 2 kontrol bağlantısı açacak (birisi IPv4 eşyalarını yetkilileştirmek için, birisi IPv6 eşyalarını için RFC 6156 nedeniyle) eğer henüz açılmamışsa ve Peer halk adreslerinin bağlantısını sağlamaya çalışacak.

  4. Bağlantılar hazır olduğunda, gönderen gibi, bir TLS bağlantısı müzakere edilir ve PeerConnection’e verilir.

Önceki dosya aktarımını yeniden iste

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.

Bu amaçla, cihaz mime tipi ile bir json gönderecektir: application/data transfer-request+json içerir conversation (sonuş id), interaction (aile ilişkili etkileşim), deviceId dosyayı alan cihaz.

Gönder, cihazın ilan edilen eşcinsinden bir cihaz olup olmadığını ve cihazın sohbetin bir üyesi olup olmadığını kontrol eder ve dosyayı klasik bir dosya aktarımı yoluyla gönderebilir.

Alıcı şimdi ilk gelen transferü kabul edebilir, dosyayı indirebilir ve sha3sum’un doğru olduğunu doğrulayabilir.

Şema

! [Şekil: ana şema şema](şekiller/ dosya aktarımı-başlı şema şema.png)

SDP DHT üzerinden gönderildi
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 ufrag ve 7c33834e7cf944bf0e367b47 ICE oturumunun şifresidir. 2130706431 ve 1694498815 adayların önceliği. 192.168.0.126 42751 tür ev sahibi tcptype pasif pasif tcptype pasif tcptype passiv tcptype passiv 1694498815 X.X.X.X 42751 tür srflx tcptype pasif kamu ip’ini yansıtan pasif bir ev sahibi (örneğin UPnP üzerinden haritalanmıştır).

Çoklu cihazlar

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.

İlk yaklaşım

İlk yaklaşım, DHT üzerinden tüm cihazlara bir talep göndermek ve cevap veren ilk cihazlar dosyayı aktarmak için göndermekti. Bu sizin bağlantınız için kötüdür çünkü hangi cihazın hangi cihazı alacağını bilmeyecek.

Güncel yaklaşım

Şimdi, hala tüm cihazlara bir talep gönderiyoruz. Fark şu ki tüm cihazlar bir dosya alma bildirimine sahip olacak ve aktarmayı kabul / reddedebilirler. Bunun için kodun büyük kısmı data_transfer.cpp’de.

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’de, müşteriye göstermek için iyimser görünümü temsil eden OptimisticMetaOutgoingInfo sınıfını tanımlıyoruz. Bu iyimser çünkü bir iletişim bir cihaza aktarım kabul eder ve diğerlerinde reddederse, bu sınıf devam eden dosya aktarımını gösterecektir. Ve tüm cihaza aktarımı reddederse sadece bir hata gösterecektir.

Bu sınıf, bir cihazla bir aktarımın durumunu temsil eden SubOutgoingFileTransfer ile bağlantılıdır. Müşteriler daha sonra bir alt aktarım yerine iyimser bir şekilde gösterebilecekler (TODO listesine bakın).

Başka bir TURN sunucusu kullanma

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 kullanıcı: parola -r “krallık”

Then, you can configure the TURN server in the advanced settings of the app.

Not: bunun için bazı teknik bilgiye ihtiyaç vardır. Üstelik, TURN sunucusu, hedef düğümün veya eş bağlantısının başarısız olduğu gibi düğümünüzün aynı IP adresini görmelidir (özgürlük yanlış olacaktır)

TODO Listesi

  1. Use libtorrent?

  2. Dışarı çıkan dosyalar için alt aktarım durumunu göster