🚅 FastCopy is a remote file copy program similar to scp. It uses concurrent transmission, so the speed is faster than scp.
MIT License
基于 SSH 协议的多线程文件传输工具。
目标是用来替换 scp
和 rsync
。
使用前须在 服务器 和 本地 同时安装本程序。
pip install fastcopy
服务器
运行前首先确保服务端的 7523 端口未被占用
fcpd -d
本地
下载
fcp user@host:/foo/bar ./
上传
fcp ./fake/file user@host:/foo/bar
所有数据包均采用大端字节序
flag | chksum | length | payload |
---|---|---|---|
1 Bytes | 4 Bytes | 2 Bytes | ... |
0x1
0x2
0x3
0x4
0x5
0x6
0x7
0x8
0x9
0xa
0xb
0xc
数据请求
连接建立后,客户端首先需要向服务器申请 拉取 或 推送,并将 目的路径 传给服务器
拉取、推送的标识由 flag
字段决定
方向: Client -> Server
Payload 格式为:
connection info |
---|
json string |
建立会话
服务器收到第一步的申请后,会产生一个 SessionID,并回传给客户端,客户端需要在自己本地保存
方向: Server -> Client
Payload 格式为:
session_id |
---|
16 Bytes |
后续连接
客户端后续与服务器建立的并发连接,第一个报文须告诉服务器 SessionID
方向: Client -> Server
Payload 格式为:
session_id |
---|
16 Bytes |
文件总量
连接就绪后,发送端需告知接收端文件总量
Payload 长度 4 字节,所以最大允许传输文件数量为 4,294,967,296
方向: Sender -> Receiver
Payload 格式:
n_files |
---|
4 Bytes |
文件信息
文件发送发需将每一个文件的信息告知接收端。 包括文件的编号、权限、大小、创建时间、修改时间、访问时间、校验和、路径。 其中路径为相对路径。
方向: Sender -> Receiver
Payload 格式:
file_id | perm | size | mtime | chksum | path |
---|---|---|---|---|---|
4 Bytes | 2 Bytes | 8 Bytes | 8 Bytes | 16 Bytes | ... |
接收端文件准备就绪
接收端收到文件信息后,需将文件信息记录起来,并在本地创建同样大小的空文件
方向: Receiver -> Sender
Payload 格式:
file_id |
---|
4 Bytes |
文件数据块传输报文
Chunk Sequence 占用 4 字节,所以支持的单个文件最大为: 4 GB * ChunkSize
方向: Sender -> Receiver
Payload 格式:
file_id | seq | data |
---|---|---|
4 Bytes | 4 Bytes | ... |
序号 | 客户端 | 服务器 |
---|---|---|
1 | 客户端启动 | 服务端启动 |
2 | 等待客户端连接 | |
3 | 发起连接请求 | |
4 | 接收客户端连接 | |
5 | 等待客户端请求 (请求超时则断开) | |
6 | 发送 PUSH 或 PULL 请求 |
|
7 | 产生 SessionID | |
8 | 将 SessionID 传回客户端 | |
9 | 接收 SessionID 并保存 | |
10 | 循环创建多个并行连接 | |
11 | 新连接携带 SessionID 逐一发送ATTACH 请求 |
|
12 | 确认 SessionID 无误 | |
13 | 将新连接添加至对应 Session 的连接池 |