ファイル転送

このページは削除されています:読みなさい 開発者/集群:ファイル転送

どうやって使うか?

Android

Androidで誰かと話しているとき,デバイスに写真を送信したり,

ダウンロード/アップলোড/d68472b2c2c7bfcc616b0c674c9c7a8fed/Android_file_buttons.png)

ファイルを送信すると,相手はそれを受け入れなければならない. この時点で"等しい同級者"が表示されます.

オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・オンライン・ オンライン・オンライン・オンライン・ オンライン・オンライン・オンライン・ オンライン・ オンライン・ オンライン・オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・ オンライン・・・・・・ オンライン・ オンライン・・・・ オンライン・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

どうなるの?

機能する仕組み

紹介

ファイル転送も同様です.基本的に,ファイル転送と通話を行うのに同じ方法を使用しますが,TCPではです.どのように機能するかをまとめると,アリス (A) がボブ (B) にファイル転送したいという状況を想像できます.

アリスは,最初にボブに接続を要請する.そのために,ジャミは同級者の間のリンクを交渉するために使用されるプロトコルであるICE (RFC 6544) を使用している.アリスは,DHTを通じて暗号化されたパケットにデバイスのIPを送信する.したがって,ボブがアリスのIPを受け取ると,彼らはボブがアリスに送信できる輸送を交渉することができる.交渉は成功する可能性があります.しかし,失敗した場合,転送を行うためにTURNサーバ (設定に設定されたもの) が使用される.交渉が成功した場合,ボブは他の方向で交渉を行うためにiPSをアリスに送信します.リンクはまだ送信されていないことに注意してください,したがってボブは暗号化されたメッセージでDHTを通じてiPSを安全に送信します.第2回の交渉が失敗した場合,TURNは後退として使用されます.

