1631 lines
62 KiB
Prolog
1631 lines
62 KiB
Prolog
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, Wxmodem
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
File Transfer Protocols
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Please circulate this document anyway that you see
|
|||
|
fit without alteration except on the page at the
|
|||
|
end titled: "Notes and Comments". It is requested
|
|||
|
that anyone using these protocols within a commer-
|
|||
|
cial product not charge for them as an option or
|
|||
|
surcharge, but include XMODEM and its derivations
|
|||
|
as part of the basic product.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Peter Boswell
|
|||
|
|
|||
|
June 20, 1986
|
|||
|
|
|||
|
People/Link email: TOPPER
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 2
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
TABLE OF CONTENTS
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
1. PREFACE . . . . . . . . . . . . . . . . . . . . . . . . . . 3
|
|||
|
|
|||
|
2. INTRODUCTION . . . . . . . . . . . . . . . . . . . . . . . . . 5
|
|||
|
|
|||
|
3. TERMINOLOGY . . . . . . . . . . . . . . . . . . . . . . . . . 6
|
|||
|
|
|||
|
4. XMODEM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
|
|||
|
|
|||
|
4.1. Xmodem Hardware Level Protocol . . . . . . . . . . . . . 7
|
|||
|
4.2. Xmodem Initiation . . . . . . . . . . . . . . . . . . . . 7
|
|||
|
4.3. Xmodem Data Transmission . . . . . . . . . . . . . . . . 8
|
|||
|
4.4. Xmodem Cancellation . . . . . . . . . . . . . . . . . . . 9
|
|||
|
4.5. Xmodem Error Recovery and Timing . . . . . . . . . . . . 9
|
|||
|
|
|||
|
5. CRC XMODEM . . . . . . . . . . . . . . . . . . . . . . . . . . 13
|
|||
|
|
|||
|
5.1. CRC Calculation Rules . . . . . . . . . . . . . . . . . . 13
|
|||
|
5.2. CRC Xmodem Initiation . . . . . . . . . . . . . . . . . . 14
|
|||
|
|
|||
|
|
|||
|
6. WINDOWED XMODEM (WXMODEM) . . . . . . . . . . . . . . . . . . 15
|
|||
|
|
|||
|
6.2. Transparency and Flow Control Rules (Byte Level Rules) . 16
|
|||
|
6.3. Initial Handshake Rules . . . . . . . . . . . . . . . . . 18
|
|||
|
6.4. Window Packet Transmission Rules . . . . . . . . . . . . 18
|
|||
|
6.5. Notes for X.25 Hosts . . . . . . . . . . . . . . . . . . 22
|
|||
|
|
|||
|
|
|||
|
7. APPENDIX A - CRC CALCULATION RULES . . . . . . . . . . . . . . 23
|
|||
|
|
|||
|
7.1. IBM PC - 8088/8086 Data Structure . . . . . . . . . . . . 23
|
|||
|
7.2. BASIC Implementation of Bit Shift Method . . . . . . . . 23
|
|||
|
7.3. BASIC Implementation of the Table Method . . . . . . . . 26
|
|||
|
|
|||
|
|
|||
|
|
|||
|
8. NOTES AND COMMENTS . . . . . . . . . . . . . . . . . . . . . . 28
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 3
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
1. PREFACE
|
|||
|
|
|||
|
|
|||
|
In the years that have past since Xmodem was first developed as a file
|
|||
|
transfer protocol, many thousands of people have been involved in
|
|||
|
finding reasonable ways to move data via asynchronous telephone commun-
|
|||
|
ications. I appreciate the opportunity that I have had to meet and
|
|||
|
learn from many of these people. There is nothing in this document
|
|||
|
that did not actually come from someone else. Indeed, whether it is
|
|||
|
WXMODEM, X.PC, Synchronous dial-up X.25, SNA, ZMODEM, Blast, Kermit or
|
|||
|
any other protocol that becomes the dominant dial-up file transfer
|
|||
|
protocol for personal and home computers is just not important. What
|
|||
|
is important is that the public domain have a high speed file transfer
|
|||
|
protocol that is reasonably popular and commonly available for many
|
|||
|
types of personal computers, for bulletin boards and for services such
|
|||
|
as People/Link, Delphi, CompuServe, GEnie and The Source.
|
|||
|
|
|||
|
Here are a few people that all of us should thank and I would espec-
|
|||
|
ially like to recognize:
|
|||
|
|
|||
|
Ward Christensen Ward, a true pioneer in the microcomputer
|
|||
|
communications area, is the author of the original Checksum
|
|||
|
Xmodem protocol. Thanks for reminding me to "keep it simple
|
|||
|
stupid".
|
|||
|
|
|||
|
Chuck Forsberg Chuck has edited perhaps the best work on
|
|||
|
Xmodem and has provided both YMODEM (1K Xmodem) and ZMODEM
|
|||
|
(Windowed YMODEM) to the public domain. Thanks for showing
|
|||
|
me a protocol which would deal with the X-On/X-Off problem
|
|||
|
and reminding me that there is such a thing as a DLE char-
|
|||
|
acter.
|
|||
|
|
|||
|
Richard (Scott) McGinnis Scott is the architect, the moving
|
|||
|
force, for the People/Link software system. His ideas,
|
|||
|
comments and encouragement have been wonderful. Wait until
|
|||
|
you see his visual conference program for the IBM PC!
|
|||
|
Thanks for showing me how to use a DLE.
|
|||
|
|
|||
|
Gene Plantz Gene operates a major IBM PC bulletin board in
|
|||
|
the Chicago area and has been active in the National SYSOP
|
|||
|
Association. Thanks for pushing me to do something about
|
|||
|
performance.
|
|||
|
|
|||
|
In a historical perspective, there seems to be a common pattern in all
|
|||
|
computer systems development that can shed some light on where we stand
|
|||
|
and how we got here. The pattern is function first, then integrity and
|
|||
|
finally performance.
|
|||
|
|
|||
|
Any kind of software must first do something worthwhile. There is no
|
|||
|
point in being error free, or inexpensive to operate if we do not want
|
|||
|
the function. Back in 1977, Ward Christensen had a need to move data
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 4
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
between microcomputers. Within a year it became obvious that the
|
|||
|
function Xmodem provided met a real need to many microcomputer users.
|
|||
|
|
|||
|
Once we have a new function and we accept it, there is a normal desire
|
|||
|
for the function to be correct. No one can't count the times that new
|
|||
|
software users have pointed out ... "that new function is super, but
|
|||
|
the results are wrong". The effort changes from providing new function
|
|||
|
to providing integrity. The development of CRC Xmodem is a clear
|
|||
|
response to the integrity phase of a service as it reduced undetected
|
|||
|
transmission errors by many orders of magnitude.
|
|||
|
|
|||
|
After the integrity has been accepted, people begin to look toward cost
|
|||
|
and performance. XMODEM entered this phase in 1984-1985. Chuck
|
|||
|
Forsberg's YMODEM is a major step in this effort providing larger
|
|||
|
block sizes, batch mode and more. His ZMODEM is a major step toward
|
|||
|
making XMODEM derivative protocols work effectively with Public Data
|
|||
|
Networks and most importantly, provides for restart of a file transfer
|
|||
|
at the point of failure. WXMODEM, presented here, is an alternate
|
|||
|
solution to ZMODEM which is, hopefully, an easier solution to the most
|
|||
|
|
|||
|
important performance problems.
|
|||
|
|
|||
|
No one really knows where XMODEM and the file transfer function will go
|
|||
|
in the coming years. Perhaps X.PC from Tymnet, MNP from Microcom or
|
|||
|
Synchronous X.25 will slowly push XMODEM, et. al, into history. I
|
|||
|
think this will happen, but not for maybe 5 to 10 years. Perhaps when
|
|||
|
50% of the households outgrow the Commodore 64, or when modem manufac-
|
|||
|
turers can provide a $50 synchronous modem we will see the beginning of
|
|||
|
the end for XMODEM, but not today.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 5
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
2. INTRODUCTION
|
|||
|
|
|||
|
XMODEM and its derivatives have become the primary method for file
|
|||
|
transfer for personal computers. Hopefully this document will help
|
|||
|
people to understand these protocols and to implement them on their
|
|||
|
own. In particular, this document presents an additional XMODEM
|
|||
|
derivation to the public domain: WXMODEM.
|
|||
|
|
|||
|
Why develop another file transfer protocol?
|
|||
|
|
|||
|
After working with bulletin boards, Public Data Networks such as Tymnet
|
|||
|
and Telenet, and commercial host systems such as People/Link, Delphi,
|
|||
|
CompuServe and others, a number of people came to believe that hobby-
|
|||
|
ist, home and business users would benefit significantly from a new,
|
|||
|
conceptually simple file transfer protocol which would provide improved
|
|||
|
performance and fully support the public data networks such as Tymnet,
|
|||
|
Telenet and Datapac.
|
|||
|
|
|||
|
But before WXMODEM can be presented, XMODEM and CRC XMODEM must be
|
|||
|
described in detail.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 6
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
3. TERMINOLOGY
|
|||
|
|
|||
|
I've elected to use two special terms: transmitter and receiver. The
|
|||
|
transmitter is the computer/software which is transmitting data packets
|
|||
|
and receiving acknowledgement characters. The receiver is the com-
|
|||
|
puter/software receiving the data packets and transmitting acknowledge-
|
|||
|
ment characters.
|
|||
|
|
|||
|
Here is a table of special ASCII characters that are used throughout
|
|||
|
this paper:
|
|||
|
|
|||
|
Name Decimal Hexadecimal Description
|
|||
|
|
|||
|
|
|||
|
SOH 01 H001 Start Of Header
|
|||
|
EOT 04 H004 End Of Transmission
|
|||
|
ACK 06 H006 Acknowledge (positive)
|
|||
|
DLE 16 H010 Data Link Escape
|
|||
|
X-On (DC1) 17 H011 Transmit On
|
|||
|
X-Off(DC3) 19 H013 Transmit Off
|
|||
|
NAK 21 H015 Negative Acknowledge
|
|||
|
SYN 22 H016 Synchronous idle
|
|||
|
CAN 24 H018 Cancel
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 7
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
4. XMODEM
|
|||
|
|
|||
|
|
|||
|
Xmodem is a popular error recovery type protocol for transferring files
|
|||
|
between computers via serial, asynchronous communications. Before
|
|||
|
learning more about Xmodem, it is important to hear what its author has
|
|||
|
|
|||
|
to say:
|
|||
|
|
|||
|
|
|||
|
"It was a quick hack I threw together, very unplanned (like
|
|||
|
everything I do), to satisfy a personal need to communicate
|
|||
|
with some other people. ONLY the fact that it was done in
|
|||
|
8/77, and that I put it in the public domain immediately,
|
|||
|
made it become the standard that it is"....."People who
|
|||
|
suggest I make SIGNIFICANT changes to the protocol, such as
|
|||
|
'full duplex', 'multiple outstanding blocks', 'multiple
|
|||
|
destinations', etc etc don't understand that the incredible
|
|||
|
simplicity of the protocol is one of the reasons it survived
|
|||
|
to this day in as many machines and programs as it may be
|
|||
|
found in!"a
|
|||
|
|
|||
|
|
|||
|
4.1. Xmodem Hardware Level Protocol
|
|||
|
|
|||
|
The protocol is Asynchronous, 8 data bits, no parity bit, one stop
|
|||
|
bit. Modems which are commonly used are AT&T 103 (300 baud), AT&T
|
|||
|
212A (1200 baud) and CCITT V.22 (2400 baud).
|
|||
|
|
|||
|
|
|||
|
Typically, the data in a file is transmitted without change (if a
|
|||
|
7 bit machine, the left most, high order, bit is always zero)
|
|||
|
except that CP/M and MS/DOS operating systems want a ^Z (decimal
|
|||
|
26) to represent end-of-file.
|
|||
|
|
|||
|
4.2. Xmodem Initiation
|
|||
|
|
|||
|
Prior to entering the protocol, both the transmitting and receiv-
|
|||
|
ing computer must know where to get the data (what file is to be
|
|||
|
transmitted) and where to put the data (file to store the data or
|
|||
|
buffer area). In Xmodem one side of the file transmission is
|
|||
|
always in charge (local computer), asking the other side (remote
|
|||
|
computer) to either transmit a file or to accept a file. Through
|
|||
|
a dialog outside of Xmodem the local computer (your PC) first
|
|||
|
sends commands to the remote computer to select a file name
|
|||
|
to prepare to transmit or receive a file via XMODEM. Once this is
|
|||
|
completed the remote computer enters the XMODEM protocol. Now the
|
|||
|
local computer must be told what file to transmit or receive and
|
|||
|
it enters the XMODEM protocol, and hopefully data starts moving.
|
|||
|
|
|||
|
|
|||
|
a Ward Christensen, quoted from a message posted on CompuServe
|
|||
|
|
|||
|
in 1985. Edited by Chuck Forsberg, "X/Ymodem Protocol
|
|||
|
|
|||
|
Reference", unpublished, 10/20/1985.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 8
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
Upon entering the Xmodem protocol, the transmitting computer waits
|
|||
|
between 10 seconds and a minute to receive an NAK character from
|
|||
|
the receiving computer. The receiving computer is said to drive
|
|||
|
the protocol. The transmitter may retry any number of times. If
|
|||
|
any character other than a NAK or CAN is read by the transmitter,
|
|||
|
it is ignored. The CAN character implies cancellation of the
|
|||
|
Xmodem file transfer and that the transmitter should leave the
|
|||
|
Xmodem protocol. Once the receiver has sent a NAK, it will wait
|
|||
|
10 seconds for data to begin to arrive. If none arrives in 10
|
|||
|
seconds, the receiver will send another NAK and continue to repeat
|
|||
|
10 times at which point the receiver will leave the Xmodem
|
|||
|
protocol (typically with a super cryptic error message such as
|
|||
|
"aborted", "NAK retry maximum exceeded").
|
|||
|
|
|||
|
|
|||
|
Transmitter Receiver
|
|||
|
|
|||
|
[wait for one minute] < [NAK]
|
|||
|
|
|||
|
[begin block transmission] >
|
|||
|
|
|||
|
4.3. Xmodem Data Transmission
|
|||
|
|
|||
|
|
|||
|
The transmitter takes the data, divides it into 128, 8 bit byte
|
|||
|
pieces and places it in an Xmodem Packet.
|
|||
|
|
|||
|
The Xmodem Packet looks like this:
|
|||
|
|
|||
|
[SOH] [seq] [cmpl [seq] [128 data bytes] [csum]
|
|||
|
|
|||
|
SOH Start of header character (decimal 1).
|
|||
|
|
|||
|
seq one byte sequence number which starts at 1, and
|
|||
|
increments by one until it reaches 255 and then
|
|||
|
wraps around to zero.
|
|||
|
|
|||
|
cmpl seq one byte 1's complement of seq. This can be
|
|||
|
calculated as cmpl = 255 - (255 and seq) or using
|
|||
|
xor as cmpl = (255 and seq) xor 255.
|
|||
|
|
|||
|
data 128, 8 bit bytes of data. Note than when sending
|
|||
|
CP/M and MS/DOS files a ^Z (decimal 26) must be
|
|||
|
added to then end of the file. If the last block
|
|||
|
of data is less than 128 bytes, the Xmodem packet
|
|||
|
must be padded with characters, usually ^Z's.
|
|||
|
|
|||
|
csum one byte sum of all of the data bytes where any
|
|||
|
overflow or carry is discarded immediately. For
|
|||
|
example, if the first 3 bytes are 255, 5 and 6 the
|
|||
|
checksum after the first 3 bytes will be 10.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 9
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
Once Xmodem Initiation has completed, the transmitter sends the
|
|||
|
first Xmodem packet and then waits. After the receiver has the
|
|||
|
full packet, it will compare its own checksum calculation with the
|
|||
|
checksum that was sent by the transmitter. If the checksums
|
|||
|
match, the receiver will send an ACK. If the checksums are
|
|||
|
different, the receiver will send a NAK.
|
|||
|
|
|||
|
After receiving an ACK the transmitter will send the next Xmodem
|
|||
|
packet. If a NAK is received, the transmitter will resend the
|
|||
|
same XMODEM packet again.
|
|||
|
|
|||
|
Once the transmitter has sent the last Xmodem packet and has
|
|||
|
received an ACK, the transmitter will send an EOT and then wait
|
|||
|
for a final ACK from the receiver before leaving the Xmodem
|
|||
|
protocol. When the receiver sees an EOT instead of an SOH (the
|
|||
|
first character the next packet), the receiver transmits an ACK
|
|||
|
character, closes its files and leaves the Xmodem protocol.
|
|||
|
|
|||
|
Let's look at a three block file transfer:
|
|||
|
|
|||
|
|
|||
|
Transmitter Receiver
|
|||
|
|
|||
|
<<<<< [NAK]
|
|||
|
[SOH][001][255][...][csum] >>>>>
|
|||
|
<<<<< [ACK]
|
|||
|
[SOH][002][254][...][csum] >>>>>
|
|||
|
<<<<< [ACK]
|
|||
|
[SOH][003][253][...][csum] >>>>>
|
|||
|
<<<<< [ACK]
|
|||
|
[EOT] >>>>>
|
|||
|
<<<<< [ACK]
|
|||
|
|
|||
|
|
|||
|
Seems easy, right? And it is, until something goes wrong.
|
|||
|
|
|||
|
4.4. Xmodem Cancellation
|
|||
|
|
|||
|
|
|||
|
It has become a defacto standard that the receiver may cancel the
|
|||
|
file transfer by sending a CAN character and then leaving the
|
|||
|
protocol. If the transmitter receives a CAN character when
|
|||
|
expecting either a NAK or ACK, the transmitter is to termin-
|
|||
|
ate and leave the protocol. Likewise, if the receiver sees a CAN
|
|||
|
when expecting an SOH (start of packet) it should terminate the
|
|||
|
file transfer. Many implementations now require two CAN char-
|
|||
|
acters before recognizing a cancel condition.
|
|||
|
|
|||
|
|
|||
|
4.5. Xmodem Error Recovery and Timing
|
|||
|
|
|||
|
|
|||
|
Error detection and recovery are the primary purposes of the
|
|||
|
Xmodem protocol. The transmitter and receiver should continue to
|
|||
|
retry until 10 errors in a row have occurred. Some of the common
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 10
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
error conditions are listed below:
|
|||
|
|
|||
|
|
|||
|
4.5.1. Complement Error
|
|||
|
|
|||
|
|
|||
|
If the sequence number does not match the complement
|
|||
|
sequence number, the packet must be discarded and a NAK
|
|||
|
sent to the transmitter.
|
|||
|
|
|||
|
|
|||
|
4.5.2. Duplicate packet condition
|
|||
|
|
|||
|
|
|||
|
If the sequence number is the same as the sequence
|
|||
|
number of the last packet received, the packet should be
|
|||
|
discarded and an ACK sent to the transmitter.
|
|||
|
|
|||
|
|
|||
|
4.5.3. Out of sequence error
|
|||
|
|
|||
|
|
|||
|
If the sequence number matches the complement sequence
|
|||
|
number and it is neither the expected sequence number
|
|||
|
nor the last sequence number, the receiver should send
|
|||
|
two CAN characters and leave the Xmodem protocol
|
|||
|
(e. g. abort the file transfer).
|
|||
|
|
|||
|
|
|||
|
4.5.4. Receive timeout errors
|
|||
|
|
|||
|
|
|||
|
When expecting data, if 10 seconds ever pass without
|
|||
|
receipt of a character, the receiver should send another
|
|||
|
NAK. This should be repeated 10 times. Some implement-
|
|||
|
ations will timeout after 10 seconds waiting for the
|
|||
|
first character of a packet, SOH, and then reduce the
|
|||
|
timeout for characters in a packet. The timeout should
|
|||
|
not go below 5 seconds if the protocol is to be used
|
|||
|
with public data networks.
|
|||
|
|
|||
|
|
|||
|
4.5.5. Transmit timeout errors
|
|||
|
|
|||
|
|
|||
|
In the original protocol, the transmitter would wait 10
|
|||
|
seconds for an ACK, NAK or CAN and then retransmit the
|
|||
|
last Xmodem packet as if a NAK had been received. Most
|
|||
|
implementations either have the transmitter wait for a
|
|||
|
very long time (30 seconds to a minute) and then
|
|||
|
terminate the file transfer if an ACK, NAK or CAN has
|
|||
|
not been receive or wait about 30 seconds and retransmit
|
|||
|
the last packet.
|
|||
|
|
|||
|
|
|||
|
4.5.6. Packet synchronization errors
|
|||
|
|
|||
|
|
|||
|
Since extraneous characters are frequently generated
|
|||
|
when using asynchronous communications, the receiver
|
|||
|
should not count on receiving exactly 132 characters for
|
|||
|
each Xmodem packet. One algorithm for re-synchroniz-
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 11
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
ation goes as follows:
|
|||
|
|
|||
|
Assume that the checksum algorithm will cause re-trans-
|
|||
|
mission of Xmodem packets which contain extraneous
|
|||
|
characters.
|
|||
|
|
|||
|
If the character received when expecting the start of a
|
|||
|
packet is not a SOH then ignore the character and
|
|||
|
continue to search for a SOH.
|
|||
|
|
|||
|
Once a SOH is found, assume that the next two characters
|
|||
|
will be a valid sequence number and complement. If they
|
|||
|
are complements then assume that the packet has begun.
|
|||
|
If they are not complements, continue to search for a
|
|||
|
SOH.
|
|||
|
|
|||
|
Send a NAK if a timeout occurs while attempting to
|
|||
|
re-synchronize (e.g. continue to process timeouts as
|
|||
|
described above).
|
|||
|
|
|||
|
If no re-synchronization occurs within 135 characters
|
|||
|
then send a NAK character and retry receiving the
|
|||
|
packet.
|
|||
|
|
|||
|
|
|||
|
4.5.7. False EOT condition
|
|||
|
|
|||
|
When the receiver sees an EOT (which was not sent by the
|
|||
|
transmitter, but generated out of a communications error)
|
|||
|
instead of a SOH character, the receiver assumes incorrectly
|
|||
|
that the complete file has been transmitted. This is
|
|||
|
typically an unrecoverable error and it does occur especdally
|
|||
|
when the transmitting and receiving UARTs are clocked
|
|||
|
slightly differently. An algorithm to detect false EOT might
|
|||
|
return a NAK for the first EOT received and only assume true
|
|||
|
end of transmission after receiving two EOT's.
|
|||
|
|
|||
|
|
|||
|
Transmitter Receiver
|
|||
|
|
|||
|
[last block .. ] >>>>>
|
|||
|
<<<<< [ACK]
|
|||
|
[EOT] >>>>>
|
|||
|
<<<<< [NAK]
|
|||
|
[EOT] >>>>>
|
|||
|
<<<<< [ACK]
|
|||
|
|
|||
|
|
|||
|
Just in case the transmitter was not prepared to resend the
|
|||
|
EOT, it might be wise to set the timeout to about 3 seconds
|
|||
|
and retransmit the NAK up to 3 times and then issue a warning
|
|||
|
message but assume end of transmission.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 12
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
4.5.8. False CAN condition
|
|||
|
|
|||
|
|
|||
|
Some Xmodem implementations will terminate on a single CAN
|
|||
|
character. Occasionally a CAN character will be generated by
|
|||
|
a communications error and if this occurs and is seen by the
|
|||
|
receiver between packets or is ever seen by the transmitter,
|
|||
|
the file transfer will be incorrectly canceled. Many
|
|||
|
implementations now require two CAN characters in a row
|
|||
|
before assuming that the file transfer is to be aborted.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 13
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
5. CRC XMODEM
|
|||
|
|
|||
|
|
|||
|
CRC Xmodem is very similar to Checksum Xmodem. The protocol initiation
|
|||
|
has changed and the 8 bit checksum has been replaced by a 16 bit CRC.
|
|||
|
Only theses changes are presented.
|
|||
|
|
|||
|
One of the earliest and most persistent problems with Xmodem were
|
|||
|
transmission errors which were not caught by the checksum algorithm.
|
|||
|
Assuming that there is no bias in asynchronous communications errors,
|
|||
|
we would expect that 1 out of every 256 erroneous complete or oversized
|
|||
|
Xmodem packets to have a valid checksum. With the same assumption, if
|
|||
|
the checksum were 16 bits, we would expect 1 out of every 65,536
|
|||
|
erroneous complete or oversized packets would have a valid checksum.
|
|||
|
|
|||
|
|
|||
|
5.1. CRC Calculation Rules
|
|||
|
|
|||
|
|
|||
|
Considerable theoretical research has shown that a 16 bit cyclical
|
|||
|
redundancy check character (CRC/16) will detect a much higher
|
|||
|
percent of errors such that it would only allow 1 undetected
|
|||
|
bit in error for every 10^14 bits transmitted. That's 1 un-
|
|||
|
detected error per 30 years of constant transmission at 1 mega-
|
|||
|
bit per second. However, my personal experience indicates that
|
|||
|
something around 10^9 to 10^10 is more realistic. Why such a vast
|
|||
|
improvement over the checksum algorithm? It is caused by the
|
|||
|
unique properties that prime numbers have when being divided into
|
|||
|
integers. Simply stated, if an integer is divided by a prime
|
|||
|
number, the remainder is unique. The CRC/16 algorithm treats all
|
|||
|
integer by 2^16 and then divides that 1040 bit number by a 17 bit
|
|||
|
prime number. The low order 16 bits of the remainder becomes the
|
|||
|
16 bit CRC.
|
|||
|
|
|||
|
The 17 bit prime number in CRC Xmodem is 2^16 + 2^12 + 2^5 + 1 or
|
|||
|
65536 + 4096 + 32 + 1 = 69665. So calculating the CRC is simple,
|
|||
|
just multiply the 128 byte data number by 65536, divide by 69665
|
|||
|
and the low order 16 bits of the remainder are the CRC. The only
|
|||
|
problem is, I've never seen a computer which has instructions to
|
|||
|
support 130 byte integer arithmetic! Fortunately for us, Seephan
|
|||
|
Satchell, Satchell Evaluations, published a specification a very
|
|||
|
efficient algorithm to calculate the CRC without either 130 byte
|
|||
|
arithmetic or bit manipulation. Appendix A contains the source
|
|||
|
code, in IBM/PC BASIC, for the calculation of a CRC.
|
|||
|
|
|||
|
Other methods of calculating CRC's for Xmodem involve bit level
|
|||
|
logic. a.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
a Chuck Forsberg, "X/Ymodem Protocol Reference", available on
|
|||
|
many bulletin boards.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 14
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
5.2. CRC Xmodem Initiation
|
|||
|
|
|||
|
|
|||
|
The initiation of CRC Xmodem was designed to provide for automatic
|
|||
|
fall back to Checksum Xmodem if the transmitter does not support
|
|||
|
the CRC version.
|
|||
|
|
|||
|
The receiver requests CRC Xmodem by sending the letter C (decimal
|
|||
|
67) instead of a NAK. If the transmitter supports CRC Xmodem, it
|
|||
|
will begin transmission of the first Xmodem packet upon receipt of
|
|||
|
the C. If the transmitter does not support CRC Xmodem, it will
|
|||
|
ignore the C. The receiver should timeout after 3 seconds and
|
|||
|
repeat sending the C. After 3 timeouts, the receiver should fall
|
|||
|
back to the checksum Xmodem protocol and send a NAK.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 15
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
6. WINDOWED XMODEM (WXMODEM)a
|
|||
|
|
|||
|
|
|||
|
First, Xmodem provided the basic file transfer function, then CRC
|
|||
|
Xmodem improved the data integrity, now we come to WXmodem which
|
|||
|
provides better cost/performance.
|
|||
|
|
|||
|
6.1. WXmodem Design Criteria
|
|||
|
|
|||
|
|
|||
|
A few people began discussing improvements to Xmodem with me in
|
|||
|
late 1985, over time we developed the following criteria:
|
|||
|
|
|||
|
|
|||
|
6.1.1. The protocol must be as similar as possible to the
|
|||
|
XMODEM originally developed by Ward Christensen.
|
|||
|
The popularity of XMODEM, I believe, is based on
|
|||
|
its conceptual simplicity. More software writers
|
|||
|
are familiar with this protocol than any other.
|
|||
|
More files are transferred everyday by this
|
|||
|
protocol than any other asynchronous protocol.
|
|||
|
Simplicity here implies a limited number of rules
|
|||
|
for timing, error recovery and initiation.
|
|||
|
|
|||
|
|
|||
|
6.1.2. The protocol must overcome the propagation delay
|
|||
|
that is characteristic of the public data net-
|
|||
|
works. While the cost of long distance communi-
|
|||
|
cation is 50 to 90% less via the public data
|
|||
|
networks than via the public voice networks, the
|
|||
|
propagation delays inherent in public data networks
|
|||
|
both reduces the cost savings and increases the
|
|||
|
aggravation that occurs while watching a computer
|
|||
|
slowly perform a file transfer.
|
|||
|
|
|||
|
|
|||
|
6.1.3. The protocol must overcome the flow control
|
|||
|
problems which are characteristic in many public
|
|||
|
data network situations. Basically, in most
|
|||
|
situations, the X-On and X-Off characters must
|
|||
|
always be used for flow control and only for flow
|
|||
|
control when using public data networks.
|
|||
|
|
|||
|
|
|||
|
6.1.4. The protocol should improve error recovery by
|
|||
|
simplifying the manner in which a programmer can
|
|||
|
determine the beginning of an XMODEM block. Since
|
|||
|
the Start of Header character (SOH) can appear in
|
|||
|
the data or CRC, the programmer must use a rela-
|
|||
|
tively sophisticated method to determine if a SOH
|
|||
|
actually represents the beginning of a XMODEM
|
|||
|
block.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
a This section assumes that the reader is already familiar with
|
|||
|
Xmodem and CRC Xmodem presented above.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 16
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
6.2. Transparency and Flow Control Rules (Byte Level Rules)
|
|||
|
|
|||
|
|
|||
|
This protocol provides special public data network support for
|
|||
|
non-X.25 hosts and PC-Pursuit access to bulletin boards. In order
|
|||
|
to accomplish this, the transmitter is not permitted to transmit
|
|||
|
the X-On and X-Off characters in the Xmodem packets. The reason
|
|||
|
for this restriction is simple:
|
|||
|
|
|||
|
|
|||
|
By the very nature of X.25 public data networks, without
|
|||
|
flow control, buffer overruns and lost data are inevit-
|
|||
|
able from time to time at any baud rate.
|
|||
|
|
|||
|
|
|||
|
To avoid data loss public data networks must always
|
|||
|
assume that any X-Off and X-On character is a flow
|
|||
|
control character when supporting PC-Pursuit for
|
|||
|
bulletin boards and when supporting non-X.25 host
|
|||
|
systems.
|
|||
|
|
|||
|
|
|||
|
Since many non-X.25 hosts, bulletin boards and communications
|
|||
|
programs use X-On and X-Off as flow control characters, public
|
|||
|
data networks must support those X-Off and X-On requests at the
|
|||
|
point of connection where the X-Off is received by the public data
|
|||
|
network. Otherwise, as many as several hundred characters backed
|
|||
|
up in the network would be transmitted by the public data network
|
|||
|
before the X-Off used for flow control reached the transmitter.
|
|||
|
The public data network has no way to know whether an X-On/X-Off
|
|||
|
protocol or Xmodem is operational at any point in time. Therefore
|
|||
|
a Xmodem packet which contains an X-Off character and no succeed-
|
|||
|
ing X-On character will cause the public data network to stop
|
|||
|
forwarding the ACK or NAK.
|
|||
|
|
|||
|
In addition, error recovery requires sophisticated programming for
|
|||
|
the receiver to determine the start of an XMODEM packet. This
|
|||
|
protocol simplifies this task by dedicating a special character as
|
|||
|
an indicator that an XMODEM packet is about to begin. The
|
|||
|
SYN (synch, decimal 22) character is used for this purpose.
|
|||
|
The presence of one or more SYN characters in a data stream always
|
|||
|
indicates that the next non SYN character is the beginning of an
|
|||
|
XMODEM packet (e.g. SOH).
|
|||
|
|
|||
|
The method used here to handle these situations is through the
|
|||
|
insertion of the DLE character (H010, decimal 16, data link escape
|
|||
|
character) as an indicator that the character following the DLE is
|
|||
|
in fact a modified DLE, SYN, X-On, or X-Off character.
|
|||
|
|
|||
|
Rules:
|
|||
|
|
|||
|
|
|||
|
6.2.1. Whenever an X-On, X-Off, SYN or DLE character is
|
|||
|
about to be transmitted as any part of an actual
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 17
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
XMODEM packet including the CRC, the transmitter
|
|||
|
will transmit instead a DLE character followed by
|
|||
|
the original character which has been modified by
|
|||
|
exclusive or'ing it with 64 to its value. 1
|
|||
|
|
|||
|
|
|||
|
6.2.2. The inserted DLE characters are not counted in the
|
|||
|
128 byte data length of the data portion of the
|
|||
|
XMODEM packet. Indeed, it would be possible to
|
|||
|
have a packet which is physically 264 bytes in
|
|||
|
length because the Xmodem block sequence number
|
|||
|
(or its complement), all of the 128 data characters
|
|||
|
and two CRC characters are all either X-On, X-Off,
|
|||
|
SYN or DLE characters.
|
|||
|
|
|||
|
6.2.3. Neither the DLE nor the adjusted characters are
|
|||
|
used in the CRC calculation, rather the original
|
|||
|
character is always used in the CRC calculation.
|
|||
|
|
|||
|
6.2.4. When the receiver sees a DLE character, it does not
|
|||
|
count it in the XMODEM block length calculation,
|
|||
|
nor compute it in the CRC calculation but discards
|
|||
|
it and then remembers to exclusive or the next
|
|||
|
character with 64 and to verify that the result
|
|||
|
character is either a DLE, SYN, X-On or X-Off (the
|
|||
|
receiver will reject the packet unconditionally, if
|
|||
|
not one of those four characters) and then include
|
|||
|
the character as part of the packet.
|
|||
|
|
|||
|
6.2.5. Prior to transmission of a XMODEM packet, the
|
|||
|
transmitter will send one or more SYN characters
|
|||
|
(recommend two) as a positive indicator to the
|
|||
|
receiver of the beginning of a Xmodem packet.2
|
|||
|
|
|||
|
|
|||
|
6.2.6. Except for the character received after a DLE, the
|
|||
|
receiver will test each incoming character to see
|
|||
|
if it is a SYN character. If it is, it will
|
|||
|
discard the character and assume that the next
|
|||
|
character will be another SYN or SOH. If a SYN
|
|||
|
character is received in the middle of a packet,
|
|||
|
the receiver will NAK that packet. The purpose of
|
|||
|
the SYN character is to simplify recognition of the
|
|||
|
beginning of a XMODEM packet by the receiver. Once
|
|||
|
an out of synch condition occurs on incoming
|
|||
|
data, the receiver can just ignore every incoming
|
|||
|
character until it sees a SYN. Existing XMODEM
|
|||
|
code which already properly deals with this
|
|||
|
situation could just always discard any SYN
|
|||
|
character at time of receipt with no further
|
|||
|
action.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 18
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
6.2.7. The transmitter must support flow control char-
|
|||
|
acters (X-On, and X-Off) during transmission of
|
|||
|
packets. Upon receipt of an X-Off it will wait 10
|
|||
|
seconds for an X-On and will start transmission
|
|||
|
again after 10 seconds or an X-On is received,
|
|||
|
whichever occurs first. Any extraneous X-On
|
|||
|
characters received by the transmitter will be
|
|||
|
ignored and discarded. (Note that this does NOT
|
|||
|
apply to X.25 host computers which use X.25 L2 and
|
|||
|
L3 windows for flow control.)
|
|||
|
|
|||
|
|
|||
|
6.3. Initial Handshake Rules
|
|||
|
|
|||
|
|
|||
|
An initial handshake is provided to permit the receiver to
|
|||
|
indicate to the transmitter whether it can support checksum
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, or Windowed Xmodem:
|
|||
|
|
|||
|
6.3.1. WXMODEM - The receiver will send a character W
|
|||
|
(decimal 87) and wait 3 seconds for the beginning
|
|||
|
of a Xmodem packet. This will be repeated 3 times
|
|||
|
and then the receiver will drop down to CRC Xmodem.
|
|||
|
|
|||
|
6.3.2. CRC XMODEM - The receiver will send a character C
|
|||
|
(decimal 67) and wait 3 seconds for the beginning
|
|||
|
of a Xmodem packet. This will be repeated 3 times
|
|||
|
and then the receiver will drop down to Checksum
|
|||
|
Xmodem.
|
|||
|
|
|||
|
6.3.3. Checksum XMODEM - The receivers will send a NAK
|
|||
|
and wait up to 3 seconds for the beginning of a
|
|||
|
Xmodem packet. This will be repeated 4 times and
|
|||
|
if no valid SOH is received, the receiver will
|
|||
|
abort the file transfer request.
|
|||
|
|
|||
|
6.4. Window Packet Transmission Rules
|
|||
|
|
|||
|
|
|||
|
In order to overcome the propagation delays inherent with public
|
|||
|
data networks such as Tymnet, Telenet, Datapac, IPSS, Transpac and
|
|||
|
dozens more, the protocol must permit the transmitter to send more
|
|||
|
than one packet before receiving an acknowledgement from the
|
|||
|
receiver. The number of packets that the transmitter will send
|
|||
|
before stopping transmission if an acknowledgement has not been
|
|||
|
received is called the "window". WXmodem uses a window of 4
|
|||
|
packets for several reasons. Most importantly, it uses a single
|
|||
|
set of timing rules which would deal reasonably well with a wide
|
|||
|
range of baud rates (that implied keeping the window fairly
|
|||
|
small). Secondly, the window sequence number is directly related
|
|||
|
to the Xmodem packet sequence number which, hopefully, will
|
|||
|
simplify implementation of windowing.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 19
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Rules:
|
|||
|
|
|||
|
6.4.1. The window is always 4 Xmodem packets. That is,
|
|||
|
the transmitter will send 4 unacknowledged pack-
|
|||
|
ets. Transmission will not cease and the time out
|
|||
|
interval will not begin until 4 unacknowledged
|
|||
|
packets have been transmitted. Note that the
|
|||
|
window may be less than 4 Xmodem packets for short
|
|||
|
files or at end-of-file.
|
|||
|
|
|||
|
|
|||
|
6.4.2. The receiver will transmit acknowledgements in the
|
|||
|
form:
|
|||
|
|
|||
|
|
|||
|
ACK[sequence]
|
|||
|
|
|||
|
The [sequence] field is an 8 bit number where the
|
|||
|
high order or most significant 6 bits are always
|
|||
|
zero and the low order or least significant 2 bits
|
|||
|
are always the same as the low order 2 bits of the
|
|||
|
XMODEM block sequence number of the XMODEM packet
|
|||
|
being acknowledged (value in decimal may range
|
|||
|
from 0 to 3).
|
|||
|
|
|||
|
6.4.3. The receiver does not have to acknowledge every
|
|||
|
packet, but must acknowledge at minimum every
|
|||
|
fourth packet. The transmitter will accept one
|
|||
|
ACK[sequence] for multiple XMODEM packets. For
|
|||
|
example, after an unknown number of packets:
|
|||
|
|
|||
|
|
|||
|
Transmitter Receiver
|
|||
|
....
|
|||
|
....
|
|||
|
....
|
|||
|
[Block Sequence Number H0FE]
|
|||
|
[Block Sequence Number H0FF] ACK[H002]
|
|||
|
[Block Sequence Number H000] ACK[H003]
|
|||
|
[Block Sequence Number H001]
|
|||
|
[Block Sequence Number H002] ACK[H001]
|
|||
|
.....
|
|||
|
|
|||
|
Since some transmitters must close the window and
|
|||
|
cease all communications before doing disk I/O to
|
|||
|
read more data, it is suggested that acknowledge-
|
|||
|
ments be sent for every packet (except when the
|
|||
|
receiver can easily determine that another packet
|
|||
|
is already being received at the point in time that
|
|||
|
the ACK[sequence] is about to be sent).3
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 20
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
6.4.4. The receiver will reject a packet (request re-
|
|||
|
transmission) by sending:
|
|||
|
|
|||
|
NAK[sequence]
|
|||
|
|
|||
|
Where [sequence] is then next window sequence
|
|||
|
number (between H000 and H003) after the [sequence]
|
|||
|
of the last good block. The receiver will discard
|
|||
|
up to 3 Xmodem packets received after the NAK is
|
|||
|
transmitted until it receives the packet with the
|
|||
|
sequence number that had previously been nak'ed by
|
|||
|
the receiver. The receiver will not send a second
|
|||
|
NAK until another packet with the same sequence
|
|||
|
number is received which is also invalid or a
|
|||
|
timeout has occurred.
|
|||
|
|
|||
|
6.4.5. When the transmitter receives a NAK[sequence], it
|
|||
|
will complete transmission of any XMODEM block
|
|||
|
currently being transmitted and then begin re-
|
|||
|
transmission starting with the block which was
|
|||
|
nak'ed.
|
|||
|
|
|||
|
6.4.6. The receiver will discard duplicate packets but
|
|||
|
count them in the window for purposes of deter-
|
|||
|
mining the maximum receive window without an ACK in
|
|||
|
response. For example, if the receiver gets packet
|
|||
|
sequence number 127 four times in a row, it must
|
|||
|
send an ACK H003 even if the receiver has previous-
|
|||
|
ly acked that block.
|
|||
|
|
|||
|
6.4.7. The timeout intervals at various points in process-
|
|||
|
ing are:
|
|||
|
|
|||
|
Waiting for a character on receive, start of packet
|
|||
|
not yet recognized: 15 seconds
|
|||
|
|
|||
|
Waiting for a character on receive, start of packet
|
|||
|
has been recognized: 15 seconds
|
|||
|
|
|||
|
Waiting for an Ack or Nak on transmit side after
|
|||
|
the window has closed: 15 seconds4
|
|||
|
|
|||
|
Waiting for an X-On after receipt of an X-Off by
|
|||
|
the transmitter: 10 seconds
|
|||
|
|
|||
|
|
|||
|
|
|||
|
6.4.8. When the transmitter times out waiting for an ACK
|
|||
|
or NAK when the window is closed (e.g. four blocks
|
|||
|
have been transmitted), the transmitter will
|
|||
|
retransmit the last block transmitted and wait
|
|||
|
again. Only after 10 consecutive timeouts have
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 21
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
occurred will the transmitter cancel the trans-
|
|||
|
mission.
|
|||
|
|
|||
|
6.4.9. Where possible, it is recommended that the receiver
|
|||
|
return an ACK[sequence] for every packet or at
|
|||
|
least 50% of the Xmodem packets. When the receiver
|
|||
|
must wait for the window to close (e.g. receive 4
|
|||
|
Xmodem packets without an acknowledgement),
|
|||
|
some performance benefit will be lost.
|
|||
|
|
|||
|
If the receiver cannot overlap disk I/O and communications
|
|||
|
I/O, the receiver can temporarily stop transmission by either:
|
|||
|
|
|||
|
"Closing the window" (e.g. receiving 4 blocks without sending
|
|||
|
an ACK[sequence]) performing the disk I/O and then sending an
|
|||
|
|
|||
|
ACK[sequence].
|
|||
|
|
|||
|
Transmitting an X-Off followed by an X-On when the receiver
|
|||
|
is ready to resume accepting data. Note that the receiver
|
|||
|
should be prepared to accept data for about a 1/4 of a second
|
|||
|
after the X-Off is sent to cover situations where satellite
|
|||
|
propagation delay may occur. One possible implementation
|
|||
|
would let the computer user set the "X-Off delay time" so
|
|||
|
that in the normal case the X-Off delay could be set to 25
|
|||
|
milleseconds. A sophisticated implementation might set the
|
|||
|
initial X-Off delay at 250 milleseconds and then reduce it
|
|||
|
based on experience during the file transfer.
|
|||
|
|
|||
|
Each approach has its advantages, but the X-Off approach will
|
|||
|
provide the best performance in most cases especially when
|
|||
|
using a public data network. Note, however, that some
|
|||
|
computers, notably the Commodore 64 and the IBM PC Jr cannot
|
|||
|
receive communications data while writing to disk.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 22
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
6.5. Notes for X.25 Hosts
|
|||
|
|
|||
|
|
|||
|
Host computer systems which utilize the X.25 protocol
|
|||
|
(examples: People/Link, Delphi, CompuServe, The Source) to
|
|||
|
interface with the various public data networks may send special
|
|||
|
control packets which change the manner in which the network will
|
|||
|
communicate with the remote personal computer, bulletin board or
|
|||
|
terminal. For the purposes of this paper, it is assumed that the
|
|||
|
X.25 host can already support CRC and/or Checksum Xmodem and
|
|||
|
present only the changes for WXMODEM.
|
|||
|
|
|||
|
6.5.1. When an X.25 Host is the transmitter, it must be
|
|||
|
sure to set the distant X.3 PAD parameters to
|
|||
|
assure that the receiver can use X-Off/X-On for
|
|||
|
flow control. This is accomplished by sending a
|
|||
|
Q-Bit command packet to set X.3 parameter 12 to a 1
|
|||
|
prior to the initial handshake. Note that if the
|
|||
|
receiver cannot support WXMODEM, the X.25 Host must
|
|||
|
send the appropriate Q-Bit packet to reset para-
|
|||
|
meter 12 to a 0 before transmitting the first CRC
|
|||
|
or Checksum Xmodem packet.
|
|||
|
|
|||
|
6.5.2. When an X.25 Host is the receiver and in WXMODEM
|
|||
|
mode, it must be sure to set the distant X.3 PAD
|
|||
|
parameters to assure that the network will use
|
|||
|
X-Off/X-On for flow control between the network and
|
|||
|
the transmitter to prevent its buffers from
|
|||
|
overflowing. This is accomplished by sending a
|
|||
|
Q-Bit command packet to set X.3 parameter 5 to a 1
|
|||
|
prior to the initial handshake.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 23
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
7. APPENDIX A - CRC CALCULATION RULES
|
|||
|
|
|||
|
|
|||
|
The purpose of this appendix is to give non-technical and non mathema-
|
|||
|
tical software writers a cook book approach to calculating the CRC-16
|
|||
|
used in Xmodem. We have half accomplished that goal. The BASIC code
|
|||
|
in the examples below has been tested on an IBM PC and found to work
|
|||
|
effectively even at 9600 with compiled Basic. Some BASIC languages do
|
|||
|
not offer an XOR function and others do not have MKI$ and CVI functions
|
|||
|
which simplified the movement of data between data types. Someday we
|
|||
|
hope to provide a Commodore C-64/C-128 implementation which simulates
|
|||
|
XOR, but not today!
|
|||
|
|
|||
|
|
|||
|
My thanks go to Chuck Forsberg, Joe Noonan, John Byrns and Stephen
|
|||
|
Satchell. Without their help and public domain documents, this would
|
|||
|
have never been possible.
|
|||
|
|
|||
|
|
|||
|
7.1. IBM PC - 8088/8086 Data Structure
|
|||
|
|
|||
|
|
|||
|
The Intel 8080 and upward has a feature, convenient only to some
|
|||
|
electrical engineer somewhere, which places 2 byte (16) bit
|
|||
|
integers in BYTE REVERSE order in memory. That is, the least
|
|||
|
significant byte is placed in memory before the most significant
|
|||
|
byte for integer operations. If A$ is one byte containing the
|
|||
|
number 52 and it is assigned to I% using the ASC function, the
|
|||
|
binary value (52) ends up in the first byte of I% and the second
|
|||
|
byte is zero.
|
|||
|
|
|||
|
Result
|
|||
|
|
|||
|
I%=0 [x'0000']
|
|||
|
I%=1 [x'0100']
|
|||
|
A$="A" [x'41']
|
|||
|
I%=ASC(A$) [x'4100']
|
|||
|
B$=MKI$(I%) [x'4100'] letter "A" then binary zero
|
|||
|
I%=CVI(CHR$(0)+A$) [x'0041']
|
|||
|
A$=CHR$(65) [x'41']
|
|||
|
|
|||
|
Once this is understood, many problems with these algorithms goes
|
|||
|
away.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
7.2. BASIC Implementation of Bit Shift Method
|
|||
|
|
|||
|
|
|||
|
The bit shift method here was converted from the "C" logic
|
|||
|
presented in Chuck Forsberg's "Xmodem/Ymodem" protocol reference
|
|||
|
and from an old IBM two page reference guide that Joe Noonan
|
|||
|
carries with him in his appointment calendar!
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 24
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Chucks' "C" code:
|
|||
|
|
|||
|
/*
|
|||
|
* This function calculates the CRC used by the XMODEM/CRC Protocol
|
|||
|
* The first argument is a pointer to the message block.
|
|||
|
* The second argument is the number of bytes in the message block.
|
|||
|
* The function returns an integer which contains the CRC.
|
|||
|
* The low order 16 bits are the coefficients of the CRC.
|
|||
|
*/
|
|||
|
|
|||
|
int calcrc(ptr, count)
|
|||
|
char *ptr;
|
|||
|
int count;
|
|||
|
{
|
|||
|
int crc, i;
|
|||
|
|
|||
|
|
|||
|
crc = 0;
|
|||
|
while (--count >= 0) {
|
|||
|
crc = crc ^ (int)*ptr++ << 8;
|
|||
|
for (i = 0; i < 8; ++i)
|
|||
|
if (crc & 0x8000)
|
|||
|
crc = crc << 1 ^ 0x1021;
|
|||
|
else
|
|||
|
crc = crc << 1;
|
|||
|
}
|
|||
|
return (crc & 0xFFFF);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 25
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
But in IBM PC BASIC, our implementation looks like:
|
|||
|
|
|||
|
|
|||
|
100 DEFINT A-Z 'DEFAULT IS TWO BYTE INTEGERS
|
|||
|
2000 REM * V$ CONTAINS 133 CHARACTER COMPLETE XMODEM PACKET
|
|||
|
2010 REM * CRC$ IS TWO BYTE CRC WITH MOST SIGNIFICANT BYTE FIRST
|
|||
|
2020 CRC$=CHR$(0)+CHR$(0) 'START AT ZERO
|
|||
|
2030 FOR I2=4 TO 131
|
|||
|
2040 A$=MID$(V$,I2,1)
|
|||
|
2050 GOSUB 4000
|
|||
|
2060 NEXT I2
|
|||
|
2070 REM * CRC$ CONTAINS CALCULATED CRC!
|
|||
|
3000 IF CRC$=MID$(V$,132,2) THEN .... 'IT'S GOOD!!!
|
|||
|
4000 REM * CRC BITWISE CALCULATION (WHAT A JOKE!)
|
|||
|
4010 CRCH1=ASC(LEFT$(CRC$,1)) XOR ASC(A$)
|
|||
|
4020 CRCL1=ASC(RIGHT$(CRC$,1))
|
|||
|
4030 FOR I3 = 0 TO 7
|
|||
|
4040 CARRY=0 : IF CRCH1 > 127 THEN CARRY=-1 'IS HIGH BIT ON IN CRC?
|
|||
|
4050 CRCH1=(CRCH1*2) AND 255 'CRCH << 1 AND 255
|
|||
|
4060 IF CRCL1>127 THEN CRCH1=CRCH1+1 'IF CRCL CARRIES THEN INCR CRCH
|
|||
|
4070 CRCL1=(CRCL1*2) AND 255 'CRCL << 1 AND 255
|
|||
|
4080 IF CARRY=0 THEN GOTO 4105 'IF HIGH BIT WAS ON,
|
|||
|
4090 CRCH1=CRCH1 XOR 16 'XOR WITH &H1021
|
|||
|
4100 CRCL1=CRCL1 XOR 33
|
|||
|
4110 NEXT I3
|
|||
|
4130 CRC$=CHR$(CRCH1)+CHR$(CRCL1)
|
|||
|
4140 RETURN 'WHEW
|
|||
|
|
|||
|
That routine will execute 128 * 7 + 128 * 9 * 8 BASIC statements
|
|||
|
for each Xmodem packet or 10112 statements per Xmodem packet! It
|
|||
|
will work for low baud rates in compiled BASIC, but just is too
|
|||
|
much for interpretive BASIC.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 26
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
7.3. BASIC Implementation of the Table Method
|
|||
|
|
|||
|
|
|||
|
This method is based on routine M4 in Steven Satchell's paper,
|
|||
|
"Test of CRC Routines for CRC-CCITT", but has some very signifi-
|
|||
|
cant differences. A table of 256 CRC's, originally calculated
|
|||
|
with the bit shift method is used to avoid performing the bit
|
|||
|
shift during communications. The table contains the CRC's for
|
|||
|
each byte value from 0 to 255 when the original CRC is zero. The
|
|||
|
result of this calculation is included in the DATA statements in
|
|||
|
the code.
|
|||
|
|
|||
|
The comments are intended to show what is logically happening
|
|||
|
rather than physically. Because of the "byte reverse" nature of
|
|||
|
integers in the 8088, a logical shift of 8 bits to the left is a
|
|||
|
physical shift of eight bits to the right!
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
200 DEFINT A-Z 'ALL INTEGERS
|
|||
|
210 DIM CRCTB(256)
|
|||
|
300 GOSUB 9000 'INITIALIZE CRC TABLES
|
|||
|
6200 REM * CRC CALCULATION USING TABLE METHOD, V$=XMODEM PACKET
|
|||
|
6210 CRC$=CHR$(0)+CHR$(0) 'INITIALIZE TO ZERO
|
|||
|
6220 FOR Q=4 TO 131
|
|||
|
6230 CRCH1=ASC(LEFT$(CRC$,1)) 'CRC >> 8 AND 255
|
|||
|
6240 CRCL2=CVI(CHR$(0)+RIGHT$(CRC$,1)) 'CRC << 8 AND 255
|
|||
|
6250 CRC1$=MKI$(CRCTB(CRCH1 XOR ASC(MID$(V$,Q,1))) XOR CRCL2)
|
|||
|
6260 CRC$=RIGHT$(CRC1$,1)+LEFT$(CRC1$,1) 'SET IT BACK!
|
|||
|
6270 NEXT Q
|
|||
|
6280 IF CRC$ <> MID$(V$,N,2) THEN ....... 'GOTO ERROR ROUTINE
|
|||
|
6290 REM * END OF CRC CALC
|
|||
|
9000 FOR I%=0 TO 255 ' INITIALIZE CRC TABLE
|
|||
|
9010 READ CRCTB(I%)
|
|||
|
9020 NEXT I%
|
|||
|
9025 RETURN
|
|||
|
9030 DATA 0, 4129, 8258, 12387, 16516, 20645, 24774, 28903
|
|||
|
9040 DATA -32504,-28375,-24246,-20117,-15988,-11859,-7730,-3601
|
|||
|
9050 DATA 4657, 528, 12915, 8786, 21173, 17044, 29431, 25302
|
|||
|
9060 DATA -27847,-31976,-19589,-23718,-11331,-15460,-3073,-7202
|
|||
|
9070 DATA 9314, 13379, 1056, 5121, 25830, 29895, 17572, 21637
|
|||
|
9080 DATA -23190,-19125,-31448,-27383,-6674,-2609,-14932,-10867
|
|||
|
9090 DATA 13907, 9842, 5649, 1584, 30423, 26358, 22165, 18100
|
|||
|
9100 DATA -18597,-22662,-26855,-30920,-2081,-6146,-10339,-14404
|
|||
|
9110 DATA 18628, 22757, 26758, 30887, 2112, 6241, 10242, 14371
|
|||
|
9120 DATA -13876,-9747,-5746,-1617,-30392,-26263,-22262,-18133
|
|||
|
9130 DATA 23285, 19156, 31415, 27286, 6769, 2640, 14899, 10770
|
|||
|
9140 DATA -9219,-13348,-1089,-5218,-25735,-29864,-17605,-21734
|
|||
|
9150 DATA 27814, 31879, 19684, 23749, 11298, 15363, 3168, 7233
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 27
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
9160 DATA -4690,-625,-12820,-8755,-21206,-17141,-29336,-25271
|
|||
|
9170 DATA 32407, 28342, 24277, 20212, 15891, 11826, 7761, 3696
|
|||
|
9180 DATA -97,-4162,-8227,-12292,-16613,-20678,-24743,-28808
|
|||
|
9190 DATA -28280,-32343,-20022,-24085,-12020,-16083,-3762,-7825
|
|||
|
9200 DATA 4224, 161, 12482, 8419, 20484, 16421, 28742, 24679
|
|||
|
9210 DATA -31815,-27752,-23557,-19494,-15555,-11492,-7297,-3234
|
|||
|
9300 DATA 689, 4752, 8947, 13010, 16949, 21012, 25207, 29270
|
|||
|
9310 DATA -18966,-23093,-27224,-31351,-2706,-6833,-10964,-15091
|
|||
|
9320 DATA 13538, 9411, 5280, 1153, 29798, 25671, 21540, 17413
|
|||
|
9330 DATA -22565,-18438,-30823,-26696,-6305,-2178,-14563,-10436
|
|||
|
9340 DATA 9939, 14066, 1681, 5808, 26199, 30326, 17941, 22068
|
|||
|
9350 DATA -9908,-13971,-1778,-5841,-26168,-30231,-18038,-22101
|
|||
|
9360 DATA 22596, 18533, 30726, 26663, 6336, 2273, 14466, 10403
|
|||
|
9370 DATA -13443,-9380,-5313,-1250,-29703,-25640,-21573,-17510
|
|||
|
9380 DATA 19061, 23124, 27191, 31254, 2801, 6864, 10931, 14994
|
|||
|
9390 DATA -722,-4849,-8852,-12979,-16982,-21109,-25112,-29239
|
|||
|
9400 DATA 31782, 27655, 23652, 19525, 15522, 11395, 7392, 3265
|
|||
|
9410 DATA -4321,-194,-12451,-8324,-20581,-16454,-28711,-24584
|
|||
|
9420 DATA 28183, 32310, 20053, 24180, 11923, 16050, 3793, 7920
|
|||
|
|
|||
|
|
|||
|
This method uses 128 * 6 BASIC statements per Xmodem packet or a
|
|||
|
miserly 768 BASIC statements per packet. And, if you want, the
|
|||
|
code can be tightened still more. Unfortunately, any further
|
|||
|
tightening that we could see would eliminate most of the already
|
|||
|
limited readability of the code.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Xmodem, CRC Xmodem, WXmodem
|
|||
|
|
|||
|
June 20, 1986 Page 28
|
|||
|
|
|||
|
----------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
|
|||
|
8. NOTES AND COMMENTS
|
|||
|
|
|||
|
|
|||
|
Please add your notes and comments here or send them to me and I'll get
|
|||
|
them added to the current copy on People/Link.
|
|||
|
|
|||
|
|
|||
|
1. This was originally set up to ADD 32 to the character on transmit
|
|||
|
and SUBTRACT 32 on receive. By using exclusive or with 64, the
|
|||
|
logic is the same on transmit and receive.
|
|||
|
|
|||
|
|
|||
|
2. The use of the SYN character was added at the request of several
|
|||
|
people who have coded Xmodem routines and have struggled valiantly
|
|||
|
to improve their error recovery routines. Peter Boswell 6/10/86
|
|||
|
|
|||
|
|
|||
|
3. The suggestion that ACK[sequence] be sent for every block received
|
|||
|
was added. Peter Boswell 6/10/86
|
|||
|
|
|||
|
|
|||
|
4. The original value for the ACK/NAK timeout was 10 seconds. This
|
|||
|
was changed to 15 seconds the situation where the receiver is
|
|||
|
operating at 300 baud and using X-Off to stop receipt of characters
|
|||
|
during disk I/O. Peter Boswell, 6/10/86
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|