Protokół XMODEM

przez | 5 marca 2017

Protokół XMODEM został stworzony przez Warda Chritensena w 1979 roku. Jest to pakietowy asynchroniczny szeregowy protokół transmisji plików z potwierdzeniem.

Definicja

Protokół XMODEM w swej pierwotnej specyfikacji określał długość pakietów danych 128-bajtowych z obsługują sumy kontrolnej. Związana to było z długością bloku stosowanego w systemach CP/M. Późniejsze specyfikacje rozszerzyły go o CRC16 i 1024-bajtowy blok danych.  Zaletą tego protokołu jest prostota oraz jego powszechność, niemal całe oprogramowanie komunikacyjne go wspiera, do wad należy zaliczyć jego stosunkowa powolność. Medium transmisyjne określone zostało jako asynchroniczne, 8-bitowe łącze szeregowe bez kontroli parzystości i z jednym bitem STOP.

Poniżej określone są to znaki kontrolne służące do sterowania przepływu.

Symbol Opis Wartość
SOH Początek nagłówka (Start of Header) 0x01
EOT Koniec transmisji (End of Transmission) 0x04
ACK Potwierdzenie (Acknowledge) 0x06
NAK Odrzucony (Not Acknowledge) 0x15
ETB Koniec transmisji blokowej (End of Transmission Block) 0x17
CAN Cancel 0x18
C Znak ASCII “C” 0x43

Budowa pakietu XMODEM

  • Bajt 1 pakietu może przyjmować tylko wartości SOH, EOT, CAN lub ETB, każda inna jest traktowana jako błąd.
  • Bajty 2 i 3 określają kolejny numer pakietu. Pierwszy bajt kolejnego numeru pakietu zaczyna się od wartości 1 i jest zwiększany po każdym jego poprawnym przesłaniu, po jego przepełnieniu przyjmuje wartość 0 jeśli istnieje więcej niż 255 pakietów do przesłaniana. Drugi bajt obliczany jest na zasadzie 255 – (nr. pakietu), jest to forma funkcji kontrolnej, po dodaniu obu bajtów razem wynik zawsze winien być równy 0xFF.
  • Bajty 4-131 tworzą blok danych, bez określenia i ograniczenia przesyłanych danych
  • Bajt 132 zawiera sumę kontrolną obliczoną tylko z bloku danych.
    Format budowy pakietu jest przedstawiona w Tabeli 1
Byte 1 Byte 2 Byte 3 Bytes 4-131 Byte 132
Start of Header Packet Number ~(Packet Number) Packet Data CheckSum

Tabela 1 – Budowa pakietu

Protokół Xmodem został rozszerzony w 1990 roku o sumę kontrolną opartą na kodzie CRC16. Standard XmodemCRC format bloku nie zmieniła się, został zastąpiony bajt sumy kontrolnej na 16-bitową sumę CRC.

  • Bajty 132 oraz 133 tworzą 16-bitowy CRC. Najbardziej znaczący bajt CRC znajduje się w bajcie 132. CRC16 jest obliczana tylko z bajtów bloku danych (4 – 131).
Byte 1 Byte 2 Byte 3 Bytes 4-131 Bytes 132-133
Start of Header Packet Number ~(Packet Number) Packet Data 16-bit CRC

Tabela 2. Pakiet XmodemCRC

Transmisja i kontrola przepływu

