Chuyển tập tin
THIS PAGE IS DEPRECATED: READ File transfer
Làm thế nào để sử dụng nó?
Android
Khi bạn đang nói chuyện với ai đó trên Android, bạn có khả năng gửi một bức ảnh trên thiết bị của mình hoặc chụp ảnh với các nút này:
Lưu ý: khi bạn gửi một tập tin, người khác phải chấp nhận nó.
Làm thế nào nó hoạt động?
Làm thế nào nó hoạt động
Khởi đầu
Jami là một ứng dụng phân tán và phải hoạt động mà không cần kết nối internet. Vì vậy, chuyển tập tin cũng vậy! Về cơ bản, chúng tôi sử dụng cùng một phương pháp để thực hiện chuyển tập tin và cuộc gọi, nhưng trong TCP. Để tóm tắt cách nó hoạt động, chúng tôi có thể tưởng tượng một tình huống mà Alice (A) muốn chuyển tập tin đến Bob (B).
Trước tiên, Alice sẽ yêu cầu kết nối với Bob. Để làm điều đó, Jami đang sử dụng ICE (RFC 6544), một giao thức được sử dụng để đàm phán liên kết giữa các đồng nghiệp. Alice sẽ gửi, vào một gói mã hóa thông qua DHT IP của thiết bị của mình. Vì vậy, khi Bob nhận được các ips của Alice, họ sẽ có thể đàm phán một vận chuyển nơi Bob sẽ có thể gửi các gói cho Alice.
Bây giờ khi liên kết TCP hai chiều ở đây, bước tiếp theo sẽ là đàm phán một TLS 1.3 (thường là (TLS1.3) - DHE-FFDHE8192) - RSA-PSS-RSAE-SHA384) - AES-256-GCM khi tôi viết những dòng này) giữa Alice và Bob, sau đó Alice sẽ bắt đầu chuyển tập tin.
Phần đầu tiên sẽ là một tiêu đề nhỏ để mô tả nội dung của tệp.
Quá trình
Gửi tập tin
Phương pháp sau đây được sử dụng:
1. Một khách hàng sẽ gọi DataTransferFacade::sendFile()
. DataTransferFacade
là lớp tương ứng với API được phơi bày cho khách hàng. Nó được sử dụng để quản lý một dạng xem chuyển giao tệp (bản ứng lớp là DataTransfer
, IncomingFileTransfer
, OutgoingFileTransfer
và SubOutgoingFileTransfer
).
![Chương trình: Chương trình lớp chuyển dữ liệu]photos/file-transfer-dataatransfer-class-chương trình.png)
2. Phương pháp DhtPeerConnector: requestConnection()
được kích hoạt và tạo ra kết nối giữa tất cả các thiết bị kết nối của peer (được tìm thấy trên DHT). DhtPeerConnector
được sử dụng để quản lý vòng lặp sự kiện chính quản lý các kết nối. Khi một thiết bị được tìm thấy, vòng lặp sự kiện * sẽ tạo ra một ClientConnector
(để quản lý kết nối cho một thiết bị) và khởi động phương pháp quy trình)
.
3. Phương pháp này được sử dụng để khởi động vận chuyển ICE và đặt một PeerConnectionMsg (có chứa thông điệp SDP, xem bên dưới) trên DHT và chờ đợi một phản ứng (DhtPeerConnector::Impl::onResponseMsg
).
4. Sau đó, một phản hồi được nhận từ DHT, chứa địa chỉ công cộng của thiết bị đồng cấp. Bây giờ chúng ta có thể đàm phán một liên kết TLS (thương trực qua ICE, hoặc qua TURN như một sự trở lại).
Khi ổ cắm TLS sẵn sàng, callback DataTransferFacade::Impl::onConnectionRequestReply
được gọi, và một OutgoingFileTransfer
được liên kết với PeerConnection
như là đầu vào. OutgoingFileTransfer
này chứa một danh sách SubOutgoingFileTransfer
(một trên mỗi thiết bị) nơi mỗi chuyển tiếp là một chuyển tiếp đến một thiết bị. Chúng tôi làm điều đó để có thể cung cấp cái nhìn lạc quan nhất về chuyển tiếp (nếu một liên lạc như 3 thiết bị, nơi liên lạc hủy chuyển tiếp trên một thiết bị, nhưng chấp nhận chuyển tiếp trên hai thiết bị khác, sẽ hiển thị chuyển tiếp tiên tiến nhất).
6. SubOutgoingFileTransfer
sẽ chuyển đầu của tệp, chờ nhận bằng cấp (Một thông điệp "GO\n" trên ổ cắm) và sau đó sẽ gửi tệp.
7. Nếu nhận được một hủy từ người đồng nghiệp hoặc khách hàng hoặc nếu chuyển giao tệp kết thúc, kết nối sẽ bị đóng qua một thông báo CANCEL
trên DhtPeerConnector::eventLoop()
và các tài nguyên sẽ được giải phóng.
Nhận một tập tin
Tương tự cấu trúc được sử dụng để nhận các tệp, nhưng phương pháp thay đổi một chút:
Hạng
JamiAccount
được sử dụng để nhận tin nhắn từ DHT, bởi vì điều đầu tiên được nhận là yêu cầu DHT.Sau đó, thông điệp này được gửi đến
DhtPeerConnector: onRequestMessage()
thông qua eventLoop.DhtPeerConnector::Impl::answerToRequest
sẽ cố gắng kết nối với máy chủ TURN (nếu không kết nối) và khởi tạo giao thông ICE. Phương pháp này sẽ mở 2 kết nối điều khiển với máy chủ TURN (một để ủy quyền cho các đồng nghiệp IPv4, một cho các đồng nghiệp IPv6, do RFC 6156) nếu nó chưa mở và cho phép địa chỉ công cộng của đồng nghiệp kết nối. Sau đó, nếu SDP nhận được không chứa các ứng viên ICE, sẽ sử dụng TURN và tạo câu trả lời SDP để chờ cho đồng nghiệp. Nếu SDP chứa các ứng viên ICE, phương pháp sẽ cố gắng đàm phán liên kết (hoặc quay lại trên TURN) và sau đó trả lời SDP (với các ứng viên ICE hoặc không).Khi các liên kết đã sẵn sàng, giống như người gửi, một liên kết TLS được đàm phán và được trao cho
PeerConnection
được trao choIncomingFileTransfer
như một đầu vào.
Cần lại chuyển giao tập tin trước đó
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.
Để làm điều này, thiết bị sẽ gửi một json với kiểu mime: application/data-transfer-request+json
chứa conversation
(id của cuộc trò chuyện), interaction
(interaction liên quan), deviceId
thiết bị nhận tệp.
Người gửi bây giờ kiểm tra xem thiết bị là một thiết bị từ người đồng nghiệp được công bố và thiết bị là một thành viên của cuộc trò chuyện, và có thể gửi tập tin thông qua một chuyển giao tập tin cổ điển.
Người nhận bây giờ có thể chấp nhận chuyển tiếp đầu tiên, tải xuống tệp và xác minh rằng số lượng sha3sum là chính xác.
Chương trình
! [Chương trình: sơ đồ chính](phần/phần chuyển-phần chuyển-chương trình chính.png)
SDP được gửi qua 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
Trong đó 0d04b932
là ufrag và 7c33834e7cf944bf0e367b47
mật khẩu của phiên ICE. 2130706431
và 1694498815
là ưu tiên của các ứng cử viên. 192.168.0.126 42751 host type tcptype passive
là ứng cử viên chủ động và 1694498815 X.X.X.X 42751 type srflx tcptype passive
là một host thụ động phản ánh IP công cộng (ví dụ: được lập bản đồ thông qua UPnP).
Các thiết bị đa dạng
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.
Cách tiếp cận đầu tiên
Cách tiếp cận đầu tiên là gửi yêu cầu thông qua DHT đến tất cả các thiết bị và các thiết bị đầu tiên trả lời nhận được tập tin để chuyển giao.
Phương pháp hiện tại
Bây giờ, chúng tôi vẫn gửi yêu cầu đến tất cả các thiết bị. Sự khác biệt là tất cả các thiết bị sẽ có thông báo nhận một tệp và có thể chấp nhận / từ chối chuyển giao. Phần lớn mã cho điều đó là trong 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.
Trong data_transfer.cpp chúng tôi xác định lớp OptimisticMetaOutgoingInfo đại diện cho quan điểm lạc quan để hiển thị cho khách hàng. Nó lạc quan bởi vì nếu một liên lạc chấp nhận chuyển giao trên một thiết bị và từ chối trên các thiết bị khác, lớp này sẽ hiển thị chuyển giao tập tin đang diễn ra. Và nó sẽ chỉ hiển thị lỗi nếu tất cả các thiết bị từ chối chuyển giao.
Các lớp này được liên kết với SubOutgoingFileTransfer đại diện cho trạng thái chuyển giao với một thiết bị. Khách hàng sẽ có khả năng hiển thị một chuyển giao phụ thay vì lạc quan sau đó (xem danh sách TODO).
Sử dụng máy chủ TURN khác
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 người dùng: mật khẩu -r "trung"
Then, you can configure the TURN server in the advanced settings of the app.
Lưu ý: điều này cần một số kiến thức kỹ thuật. Hơn nữa, máy chủ TURN nên thấy địa chỉ IP của nút của bạn giống như nút đích hoặc kết nối đồng cấp sẽ thất bại (vì ủy quyền sẽ không chính xác)
Danh sách TODO
Use libtorrent?
Hiển thị trạng thái chuyển nhượng phụ cho các tệp ra ngoài