この2方向の TCP リンクがここにあるので 次のステップは,Alice と Bob の間で TLS 1.3 (通常は (TLS1.3) - (DHE-FFDHE8192) - (RSA-PSS-RSAE-SHA384) - (AES-256-GCM) を交渉することになります.

ファイル内容を記述する小さなヘッダーが最初の部分になります. ボブが転送を承認した後,ファイル全体が送信されます.

プロセス

ファイルを送信する

次の方法を使用します.

1. クライアントは, DataTransferFacade::sendFile() . DataTransferFacadeは,クライアントに暴露されたAPIに対応するクラスです. ファイル転送のビューを管理するために使用されます (対応するクラスは, DataTransfer, IncomingFileTransfer, OutgoingFileTransfer, SubOutgoingFileTransfer). この方法は,リンクされた JamiAccount`を接続を要求します.

画像/ファイル転送-データ転送-クラス図.png)

2.メソッド DhtPeerConnector: requestConnection() が起動され,ピアのすべての接続されたデバイス (DHTで見つかった) の間で接続を作成します. DhtPeerConnectorは接続を管理するメインイベントループに使用されます.デバイスが見つかったとき, *イベントループ*は, ClientConnector(一つのデバイスの接続を管理する) を作成し,プロセス) `メソッドを起動します.

3.この方法は,ICE輸送を初期化し,DHTにPeerConnectionMsg* (以下 SDPメッセージを含む) を入れて応答を待つ (DhtPeerConnector::Impl::onResponseMsg).

4. DHTから応答が受信され,ペアデバイスの公開アドレスが含まれます.現在,TLSリンクを交渉することができます (直接ICE,またはTURNを通じてバックバックとして).この TlsSocketEndpointは,出力として `PeerConnection オブジェクトに与え,転送が開始できます.

5.\ TLSソケットが準備ができると,コールバック DataTransferFacade::Impl::onConnectionRequestReplyを呼び出し,入力として OutgoingFileTransferPeerConnectionにリンクします.この OutgoingFileTransferには,各サブ転送が1デバイスへの転送である (各デバイスごとに1個) のリストが含まれます.我々は,転送の最も楽観的な見方を提供できるようにします (もし3デバイスとして連絡が1デバイスで転送をキャンセルし,他の2デバイスで転送を承認した場合は,最も高度な転送が表示されます).

SubOutgoingFileTransfer は,まずファイルのヘッダを転送し,ピア・受け入れを待つ (ソケットに"GO\n"メッセージ) を送信します.

7. ピアまたはクライアントからキャンセルが受信された場合,またはファイル転送が終了した場合, DhtPeerConnector::eventLoop() のメッセージを通じて接続が終了し,リソースが解放されます.

画像/ファイル転送-tlssocketendpoint-diagram.png)

ファイルを受け取る

ファイルを受け取るのに同じ構造が使用されますが,方法は少し変わります.

  1. JamiAccount クラスで DHTからのメッセージが受信されます.最初に受信されるものは DHT 要求です.

  2. DhtPeerConnector: onRequestMessage() にこのメッセージが送られます.

  3. DhtPeerConnector::Impl::answerToRequestは,TURNサーバーに接続し,ICE輸送を初期化します.この方法は,TURNサーバーに2つの制御接続を開きます. (RFC 6156によるIPv6ピアへのアクセス) がまだ開いていない場合,Peeer公開アドレスが接続できます.その後,受信されたSDPにはICE候補者が含まれていない場合,TURNを使用して,SDPの答えを作成してピアを待つ.SDPにはICE候補者が含まれている場合,この方法はリンクを交渉し,SDPに返信します (またはICE候補者または否).

  4. リンクが準備ができると,送信者のように TLS リンクが交渉され, PeerConnection に入力として IncomingFileTransfer に与えられます.ファイルのヘッダが来られ,クライアントは転送を承認またはキャンセルすることができます.

ファイル転送を再申請する

developer/swarm:Other mime typesで指定されているように,データ転送相互作用は,現在同期され,会話に保存されます.したがって,デバイスはファイルがダウンロードされたかどうかを容易に検出できます.そうでない場合,会話中のすべてのメンバーにファイルを再び送信するよう要求できます.

このために,デバイスは,mime型の json を送信します: アプリケーション/データ転送要求+json ヽ (会話 id) を含む, インタラクション (関連インタラクション), デバイスId ファイルを受け取るデバイス.

送信者は,デバイスが発表されたピアからのデバイスであり,デバイスが会話のメンバーであることを確認し,従来のファイル転送を通じてファイルを送信することができます.

受信者は最初の受信転送を受け取り,ファイルをダウンロードして sha3sumが正しいかどうかを確認できます.

計画

図書:主図図

SDPは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は,ufragと 7c33834e7cf944bf0e367b47のICEセッションのパスワードである. 21307064311694498815は,候補者の優先事項である. 192.168.0.126 42751型ホスト tcptype pasiveは,被動ホスト候補であり, 1694498815 X.X.X.X 42751型 srflx tcptype pasiveは,公共 ip を反映する被動ホストである (例えば UPnP を介して地図化されている).

多重装置

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.

最初のアプローチ

最初のアプローチは,DHTを通じてすべてのデバイスに要求を送信し,応答する最初のデバイスはファイル転送をします.これはあなたの連絡先にとって悪い,なぜならどのデバイスが受信するか,転送を受け取るかわからないからです.

現在のアプローチ

ファイルを受け取る通知がすべてのデバイスに与えられ,転送を受け入れ/拒否することができます.そのコードの主要な部分は 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.

data_transfer.cpp では,クライアントに表示される楽観的なビューを表す OptimisticMetaOutgoingInfo クラスを定義します. それは楽観的なものです. 連絡先が1つのデバイスで転送を承認し,他のデバイスで拒否した場合,このクラスは進行中のファイル転送を表示します. そしてすべてのデバイスが転送を拒否した場合のみエラーを表示します.

このクラスは,一つのデバイスで転送の状態を表す SubOutgoingFileTransfer にリンクされています.クライアントは,後で楽観的な代わりにサブ転送を表示することができます (TODOリストを参照).

別のTURNサーバを使用する

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ターンサーバー -a -v -n -u ユーザー:パスワード -r "領域"

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

注:これは技術的な知識が必要である.さらに,TURNサーバーは目的 node またはピア接続が失敗する node の IP アドレスと同じ IP アドレスを見なければならない (権限が不正なため)

TODOリスト

  1. Use libtorrent?

  2. 出発ファイルへのサブ転送状態を表示