Odbiornik jest urządzeniem rozpoczynającym transmisję. Wysyła on znaki synchronizujące NAK lub “C” w przypadku XmodemCRC i oczekuje na odbiór pierwszego pakietu. Po odebraniu każdego poprawnego pakietu potwierdza to do nadajnika znacznikiem ACK, który w odpowiedzi powinien wysłać kolejny pakiet lub w przypadku zakończenia transmisji znak EOT. Odbiornik oczekuje na pierwszy pakiet danych przez około 10sek, wysyłając w tym czasie pakiety synchronizujące NAK/”C”, po przekroczeniu tego czasu następuje przerwanie transmisji. Nadajnik ten czas ma wydłużony do 1 min przed rozpoczęciem transmisji pierwszego bloku. Retransmisja pakietu następuje w wyniku braku potwierdzenia jego odbioru lub po przyjęciu znaku NAK i następuje w wyniku:

  1. Błędu ramki na którymkolwiek przesłanym bajcie (Framing error)
  2. Wystąpienia błędu przepełnienia na dowolnym bajcie (Overrun error)
  3. Duplikacji wysłanego pakietu
  4. Błędu poprawności wyliczonej sumy kontrolnej
  5. Przekroczeniu czasu odbiornika (brak otrzymanego pakietu w przeciągu 1 sek.)
  6. Braku poprawnego odbioru ACK przez nadajnik

Dla nadajnika i odbiornika przyjęto założenie, że w przypadku błędu następuje mechanizm retransmisji pakietów (zwykle 10 razy). Po przekroczeniu ilości retransmisji urządzenie oczekuje na reakcję użytkownika lub automatycznie zmusza odbiornik do rozpoczęcia całego procesu transmisji poprzez wysłanie znaku CAN.

Poniżej przedstawiono schemat procesu transmisji Xmodem opartym na sumie kontrolnej wraz z przykładowymi retransmisjami błędnych pakietów.

Sender Flow Receiver
 <— NAK
Time out after 3 sec.
<— NAK
 | SOH | 0x01 | 0xFE | Data [0-127] | Chksum | —> Packet OK
<— ACK
 | SOH | 0x02 | 0xFD | Data [0-127] | Chksum | —> Line hit during transmission
<— NAK
 | SOH | 0x02 | 0xFD | Data [0-127] | Chksum | —> Packet OK
<— ACK
 | SOH | 0x03 | 0xFC | Data [0-127] | Chksum | —> Packet OK
 ACK get garbaged <— ACK
 | SOH | 0x03 | 0xFC | Data [0-127] | Chksum | —> Duplicate packet
<— NAK
 | SOH | 0x04 | 0xFB | Data [0-127] | Chksum | —> UART framing err on any byte
<— NAK
 | SOH | 0x04 | 0xFB | Data [0-127] | Chksum | —> Packet OK
<— ACK
 | SOH | 0x05 | 0xFA | Data [0-127] | Chksum | —> UART overrun err on any byte
<— NAK
 | SOH | 0x05 | 0xFA | Data [0-127] | Chksum | —> Packet OK
<— ACK
 EOT —> Packet OK
 ACK get garbaged <— ACK
 EOT —> Packet OK
 Finished <— ACK

W przypadku protokołu XmodemCRC schemat transmisji wygląda następująco:

Sender Flow Receiver
<— „C”
Time out after 3 sec.
<— „C”
| SOH | 0x01 | 0xFE | Data [0-127] | CRC16 | —> Packet OK
<— ACK
| SOH | 0x02 | 0xFD | Data [0-127] | CRC16 | —> Line hit during transmission
<— NAK
| SOH | 0x02 | 0xFD | Data [0-127] | CRC16 | —> Packet OK
<— ACK
EOT —> Packet OK
ACK get garbaged <— ACK
EOT —> Packet OK
Finished <— ACK

W przypadku gdy nadajnik nie obsługuje protokołu transmisji XmodemCRC, proces uzgadniania pomiędzy urządzeniami wygląda następująco:

Sender Flow Receiver
<— „C”
Time out after 3 sec.
<— NAK
Time out after 3 sec.
<— „C”
Time out after 3 sec.
<— NAK
| SOH | 0x01 | 0xFE | Data [0-127] | Chksum | —> Packet OK
<— ACK
| SOH | 0x02 | 0xFD | Data [0-127] | Chksum | —> Line hit during transmission
<— NAK
| SOH | 0x02 | 0xFD | Data [0-127] | Chksum | —> Packet OK
<— ACK
EOT —> Packet OK
ACK get garbaged <— ACK
EOT —> Packet OK
Finished <— ACK

2 komentarze do „Protokół XMODEM

Dodaj komentarz