文件转移
THIS PAGE IS DEPRECATED: READ File transfer
如何使用它?
动态系统
在安卓上与某人交谈时,您可以通过这些按发送照片或拍照:
对于安卓文件的使用者,请联系我们.
您需要注意:当您发送文件时,另一个必须接受它.
对于这些问题,我们需要注意:
怎么办?
如何运行
引言
贾米是一个分布式应用程序,并且必须没有任何互联网连接.所以,文件传输也是如此!基本上,我们使用相同的方法来执行文件传输和通话,但在TCP中.要总结它如何工作,我们可以想象一个情况,Alice (A) 想将文件传输给Bob (B).
首先,爱丽丝将请求与爱丽丝联系.为了做到这一点,贾米正在使用ICE (RFC 6544),用于谈判同行之间的链接的协议.爱丽丝将通过DHT发送其设备的IP,进入一个加密包.所以,当爱丽丝的IP得到时,他们将能够谈判运输,在那里,Bob将能够发送包给爱丽丝.谈判可以成功,但如果失败,将使用TURN服务器 (一个配置到设置中) 来执行转移.如果谈判成功,Bob将将其ip发送给爱丽丝进行谈判.注意,链接仍然没有发送,所以Bob将通过DHT在加密消息中安全发送IP.如果第二次谈判失败,TURN将被用来作为倒退.
现在,双向TCP链接已经到达,下一步将是在Alice和Bob之间谈判一个TLS 1.3 (通常是 (TLS1.3) - ((DHE-FFDHE8192) - ((RSA-PSS-RSAE-SHA384) - ((AES-256-GCM) 当我写这些行) 然后Alice将开始传输文件.
首先,将是一个小标题描述文件内容.
过程
发送文件
使用以下方法:
1. 客户端将调用 DataTransferFacade::sendFile()
. DataTransferFacade
是对客户所暴露的API相应的类. 它用于管理文件转移的视图 (相应类别是 DataTransfer
, IncomingFileTransfer
, OutgoingFileTransfer
和 SubOutgoingFileTransfer
). 这种方法将要求链接的 JamiAccount
请求连接.
图片/文件转移-数据转移-类图.png)
2. DhtPeerConnector: requestConnection()
方法被触发,并创建了同行所有连接设备之间的连接 (在DHT上找到). DhtPeerConnector
用于管理管理连接的主要事件循环. 当发现设备时, 事件循环将创建一个 ClientConnector
(管理一个设备的连接) 并启动 过程)
方法.
3. 这种方法用于启动ICE运输,将一个PeerConnectionMsg (包含SDP消息,请参见下面) 放到DHT上,等待响应 (DhtPeerConnector::Impl::onResponseMsg
).
4. 然后从DHT收到一个响应,该 DHT包含同行设备的公共地址.我们现在可以通过TLS链接进行谈判 (直接通过ICE,或通过TURN作为反弹).这个TlsSocketEndpoint将作为输出给了
PeerConnection`对象,转移就可以开始.
5.\ 当TLS插座准备好时,调用回调 DataTransferFacade::Impl::onConnectionRequestReply
,并将一个 OutgoingFileTransfer
连接到 PeerConnection
作为输入.这个 OutgoingFileTransfer
包含一个列表的 SubOutgoingFileTransfer
(每个设备一个) 每次子传输是传输到一个设备.我们这样做是为了提供最乐观的传输视图 (如果一个联系方式为3个设备,则联系方式在一个设备上取消传输,但接受了传输在两个其他设备上,将显示最先进的传输).
6. SubOutgoingFileTransfer
首先将文件的标题转移,等待同行接受 (插座上”GO\n”消息),然后将文件发送.
7. 如果同行或客户收到取消或文件转移完成,则通过在”同行连接器::eventLoop() 上的
CANCEL`消息将关闭连接,资源将释放.
图片/文件转移-tlssocketendpoint-diagram.png)
收到文件
文件接收的结构相同,但方法有所改变:
JamiAccount
类用于接收DHT的消息,因为首先接收的是DHT请求.然后,通过事件Loop,将此消息传递给”PeerConnector:onRequestMessage() `.
DhtPeerConnector::Impl::answerToRequest
将尝试连接到TURN服务器 (如果没有连接) 并启动ICE运输.该方法将向TURN服务器开放2个控制连接 (一个用于授权IPv4同行,另一个用于IPv6同行,由于RFC 6156) 如果它还没有开放并允许Peer公开地址连接.然后,如果收到的SDP不包含ICE候选人,将使用TURN并构建SDP答案等同行.如果SDP包含ICE候选人,该方法将试图谈判链接 (或退出TURN) 然后回答SDP (与ICE候选人或不).一旦链接准备好,就像发送者一样,一个TLS链接会进行谈判,并给给了
PeerConnection
给了IncomingFileTransfer
作为输入.文件的头条将出现,客户端现在可以接受或取消转移.
重新请求之前的文件转移
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.
为此,设备将发送一个 mime类型的 json: 应用程序/数据传输请求+json
包含 对话
(对话 id), 相互作用
(相关互动), 设备Id
接收文件的设备.
发送者现在检查设备是否来自公布的同行设备,设备是否是对话的成员,并且可以通过经典文件传输发送文件.
接收器现在可以接受第一个接入传输,下载文件,并验证sha3sum是正确的.
方案
图片/文件转移-主图图.png)
通过DHT发送SDP
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
是ICE会议的密码. 2130706431
和 1694498815
是候选人的优先事项. 192.168.0.126 42751型主机 tcptype被动
是被动主机候选人,而 1694498815 X.X.X.X 42751型 srflx tcptype被动
是反映公共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向所有设备发送请求,然后答复的第一个设备将传输文件. 这对你的联系人不利,因为他们不会知道哪个设备将接收将获得传输.
目前的方法
现在,我们仍然向所有设备发送请求. 区别是所有设备都会收到文件的通知,并且可以接受/拒绝传输.
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 类,这些类型代表客户端显示的乐观视图.它是乐观的,因为如果一个联系人接受一个设备上的传输,而拒绝其他设备,这个类别将显示正在进行的文件传输.并且它只会显示错误,如果所有设备拒绝传输.
这个类别与 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服务器应该看到您的节点的 IP 地址,因为目的节点或同行连接将失败 (因为授权将是不正确的)
整体清单
Use libtorrent?
显示出发文件的子转移状态