mirror of
https://github.com/RsyncProject/rsync.git
synced 2025-12-23 23:28:17 -05:00
111 lines
4.1 KiB
Plaintext
111 lines
4.1 KiB
Plaintext
This is kind of informal and may be wrong, but it helped me. It's
|
|
basically a summary of clientserver.c and authenticate.c.
|
|
|
|
-- Martin Pool <mbp@samba.org>
|
|
|
|
|
|
This is the protocol used for rsync --daemon; i.e. connections to port
|
|
873 rather than invocations over a remote shell.
|
|
|
|
When the server accepts a connection, it prints a newline-terminated
|
|
greeting line:
|
|
|
|
@RSYNCD: <version>.<subprotocol> <digest1> <digestN>
|
|
|
|
The <version> is the numeric version (see PROTOCOL_VERSION in rsync.h)
|
|
The <subprotocol> is the numeric subprotocol version (which is 0 for a
|
|
final protocol version, as the SUBPROTOCOL_VERSION define discusses).
|
|
The <digestN> names are the authentication digest algorithms that the
|
|
daemon supports, listed in order of preference.
|
|
|
|
An rsync prior to 3.2.7 omits the digest names. An rsync prior to 3.0.0
|
|
also omits the period and the <subprotocol> value. Since a final
|
|
protocol has a subprotocol value of 0, a missing subprotocol value is
|
|
assumed to be 0 for any protocol prior to 30. It is considered a fatal
|
|
error for protocol 30 and above to omit it. It is considered a fatal
|
|
error for protocol 32 and above to omit the digest name list (currently
|
|
31 is the newest protocol).
|
|
|
|
The daemon expects to see a similar greeting line back from the client.
|
|
Once received, the daemon follows the opening line with a free-format
|
|
text message-of-the-day (if any is defined).
|
|
|
|
The server is now in the connected state. The client can either send
|
|
the command:
|
|
|
|
#list
|
|
|
|
(to get a listing of modules) or the name of a module. After this, the
|
|
connection is now bound to a particular module. Access per host for
|
|
this module is now checked, as is per-module connection limits.
|
|
|
|
If authentication is required to use this module, the server will say:
|
|
|
|
@RSYNCD: AUTHREQD <challenge>
|
|
|
|
where <challenge> is a random string of base64 characters. The client
|
|
must respond with:
|
|
|
|
<user> <response>
|
|
|
|
The <user> is the username they claim to be. The <response> is the
|
|
base64 form of the digest hash of the challenge+password string. The
|
|
chosen digest method is the most preferred client method that is also in
|
|
the server's list. If no digest list was explicitly provided, the side
|
|
expecting a list assumes the other side provided either the single name
|
|
"md5" (for a negotiated protocol 30 or 31), or the single name "md4"
|
|
(for an older protocol).
|
|
|
|
At this point the server applies all remaining constraints before
|
|
handing control to the client, including switching uid/gid, setting up
|
|
include and exclude lists, moving to the root of the module, and doing
|
|
chroot.
|
|
|
|
If the login is acceptable, then the server will respond with
|
|
|
|
@RSYNCD: OK
|
|
|
|
The client now writes some rsync options, as if it were remotely
|
|
executing the command. The server parses these arguments as if it had
|
|
just been invoked with them, but they're added to the existing state.
|
|
So if the client specifies a list of files to be included or excluded,
|
|
they'll defer to existing limits specified in the server
|
|
configuration.
|
|
|
|
At this point the client and server both switch to using a
|
|
multiplexing layer across the socket. The main point of this is to
|
|
allow the server to asynchronously pass errors back, while still
|
|
allowing streamed and pipelined data.
|
|
|
|
Unfortunately, the multiplex protocol is not used at every stage. We
|
|
start up in plain socket mode and then change over by calling
|
|
io_start_buffering. Of course both the client and the server have to
|
|
do this at the same point.
|
|
|
|
The server then talks to the client as normal across the socket,
|
|
passing checksums, file lists and so on. For documentation of that,
|
|
stay tuned (or write it yourself!).
|
|
|
|
|
|
|
|
------------
|
|
Protocol version changes
|
|
|
|
31 (2013-09-28, 3.1.0)
|
|
|
|
Initial release of protocol 31 had no changes. Rsync 3.2.7
|
|
introduced the suffixed list of digest names on the greeting
|
|
line. The presence of the list is allowed even if the greeting
|
|
indicates an older protocol version number.
|
|
|
|
30 (2007-10-04, 3.0.0pre1)
|
|
|
|
The use of a ".<subprotocol>" number was added to
|
|
@RSYNCD: <version>.<subprotocol>
|
|
|
|
25 (2001-08-20, 2.4.7pre2)
|
|
|
|
Send an explicit "@RSYNC EXIT" command at the end of the
|
|
module listing. We never intentionally end the transmission
|
|
by just closing the socket anymore.
|