Document the delta transmission protocol
This commit is contained in:
parent
2770a853f6
commit
a3370a1d18
@ -35,8 +35,8 @@ the command are dependent on the nature of the command.
|
|||||||
Let's look at some simple examples of sessions to get a feel for the protocol.
|
Let's look at some simple examples of sessions to get a feel for the protocol.
|
||||||
|
|
||||||
|
|
||||||
Sending files to the terminal emulator
|
Sending files to the computer running the terminal emulator
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
The client starts by sending a start send command::
|
The client starts by sending a start send command::
|
||||||
|
|
||||||
@ -111,8 +111,8 @@ such as::
|
|||||||
← action=status id=someid status=Some error occurred
|
← action=status id=someid status=Some error occurred
|
||||||
|
|
||||||
|
|
||||||
Receiving files to the terminal emulator
|
Receiving files from the computer running terminal emulator
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
The client starts by sending a start receive command::
|
The client starts by sending a start receive command::
|
||||||
|
|
||||||
@ -337,7 +337,79 @@ or absolute path when the target is a transmitted file.
|
|||||||
Transmitting binary deltas
|
Transmitting binary deltas
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
TODO:
|
Repeated transfer of large files that have only changed a little between
|
||||||
|
the receiving and sending side can be sped up significantly by transmitting
|
||||||
|
binary deltas of only the changed portions. This protocol has built-in support
|
||||||
|
for doing that. This support uses the `rsync algorithm
|
||||||
|
<https://github.com/librsync/librsync>`__. In this algorithm first the
|
||||||
|
receiving side sends a file signature that contains hashes of blocks
|
||||||
|
in the file. Then the sending side sends only those blocks that have changed.
|
||||||
|
The receiving side applies these deltas to the file to update it till it matches
|
||||||
|
the file on the sending side.
|
||||||
|
|
||||||
|
The modification to the basic protocol consists of setting the
|
||||||
|
``transmission_type`` key to ``rsync`` when requesting a file. This triggers
|
||||||
|
transmission of signatures and deltas instead of file data. The details are
|
||||||
|
different for sending and receiving.
|
||||||
|
|
||||||
|
Sending to the terminal emulator
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
When sending the metadata of the file it wants to transfer, the client adds the
|
||||||
|
``transmission_type`` key::
|
||||||
|
|
||||||
|
→ action=file id=someid file_id=f1 name=/path/to/destination transmission_type=rsync
|
||||||
|
|
||||||
|
The ``STARTED`` response from the terminal will have ``transmission_type`` set
|
||||||
|
to ``rsync`` if the file exists and the terminal is able to send signature data::
|
||||||
|
|
||||||
|
← action=status id=someid file_id=f1 status=STARTED transmission_type=rsync
|
||||||
|
|
||||||
|
The terminal then transmits the signature using ``data`` commands::
|
||||||
|
|
||||||
|
← action=data id=someid file_id=f1 data=...
|
||||||
|
...
|
||||||
|
← action=end_data id=someid file_id=f1 data=...
|
||||||
|
|
||||||
|
Once the client receives and processes the full signature, it transmits the
|
||||||
|
file delta to the terminal as ``data`` commands::
|
||||||
|
|
||||||
|
→ action=data id=someid file_id=f1 data=...
|
||||||
|
→ action=data id=someid file_id=f1 data=...
|
||||||
|
...
|
||||||
|
→ action=end_data id=someid file_id=f1 data=...
|
||||||
|
|
||||||
|
The terminal then uses this delta to update the file.
|
||||||
|
|
||||||
|
Receiving from the terminal emulator
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
When the client requests file data from the terminal emulator, it can
|
||||||
|
add the ``transmission_type=rsync`` key to indicate it will be sending
|
||||||
|
a signature for that file::
|
||||||
|
|
||||||
|
→ action=file id=someid file_id=f1 name=/some/path transmission_type=rsync
|
||||||
|
|
||||||
|
The client then sends the signature using ``data`` commands::
|
||||||
|
|
||||||
|
→ action=data id=someid file_id=f1 data=...
|
||||||
|
...
|
||||||
|
→ action=end_data id=someid file_id=f1 data=...
|
||||||
|
|
||||||
|
After receiving the signature the terminal replies with the delta as a series
|
||||||
|
of ``data`` commands::
|
||||||
|
|
||||||
|
← action=data id=someid file_id=f1 data=...
|
||||||
|
...
|
||||||
|
← action=end_data id=someid file_id=f1 data=...
|
||||||
|
|
||||||
|
The client then uses this delta to update the file.
|
||||||
|
|
||||||
|
The format of signatures and deltas
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
These come from `librsync <https://github.com/librsync/librsync>`__. If this
|
||||||
|
specification gains wider adoption, these formats should be documented here.
|
||||||
|
|
||||||
Compression
|
Compression
|
||||||
--------------
|
--------------
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user