Annotation of embedaddon/rsync/csprotocol.txt, revision 1.1.1.1

1.1       misho       1: This is kind of informal and may be wrong, but it helped me.  It's
                      2: basically a summary of clientserver.c and authenticate.c.
                      3: 
                      4:  -- Martin Pool <mbp@samba.org>
                      5: 
                      6: 
                      7: This is the protocol used for rsync --daemon; i.e. connections to port
                      8: 873 rather than invocations over a remote shell.
                      9: 
                     10: When the server accepts a connection, it prints a greeting
                     11: 
                     12:   @RSYNCD: <version>.<subprotocol>
                     13: 
                     14: where <version> is the numeric version (see PROTOCOL_VERSION in rsync.h)
                     15: '.' is a literal period, and <subprotocol> is the numeric subprotocol
                     16: version (see SUBPROTOCOL_VERSION -- it will be 0 for final releases).
                     17: Protocols prior to 30 only output <version> alone.  The daemon expects
                     18: to see a similar greeting back from the client.  For protocols prior to
                     19: 30, an absent ".<subprotocol>" value is assumed to be 0.  For protocol
                     20: 30, an absent value is a fatal error.  The daemon then follows this line
                     21: with a free-format text message-of-the-day (if any is defined).
                     22: 
                     23: The server is now in the connected state.  The client can either send
                     24: the command
                     25: 
                     26:   #list
                     27: 
                     28: to get a listing of modules, or the name of a module.  After this, the
                     29: connection is now bound to a particular module.  Access per host for
                     30: this module is now checked, as is per-module connection limits.
                     31: 
                     32: If authentication is required to use this module, the server will say
                     33: 
                     34:   @RSYNCD: AUTHREQD <challenge>
                     35: 
                     36: where <challenge> is a random string of base64 characters.  The client
                     37: must respond with
                     38: 
                     39:   <user> <response>
                     40: 
                     41: where <user> is the username they claim to be, and <response> is the
                     42: base64 form of the MD4 hash of challenge+password.
                     43: 
                     44: At this point the server applies all remaining constraints before
                     45: handing control to the client, including switching uid/gid, setting up
                     46: include and exclude lists, moving to the root of the module, and doing
                     47: chroot.
                     48: 
                     49: If the login is acceptable, then the server will respond with
                     50: 
                     51:   @RSYNCD: OK
                     52: 
                     53: The client now writes some rsync options, as if it were remotely
                     54: executing the command.  The server parses these arguments as if it had
                     55: just been invoked with them, but they're added to the existing state.
                     56: So if the client specifies a list of files to be included or excluded,
                     57: they'll defer to existing limits specified in the server
                     58: configuration.
                     59: 
                     60: At this point the client and server both switch to using a
                     61: multiplexing layer across the socket.  The main point of this is to
                     62: allow the server to asynchronously pass errors back, while still
                     63: allowing streamed and pipelined data.
                     64: 
                     65: Unfortunately, the multiplex protocol is not used at every stage.  We
                     66: start up in plain socket mode and then change over by calling
                     67: io_start_buffering.  Of course both the client and the server have to
                     68: do this at the same point.
                     69: 
                     70: The server then talks to the client as normal across the socket,
                     71: passing checksums, file lists and so on.  For documentation of that,
                     72: stay tuned (or write it yourself!).
                     73: 
                     74: 
                     75: 
                     76: ------------
                     77: Protocol version changes
                     78: 
                     79: 30     (2007-10-04, 3.0.0pre1)
                     80: 
                     81:        The use of a ".<subprotocol>" number was added to
                     82:        @RSYNCD: <version>.<subprotocol>
                     83: 
                     84: 25     (2001-08-20, 2.4.7pre2) 
                     85: 
                     86:        Send an explicit "@RSYNC EXIT" command at the end of the
                     87:        module listing.  We never intentionally end the transmission
                     88:        by just closing the socket anymore.

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>