Zmodem
Zmodem
Zmodem
Chuck Forsberg
Chuck Forsberg
Omen Technology Inc
17505-V Northwest Sauvie Island Road
Portland Oregon 97231
Voice: 503-621-3406
Modem (Telegodzilla): 503-621-3746 Speed 1200,300
Compuserve: 70715,131
UUCP: ...!tektronix!reed!omen!caf
Chapter 0 rev051486 Printed 5-16-86 1
1. INTENDED AUDIENCE
2. ACKNOWLEDGMENTS
3. RELATED DOCUMENTS
The following files should be available for reference while studying this
document:
rz.c, sz.c, rbsb.c Unix source code for operating ZMODEM programs.
4. ROSETTA STONE
Here are some definitions which reflect the current vernacular in the
computer media. The attempt here is identify the file transfer protocol
rather than specific programs.
YMODEM refers to the XMODEM/CRC protocol with the throughput and/or batch
transmission enhancements described in YMODEM.DOC.
Since its development half a decade ago, the Ward Christensen MODEM
protocol has enabled a wide variety of computer systems to interchange
data. There is hardly a communications program that doesn't at least
claim to support this protocol, now called XMODEM.
+ The short block length causes throughput to suffer when used with
timesharing systems, packet switched networks, satellite circuits,
and buffered (error correcting) modems.
+ Only one file can be sent per command. The file name has to be given
twice, first to the sending program and then again to the receiving
program.
A number of other protocols have been developed over the years, but none
have displaced XMODEM to date.
+ Link level protocols such as X.25, X.PC, and MNP do not manage
application to application file transfers.
A number of extensions to the XMODEM protocol have been made under the
collective name YMODEM.
+ YMODEM-k uses 1024 byte blocks to reduce the overhead from transmission
delays by 87 per cent compared to XMODEM, but network delays can still
degrade performance. Some networks may not be transmit the 1024 byte
packets unmodified.
+ The handling of files that are not a multiple of 1024 or 128 bytes is
awkward, especially if the file length is not known, or changes during
transmission.
__________
+ File names need be entered only once, menu selections are possible.
+ Wild Card names may be used with batch transfers.
+ ZMODEM can step down to YMODEM if the other end does not support
ZMODEM.[1]
6.2 Throughput
ZMODEM is optimized for best throughput when line hits occur infrequently.
This assumption markedly reduces code complexity and memory requirements.
ZMODEM protocol features enhance rapid error recovery compared to network
compatible XMODEM implementations.
__________________________________________________________________________
All packets are protected with 16 bit CRC. Proprietary alogrithyms[2] are
not needed for reliable transfers.
+ Computers that cannot check the serial input queue for the presence of
data without having to wait for the data to arrive.
7. ZMODEM BASICS
__________
7.1 Packetization
Link Escape coding permits variable length data packets without the
overhead of a separate byte count. It allows the beginning of frames to
be detected without special timing techniques, facilitating rapid error
recovery.
Link Escape coding does add some overhead. The worst case, a file
consisting entirely of ZDLE characters, would incur a 50% overhead.
The value for ZDLE is octal 030 (ASCII CAN). This particular value was
chosen to allow a string of CAN characters to abort a ZMODEM session,
compatible with X/YMODEM session abort.
__________
1. This and other constants are defined in the zmodem.h include file.
Please note that constants with a leading 0 are octal constants in C.
The receiving program will decode any sequence of ZDLE followed by a byte
with bit 6 set and bit 5 reset (upper case letter, either parity) to the
equivalent control character by inverting bit 6. This allows the
transmitter to escape any control character that cannot be sent by the
communications medium. The ZMODEM software currently escapes ZDLE, 021,
0221, 023, and 0223. In addition, the receiver recognizes escapes for
0177 and 0377 should these characters need to be escaped.
All ZMODEM frames begin with a header packet which may be sent in binary
or HEX form. ZMODEM uses a single routine to recognize binary and hex
header packets. Either form of the header packet contains the same raw
information:
+ A type byte[2] Future extensions to ZMODEM may use the high order bits
of the type byte to indicate thread selection.
TYPE F3 F2 F1 F0
--------------
TYPE P0 P1 P2 P3
__________
A binary header packet begins with the sequence ZPAD, ZDLE, ZBIN.
A two byte CRC of the frame type and position/flag bytes is ZDLE encoded.
0 or more binary data packets will follow depending on the frame type.
The receiver sends responses in hex header packets. The sender also uses
hex header packets when they are not followed by binary data packets.
Hex encoding is required to support XON/XOFF flow control. The hex header
receiving routine ignores flow control characters.
Use of Kermit style encoding for control and paritied characters was
considered and rejected because of increased possibility of interacting
with some timesharing systems's line edit functions. Use of HEX packets
from the receiving program allows control characters to be used to
interrupt the sender when errors are detected. Except for header packet
types that imply data packets to follow, a HEX header packet may be used
in place of a binary header packet.
A hex header packet begins with the sequence ZPAD, ZPAD, ZDLE, ZHEX. The
zgethdr routine synchronizes in the ZPAD-ZDELE sequence. The extra ZPAD
allows other parts of the program to detect a ZMODEM packet and then call
zgethdr to receive the packet.
The type byte, the four position/flag bytes, and the CRC thereof are sent
in hex using the character set 01234567890abcdef. Upper case hex digits
are not allowed; they false trigger X/YMODEM programs.
A carriage return, line feed, and XON are appended to the HEX header
packet but are not considered to be part of it. The CR/LF aids debugging
from printouts. The XON releases the sender from spurious XOFF flow
control characters generated by line noise, a common occurrence.
0 or more ASCII Encoded data packets will follow depending on the frame
type.
(TYPE, F3...F0, CRC-1, and CRC-2 are each sent as two hex digits.)
No padding is used with binary data packets. The data bytes are ZDLE
encoded and transmitted. A ZDLE and frameend are then sent, followed by
two ZDLE encoded CRC bytes. The CRC accumulates the data bytes and
frameend.
The function zsbdata sends a binary data packet. The function zrbdata
receives a binary data packet.
The sending program sends the string "rz\r" to invoke the receiving
program from a possible command mode. The "rz" followed by carriage
return activates a ZMODEM receive program or command if it were not
already active.
__________
The sender may then display a message intended for human consumption, such
as a list of the files requested, etc.
Then the sender sends a ZRQINIT packet. The ZRQINIT packet causes a
previously started receive program to send its ZRINIT packet without
delay.
The sending program awaits a command from the receiving program to start
file transfers. If a "C", "G", or NAK is received, an XMODEM or YMODEM
file transfer is indicated, and file transfer(s) use the X/YMODEM
protocol. Note: With ZMODEM and YMODEM Batch, the sending program
provides the file name, but not with XMODEM.
The sender may then respond with an optional ZSINIT frame to set the
receiving program's Attention string. The receiver sends a ZACK packet in
response, containing the serial number of the receiving program, or 0.
The sender then sends a ZFILE header with ZMODEM Conversion, Management,
and Transport options[2] followed by a ZCRCW data packet containing the
file name, file length, modification date, and other information identical
to that used by YMODEM Batch.
The receiving program should insure the pathname and options are
compatible with its operating environment and local security requirements.
__________
If the receiver has a file with the same name and length,
it may respond with a ZCRC packet, which requires the
sender to permorm a 16 bit CRC on the file and transmit the
CRC in ZP0...ZP1 of a ZCRC packet. The receiver uses this
information to determine whether to accept the file or skip
it. This sequence is triggered by the ZMCRC Management
Option.
The receiver may then respond with a ZSKIP packet, which causes the
sender to process the next file (if any) in the batch.
A ZRPOS packet from the receiver initiates transmission of the file data
starting at the offset in the file specified in the ZRPOS packet.
Normally the receiver specifies the data transfer begin begin at offset 0
in the file.
The receiver may start the transfer further down in the
file. This allows a file transfer interrupted by a loss
or carrier or system crash to be completed on the next
connection without requiring the entire file to be
retransmitted.[3] If downloading a file from a timesharing
system that becomes sluggish, the transfer can be
interrupted and resumed later with no loss of data.
The sender sends a ZDATA binary header packet (with file position)
followed by one or more data packets.
The receiver compares the file position in the ZDATA header with the
number of characters successfully received to the file. If they do not
agree, a ZRPOS error response is generated to force the sender to the
right position within the file.[4]
A data packet terminated by ZCRCGO and CRC does not elicit a response
unless an error is detected; more data packet(s) follow immediately.
ZCRCW data packets expect a response before the next frame is sent. If
the receiver does not indicate overlapped I/O capability with the
__________
CANOVIO bit, or by setting a buffer size, the sender uses the ZCRCW to
allow the receiver to write its buffer before sending more data.
The sender sends a ZEOF packet with the file ending offset equal to
the number of characters in the file. The receiver compares this
number with the number of characters received. If the receiver has
received all of the file, it closes the file. If the file close was
satisfactory, the receiver responds with ZRINIT. If the receiver has
not received all the bytes of the file, the receiver sends ZRPOS with
the current file offset, forcing the sender to resend the missing
data. (If the receiver cannot properly close the file, a ZFERR packet
is sent.)
The sender closes the session with a ZEXIT header packet. The
receiver acknowledges this with its own ZEXIT packet.
If the computers can overlap serial I/O with disk I/O, and if the
sender can sample the reverse channel for the presence of data
without having to wait, full streaming can be used with no Attn
sequence required. The sender begins data transmission with a ZDATA
header and continuous ZCRCG data packets. When the receiver detects
an error, it executes the Attn sequence and then sends a ZRPOS packet
to force the sender back to the correct position within the file. At
the end of each transmitted packet, the sender checks for the
presence of an error packet from the receiver. To do this, the
sender may sample the reverse data stream for the presence of a ZPAD
character.
Such a program would sample the reverse channel for ZPAD. If seen,
an empty ZCRCW data packet is sent (in case the receiver was still
reading packets) and then the receiver's response packet is read and
acted upon. The code fragment in sz.c beginning at NOTDEF_DOS would
perform this function.
The method above cannot be used if if the reverse data stream cannot
be sampled without entering an I/O wait. An alternate method is to
instruct the receiver to interrupt the sending program when an error
is detected.
The receiver can interrupt the sender with a control character, break
signal, or combination thereof, as specified in the ZSINIT frame sent
by the sending program.
9.4 No Streaming
If the receiver cannot overlap serial and disk I/O, it uses the
ZRINIT frame to specify a buffer length which the sender will not
overflow. The sending program sends a ZCRCW packet and waits for an
ZACK packet before sending the next segment of the file.
The default Attn string value is empty (no Attn sequence). The
receiving program resets Attn to the empty default before each
transfer session.
The sender speficies the Attn sequence in its optional ZSINIT frame.
The Attn string is terminated with a null.
The numeric values for the values shown in boldface are given in
zmodem.h.
11.1 ZRQINIT
11.2 ZRINIT
Sent by the receiving program. ZF0 and ZF1 contain the bitwise or
of the receiver capability flags:
#define CANFDX 1 /* Rx can send and receive FDX */
#define CANOVIO 2 /* Rx can receive during disk I/O */
#define CANBRK 4 /* Rx can send a break signal */
#define CANCRY 8 /* Receiver can decrypt */
ZP0 and ZP1 contain the size of the receiver's buffer in bytes, or 0
if nonstop I/O is allowed.
11.3 ZSINIT
11.4 ZACK
11.5 ZFILE
A ZCRCW data packet follows with file name, file length, modification
date, and other information described in a later chapter.
11.6 ZSKIP
11.7 ZNAK
11.8 ZABORT
11.9 ZFIN
11.10 ZRPOS
11.11 ZDATA
11.12 ZEOF
11.13 ZFERR
11.14 ZCRC
Request (receiver) and response (sender) for file CRC. ZP0 and ZP1
contain 16 bit file CRC.
__________
11.15 ZCHALLENGE
11.16 ZCOMPL
11.17 ZCAN
11.18 ZFREECNT
11.19 ZCOMMAND
ZCOMMAND is only sent as a binary header packet. ZP0...ZP2 contain a
unique cardinal number to differentiate this command from other
commands[2]. ZF0 contains 0 or ZCACK1.
A ZCRCW data packet follows, with the ASCII text command string
terminated with a NULL character. If the command is intended to be
executed by the operating system hosting the receiving program (e.g.,
"shell escape"), it must have "!" as the first character. Otherwise
the command is meant to be executed by the application program which
received the command.
__________
2. Currently unused.
data.
"rz\r"
ZRQINIT(0)
ZRINIT
ZFILE
ZRPOS
ZDATA data ...
ZEOF
ZRINIT
ZFIN
ZFIN
OO
Sender Receiver
"rz\r"
ZRQINIT(ZCOMMAND)
ZCHALLENGE(rnd)
ZACK(same-rnd)
ZRINIT
ZCOMMAND
(Perform Command)
ZCOMPL
ZFIN
ZFIN
OO
ZMODEM sends the same file information with the ZFILE frame data that
YMODEM Batch sends in its block 0.
N.B.: Only the pathname (file name) part iss required for batch
transfers.
Pathname The pathname (conventionally, the file name) is sent as a
null terminated ASCII string. This is the filename format used
by the handle oriented MSDOS(TM) functions and C library fopen
functions. An assembly language example follows:
DB 'foo.bar',0
No spaces are included in the pathname. Normally only the file
name stem (no directory prefix) is transmitted unless the sender
has selected YAM's f option to send the full relative pathname.
The source drive designator (A:, B:, etc.) is not sent.
Filename Considerations:
Length The file length and each of the succeeding fields are
optional.[1] The length field is stored as a decimal string
counting the number of data bytes in the file.
With ZMODEM, the receiver uses the file length only for display
(progress reporting) purposes; the actual length is determined
__________
The mod date is optional, and the filename and length may be
sent without requiring the mod date to be sent.
The mod date is sent as an octal number giving the time the
contents of the file were last changed measured in seconds from
Jan 1 1970 Universal Coordinated Time (GMT). A date of 0
implies the modification date is unknown and should be left as
the date the file is received.
Mode A single space separates the file mode from the modification
date. The file mode is stored as an octal string. Unless the
file originated from a Unix system, the file mode is set to 0.
rb(1) checks the file mode for the 0x8000 bit which indicates a
Unix type regular file. Files with the 0x8000 bit set are
assumed to have been sent from another Unix (or similar) system
__________
which uses the same file conventions. Such files are not
translated in any way.
Serial Number A single space separates the serial number from the
file mode. The serial number of the transmitting program is
stored as an octal string. Programs which do not have a serial
number should omit this field, or set it to 0. The receiver's
use of this field is optional.
14.1 Throughput
During a file transfer, a short line hit seen by the receiver usually
induces a CRC error. The interrupt packet is usually seen by the
sender before the next packet is sent, and the resultant loss of data
throughput averages about half a packet. At 1200 bps this is would
be about .75 second lost per hit. At 10-5 error rate, this would
degrade throughput by about 9 per cent. The throughput degradation
increases with the channel delay, as the packets in transit through
the channel are discarded on error.
A longer noise burst that affects both the receiver and the sender's
reception of the interrupt packet usually causes the sender to remain
silent until the receiver times out in 10 seconds. If the round trip
channel delay exceeds the receiver's 10 second timeout, recovery from
Noise affecting only the sender is usually ignored, with one common
exception. Spurious XOFF characters generated by noise stop the
sender until the receiver times out and sends an interrupt packet
which concludes with an XON.
On Telenet, this can be met by setting CCIT X3 5:1 and 12:0 at both
ends of the network. For best throughput, parameter 64 (advance ACK)
should be set to something like 4. Packets should be sent when the
packet is a full 128 bytes, or after a moderate delay (3:0,4:10,6:0).
"Round Trip Delay Time" includes the time for the last byte in a
packet to propagate through the operating systems and network to the
receiver, plus the time for the receiver's response to that packet to
propogate back to the sender.
The figures shown below are calculated for round trip delay times of
40 milliseconds and 5 seconds. Shift registers in the two computers
and a pair of 212 modems generate a round trip delay time on the
order of 40 milliseconds. Operation with busy timesharing computers
and networks can easily generate round trip delays of five seconds.
Because the round trip delays cause visible interruptions of data
transfer when using XMODEM protocol, the subjective effect of these
delays is greatly exaggerated, especially when the user is paying for
connect time.
************************************************** XMODEM
************ YMODEM-K
********** SuperKermit (Sliding Windows)
******* YMODEM-G
******* ZMODEM
UUCP sites can obtain the nroff/troff source to this file with
uucp omen!/usr/caf/public/zmodem.mm /tmp
A continually updated list of available files is stored in
/usr/spool/uucppublic/FILES.
The following L.sys line calls site "omen" yia UUCP. Telegodzilla
uses Pro-YAM in host operation.
omen Any ACU 1200 1-503-621-3746 e:--e: link d: Giznoid n:--n: uucp
Irv Hoff has added YMODEM 1k packets and YMODEM batch transfers to
the KMD and IMP series programs, which replace the XMODEM and
MODEM7/MDM7xx series respectively. Overlays are available for a wide
variety of CP/M systems.
Many other programs, including MEX and MEX-PC also support some of
the YMODEM extensions.
Chuck Forsberg
Omen Technology Inc
17505-V Sauvie Island Road
Portland Oregon 97231
Voice: 503-621-3406
Modem (Telegodzilla): 503-621-3746
Usenet: ...!tektronix!reed!omen!caf
Compuserve: 70715,131
Source: TCE022
CONTENTS
1. INTENDED AUDIENCE................................................ 2
2. ACKNOWLEDGMENTS.................................................. 2
3. RELATED DOCUMENTS................................................ 2
4. ROSETTA STONE.................................................... 2
7. ZMODEM BASICS.................................................... 6
7.1 Packetization............................................. 7
7.2 Link Escape Encoding...................................... 7
7.3 Header Packet Information................................. 8
7.4 Binary Header Packet...................................... 9
7.5 HEX Header Packet......................................... 9
7.6 Binary Data Packets....................................... 10
7.7 ASCII Encoded Data Packet................................. 10
- i -
11.12 ZEOF...................................................... 18
11.13 ZFERR..................................................... 18
11.14 ZCRC...................................................... 18
11.15 ZCHALLENGE................................................ 19
11.16 ZCOMPL.................................................... 19
11.17 ZCAN...................................................... 19
11.18 ZFREECNT.................................................. 19
11.19 ZCOMMAND.................................................. 19
- ii -
LIST OF FIGURES
Chuck Forsberg
ABSTRACT