10 декабря 2019 года    
Вторник | 06:39    
Главная
 Новости
Базы данных
Безопасность PC
Всё о компьютерах
Графика и дизайн
Интернет-технологии
Мобильные устройства
Операционные системы
Программирование
Программы
Связь
Сети
 Документация
Статьи
Самоучители
 Общение
Форум







Разделы / Всё о компьютерах / Модемы

Описание ZMODEM протокола.

        ------ -     - ----- ----   ----- -     -
            -- --- --- -   -  -  -- -     --- ---
          --   -  -  - -   -  -   - ----  -  -  -
        --     -     - -   -  -  -- -     -     -
        ------ -     - ----- ----   ----- -     -
       -------------------------------------------
          Описание ZMODEM протокола
         ---------------------------

    1.Пакеты.

   Фреймы ZMODEM имеют  отличие  от  блоков  XMODEM  протокола.
XMODEM блоки не используются по  следующим  причинам:
- размер блока ограничен 256 байтами;
- отсутствует поддержка  переменной длинны блоков;
- искажения в линии могут приводить к  искажению номера блока,
  и сигналов;
- трудно  определить  начало   и   конец   блока   при   потере
  синхронизации.

   2.ESC коды.

   ZMODEM  использует  при  передачи  8  битовые  коды   с   ESC
последовательностями базирующимися на связи ZMODEM данных с  ESC
символом ZDLE.
   ESC  коды  позволяют  иметь  переменную  длинну  пакетов  без
счетчика байт,что  позволяет  определить  начало  заголовка  без
измерения времени,исключить повторения и ошибки.
   Использование ESC  кодов  приводит  к  некоторому  увеличению
длинны пакетов.В худчшем  случае,когда  файл  состоит  из  одних
кодов ZDLE это 50%.
   Символ  ZDLE  является  специальным.Если  в  бинарных  данных
обнаружен символ ZDLE то это префикс  ZDLE  за  которым  следует
ZDLEE (символ с инвертированным 6 битом).
   Этот  специальный  символ  выбран  так-же  для   формирования
строки из пяти CAN для сигнала завершения работы ZMODEM .
   Приемная программа декодирует любую  последовательность  ZDLE
следующим образом:
    если байт с установленным 6 битом и сброшенным  пятым  равен
контрольному  символу  то  инвертируется  6  бит.Это   позволяет
устранить из передачи любые управляющие  символы  которые  могут
быть  посланы  коммуникационной  средой.Дополнительно   приемник
распознает как ESC символы 0177 и 0377.
   ZMODEM  использует  в  качестве  ESC  ZDLE,020,0220,021,0221,
023, и 0223.Приемник игнорирует 021,0221,023,и  0223  символы  в
потоке данных.

    3.Заголовок.

   Все фреймы ZMODEM начинаются с заголовка,который  может  быть
послан в бинарной ( BIN ) или шеснадцатиричной  (  HEX  )  моде.
ZMODEM использует единственый способ распознованиея  BIN  и  HEX
заголовков.Любой   из   заголовков   содержит   одиу   и    туже
последовательность информации:
- байт типа;
- четыре байта данных или параметры зависящие от типа фрейма.

2.Тип фрейма это целое число начиная с 0 до минимального
  значения передающей таблицы требуемой памяти. 
3.В будущем расширении ZMODEM может использовать старшие биты
  для индикации трех вариантов:
  F0 - флаг наименее значимого байта;
  P0 - наименее значимая позиция в файле;
  P3 - наиболее значимая позиция в файле.

         ------T----T----T----T----¬
         ¦ Тип ¦ F3 ¦ F2 ¦ F1 ¦ F0 ¦
         +-----+----+----+----+----+
         ¦ Тип ¦ P0 ¦ P1 ¦ P2 ¦ P3 ¦
         L-----+----+----+----+-----

   Рис1.Расположение флаговых байт в заголовке


   3.1 Бинарный заголовок с 16-битовой CRC.

   Бинарный  заголовок  передается  от  посылающей  программы  к
принимающей программе.ZDLE закодирован применительно к  XON/XOFF
контролю.
   Бинарный   заголовок   начинается    с     последовательности
ZPAD,ZDLE, ZBIN.Затем следует байт типа ,четыре  флаговых  байта
и два байта CRC-16,далее данные.

*,ZDLE,ZBIN,TYPE,F3/P0,F2/P1,F1/P2,F0/P3,CRC-1,CRC-2.


   3.1 Бинарный заголовок с 32-битовой CRC.

   Бинарный  заголовок  с  32-битовой  CRC   отличется   заменой
символа ZBIN на ZBIN32 и наличием четырех символов CRC.

*,ZDLE,ZBIN32,TYPE,F3/P0,F2/P1,F1/P2,F0/P3,CRC-1,CRC-2,CRC-3,CRC-4


   3.3 Шеснадцатиричный заголовок.

   Шеснадцатиричный   заголовок    используется,когда     следом
отсутствуют бинарные данные.Он имеет вид:

*,*,ZDLE,ZHEX,TYPE,F3/P0,F2/P1,F1/P2,F0/P3,CRC-1,CRC-2,CR,LF,XON

Все   байты   в   заголовке   должны   быть   представлены   как
шеснадцатиричные цыфры.

   3.4 Бинарный подпакет данных.

   Бинарный подпакет  данных  следует  за  бинарным  заголовком.
Подпакет содержит от 0  до  1024  байт  данных.Длинну  подпакета
рекомендуется выбирать в соответствии со скоростью передачи:
   256  при скорости менее 2400 бод;
   512  при скорости около 2400 бод;
   1024 при скорости более 4800 бод.
   Байт ZDLE кодируется при передачи.В конце  подпакета  следуют
два или четыре ZDLE,а затем CRC всего подпакета.

   4 Протокол передачи.

   Как  и  в  XMODEM  передача   прекращается   при   отсутствии
заголовка в течении времени ( обычн 1 мин ).

   4.1 Стартовая секция.

   В стартовой секции посылается имя файла и опции.
   В начале посылающая программа может  послать  строку  "rz",CR
переводя принимающую программу в командный  режим.Это  сообщение
может выдаваться на экран.
   Затем  может  быть  послан  ZRQINIT.В  ответ  на  что  обычно
принимающая  программа  посылает   ZRINIT   без   задержки   или
ZCHALLENGE для проверки посылающей программы.
   Если принимающая  программа  принимает  ZRINIT,это  индикация
того,что посылающая программа не активна.
   Посылающая  программа  может   послать   опцию   ZSINIT,чтобы
заставить     принимающую     программу     определить      Attn
последовательность.
   Если   ZSINIT   заголовок   содержит   ESCCTL   или   ESC8,то
используется  HEX  заголовок   и   приемник   активизирует   ESC
моду,прежде чем читать следующие данные подпакета.

   4.2 Передача файла.

   Передатчик   посылает   ZFILE     заголовок     с     опциями
преобразования,управления  и  передачи.Затем  посылается   ZCRCW
подпакет содержащий  имя  файла,длинну,модифицированную  дату  и
другую информацию идентичную с Ymodem.
   Приемник может  ответить  ZSKIP  заголовком,который  заставит
передатчик перейти к следующему файлу.
   ZRPOS заголовок от  приемника  активизирует  передачу  данных
файла с позиции заданной в ZRPOS.
   Передатчик  посылает  ZDATA  бинарный  заголовок  с  позицией
файла.
   Приемник сравнивает положение файла с указателем  в  ZDATA  с
количеством успешно  принятых  байт.Если  оно  не  совпадает  то
посылается ZRPOS с правильным значением.
   Данные  подпакета  завершаются  ZCRCG  и  CRC   за   которыми
немедленно следует следующий пакет.
   Если подпакет завершается ZCRCW  то  передатчик  ждет  ответа
прежде,чем  посылать  следующий  фрейм,что  позволяет  приемнику
записать буфер,прежде чем следующие данные будут приняты.
   Нулевая длинна файла может быть использована  в  качестве  не
рабочего  пакета  для  предупреждения  приемника,что  данные  не
будут посланы немедленно.
   При   отсутствии   фатальной   ошибки,передатчик     возможно
достигнет  конца  файла.Если  обнаружен  конец  файла  то  фрейм
завершается ZCRCE заголовком,который  не  извлекается  в  случае
ошибки.
   Передатчик посылает ZEOF заголовок с завершающим смещением  в
файле равным количеству байт  в  файле.Приемник  сравнивает  это
число с  количеством  принятых  байт.Если  приемник  принял  все
байты он закрывает файл.Если  файл  закрыт  успешно,то  приемник
отвечает  ZRINIT.Если  приемник  не  принял  все  байты,то  ZEOF
игнорируется.Если приемник не может закрыть  файл,то  посылается
ZFERR.
   Если ZTSPARS опция используется,то  приемник  перемещается  к
позиции в файле заданной ZDATA.

   4.3 Заключительная секция.

   Передатчик   завершает   секцию   заголовком    ZFIN.Приемник
подтверждает это своим ZFIN.
   Когда  передатчик   принимает   подтверждающий   заголовок,он
посылает два символа "оо".Приемник ожидает "о" и  затем  выходит
независимо от того приняты они или нет.

    4.4 Аварийная секция.

    Если  приемник  принимает  данные   непрерывным   потоком,то
сперва  посылается   Attn   последовательность   с   требованием
прекратить     передачу      данных,а        затем        cancel
последовательность.Cancel последовательность состоит  из  восьми
CAN символов и десяти BS.Zmodem требует  пять  CAN,другие  нужны
для уверенности.
  { 24,24,24,24,24,24,24,24,8,8,8,8,8,8,8,8,8,8 }

   5.Виды потоков.

   5.1 Поток по образцу.

   Если приемник может  перенаправить  последовательный  в/в  на
диск и если передатчик может  использовать  обратный  канал  для
контроля  наличия  данных  без  ожидания,то  можно  использовать
полный поток  без  ответной  Attn  последовательности.Передатчик
начинает  передавать  с  ZDATA  заголовка  и  продолжает   ZCRCG
подпакетом  данных.Когда   приемник   обнаруживает   ошибку   он
посылает  Attn  последовательность  и   затем   посылает   ZRPOS
заголовок с корректной позицией в файле.
   В конце каждого  передаваемого  подпакета  данных  передатчик
проверяет присутствие заголовка  ошибок  от  приемника.Обнаружив
его передатчик выбирает из данных обратного канала ZPAD или  CAN
и выполняет требуемые действия.
   Другие  символы  инкримируют   счетчик,который   сбрасывается
когда  передатчик  ждет  заголовок  от  приемника.Если   счетчик
переполняется передатчик посылает следующий подпакет  как  ZCRCW
и ждет ответа.
   ZPAD   индицирует   ошибку   приемника.CAN    это     попытка
пользователя остановить  передачу.Если  один  из  этих  символов
будет  обнаружен,то   посылается   пустой   пакет   ZCRCE.Обычно
приемник посылает ZRPOS или другой  ошибочный  заголовок,который
заставляет передатчик прекратить передачу и выполнить команду.
   Если  ZPAD  или  CAN  не  обнаружен  в  течении   таймаута,то
посылается ZRPOS заголовок.Затем читается ответный  заголовок  и
выполняется команда.
   ZRPOS  заголовок  сбрасывает  текущее  смещение  в  файле  на
корректную позицию.Если возможно,то передатчик  должен  очистить
выходной буфер  и/или  сеть  от  не  переданных  данных.Приемник
должен  так-же  сбросить  буфер,прежде  чем  начнется   передача
корректных  данных.Следующие  передаваемые  данные  должны  быть
ZCRCW фреймом для гарантированного  полного  заполнения  сетевой
памяти.
   Если  приемник  дает  ZACK  заголовок  с  адресом,который  не
совпадает с адресом  передатчика,он  игнорируется  и  передатчик
ждет  другой  заголовок.ZFIN,ZABORT   или   ZTIMEOUT   завершают
секцию.ZSKIP завершает процесс для данного файла.

   5.2 Полный поток с обратным прерыванием.

   Выше описанный метод  не  может  быть  использован  если  нет
возможности принимать обратный поток данных.Алтернативный  метод
заставляет  приемник   прерывать   передатчик,когда   обнаружена
ошибка.
   Приемник  может  прервать  передатчик  контрольным  символом,
break  сигналом  и/или  их  комбинацией  как  указано   в   Attn
последовательности.После   этого   приемник   посылает     ZRPOS
заголовок, заставляя  передатчик  повторно  передать  потерянные
данные.
   Когда передатчику отвечают прерыванием он читает заголовок  и
выполняет действия описанные в предыдущем парагрофе.

   5.3 Полный поток со скользящими окнами.

   Если не один из  описанных  методов  не  применим,то  не  все
потеряно.Если передатчик может буферизировать  ответы  премника,
то передатчик может использовать ZCRCQ подпакеты,чтобы  получить
ACK  от  приемника  без  прерывания  передаваемых   данных.После
достаточного  количества  ZCRCQ   передатчик   может   прочитать
заголовки, которые поступили.
   Проблема  этого  метода  вероятно   состоит   в   черезмерном
количестве ответов.Это может привести к  переполнению  приемного
буфера передатчика прежде чем будет послан ZRPOS.

   5.4 Сегментированный поток.

   Если приемник не может перенаправить выходной поток на  диск,
тогда используется ZRINIT фрейм определенной длинны  который  не
переполняет буфер.Передающая программа посылает  ZCRCW  подпакет
и ждет ZACK  заголовок  прежде  чем  послать  следующий  сегмент
файла.
   Если передающая  программа  может  принимать  обратный  поток
данных,тогда можно снова передавать большие блоки.

   6. Attention последовательности.

   Принимающая  программа  посылант   Attn   последоватеельности
всякий раз когда обнаруживает  ошибку  или  необходимо  прервать
передачу.
   По  умолчанию   строка   Attn   пуста.Принимающая   программа
обнуляет Attn строку перед каждой секцией.
   Передатчик определяет Attn последовательность в своих  опциях
ZSINIT фрейма.Attn строка завершается нулем.
     Два символа несут специальную функцию:
     335q   - break сигнал
     336q   - пауза на одну секунду.

   7.Типы фреймов.

ZRQINIT

   Посылается передающей программой.Посылка заставляет принима-
   ющую программу послать свой ZRINIT заголовок.Это позволяет 
   избежать начальной задержки как в Xmodem или Kermit.Передающая
   программа может повторить посылку если ответ не получен сразу.

ZRINIT

   Посылается принимающей программой.ZF0 и ZF1 содержат битовое 
   поле указательных флагов приемника:

CANCRY   008  приемник может шивровать
CANFDX   001  пр-к может послать и принять FDX
CANOVIO  002  пр-к может принимать данные во время дискового в/в
CANBRK   004  пр-к может послать break сигнал
CANCRY   010  пр-к может шивровать
CANLZW   020  пр-к может распаковывать
CANFC32  040  пр-к может использовать 32 битовую кс
ESCCTL   100  пр-к ждет управляющий символ к ESC
ESC8     200  пр-к ждет восемь бит к ESC

ZP0 и ZP1 содержат размер приемного буфера в байтах или 0 если
разрешена передача без остановки.

ZSINIT

   Передатчик посылает флаги для бинарного пакета данных
   завершающихся ZCRCW.ZF0 содержит:

TESCCTL  0100 передатчик ожидает управляющий символ к ESC
TESC8    0200 передатчик ожидает восемь бит к ESC

Подпакет данных содержит завершающуюся нулем Attn после-
довательность максимальной длинны 32 байта включая ноль.

ZACK

   Подтверждение ZSINIT фрейма,ZCHALLENGE,ZCRCQ или ZCRW
   подпакетов данных.ZP0..ZP3 содержат смещение в файле.Ответ
   на ZCHALLENGE содержит то-же 32 битовое число,что и было
   принято в ZCHALLENGE.

ZFILE

   Этот фрейм отмечает начало попытки передачи файла.
   ZF0,ZF1 и ZF2 могут содержать опции.Значение 0 в каждом
   из этих байт означает специальную обработку.Опции указанные
   для приемника замещают опции указанные для передатчика за
   исключением ZCBIN.ZCBIN для передатчика замещается любой
   другой опцией преобразования доступной приемнику,исключая
   ZCRESUM.ZCBIN от приемника замещает любые другие опции и
   посылается передатчику.

     ZF0 - опции преобразования.

   Если приемник не распознает опции преобразования,то
   могут быть применены умалчиваемые опции.

ZCBIN     бинарная передача ( безусловный запрет 
          преобразований )
ZCNL      преобразование конца строки CR/LF и  NUL
ZCRECOV   восстановление ( результат прерванной передачи файла )
ZCREVOV   используется для добавления данных к файлу.Если
          назначенный файл существует и он не длиннее исходного
          происходит добавление в указанный файл и передача
          начинается с указанного смещения.

     ZF1 - опции управления

   Если приемник не распознает опции управления,то файл
   должен передаваться обычным образом.

ZMSKNOLOC бит инструктирует приемник пропускать файл если
          приемник не имеет файла с таким же именем.
ZMNEWL    файл передается если он отсутствует.Иначе пере-
          даваемый файл переписывает существующий если он 
          более новый или длиннее.
ZMCRC     сравнивается исходный и существующий файл.Пере-
          дается если CRC не совпадает.
ZMAPND    добавляет исходный файл к существующему ( если есть )
ZMCLOB    замещает существующий файл.
ZMDIF     передается файл если он отсутствует.Иначе пере-
          писывается если имеет отличную длинну и дату.
ZMPROT    защита приемного файла.Файл передается только в
          случае отсутствия.
ZMNEW     передает файл если он отсутствует иначе переписывает
          если он более новый.

     ZF2 - транспортные опции.

   Если приемник не распознает транспортые опции файл копи-
   руется без преоразований:

ZTLZW     lempel-ziv сжатие.
ZTCRYPT   зашифровано.
ZTRLE     длинна кодируется.

     ZF3 - расширенные опции.

ZTSPARS   
   
   специальный процес для разряженных файлов.Каждый файловый 
   сегмент передается как отдельный фрейм,причем   фреймы не 
   должны быть непрерывными.Передатчик  должен заканчивать 
   каждый сегмент ZCRCW и ожидать ZACK для  уверенности,что 
   данные не потеряны.ZTSPARS и ZCNL не могут быть использованы
   в этом случае.

ZSKIP
 
   посылается приемником в ответ на ZFILE,заставляя передатчик 
   перейти к следующему файлу.

ZNAK  
 
   индицирует,что последний заголовок был искажен.

ZABORT
   
   посылается приемником для завершения,когда требует 
   пользователь.Передатчик отвечает ZFIN.

ZRPOS 
 
   посылается приемником для указания передатчику смещения в 
   файле в ZP0..ZP3.

ZDATA  

   ZP0..ZP3 указывает смещение в файле.Затем следует один или 
   более подпакетов данных.

ZEOF 

   Передатчик сообщает о конце файла.ZP0..ZP3 указывает 
   смещение в файле.

ZFERR  

   ошибка чтения или записи.Эквивалент ZABORT.

ZCRC  

   требование приемника и ответ передатчика для вычисления CRC,
   которая передается в ZP0..ZP3.

ZCHALLENGE

   требование передатчика послать эхом случайное число в 
   ZP0..ZP3 в ZACK фрейме.Посылается приемной программой к 
   передающей для проверки,что связь действует.

ZCOMPL    

   требование завершения.

ZCAN    

   этот фрейм есть псевдокоманда возвращаемая gethdr() в ответ
   на Abort последовательность.

ZFREECNT   

   вызывающая программа требует ZACK фрейм с ZP0..ZP3 содержащим
   количество свободных байт в файловой системе.Ноль означает 
   неопределенное количество.

ZCOMMAND   
 
   посылается в бинарном фрейме.ZF0 содержит ноль или  ZACK1.
   Затем следует ZCRCW подпакет данных с ASCII текстовой коман-
   дной строкой завершающейся нулем.Эта команда предназначена 
   для выполнения OS и должна иметь '!' в качестве первого 
   символа.Иначе команда предназначена для принимающей программы.
     Если обнаружена неверная команда,то приемник отвечает ZCOMPL 
   с указанием в ZP0..ZP3 кода ошибки.Если ZF0 содержит ZACK1,
   то приемник отвечает ZCOMPL с 0 статусом.
     В других случаях приемник отвечает ZCOMPL,когда операция 
   завершена.Значение выходного кода команды сохраняется в 
   ZP0..ZP3.0-нормальное завершение.
     Если команда вызывает передачу файла,то передатчик обнаружит
   ZRQINIT фрейм от другого компьютора пытающегося послать файл.
   Передатчик проверяет ZF0 принятого ZRQINIT для проверки своего
   ZRQINIT.Есть ли неверная команда для принимающей программы.
      Если приемная программа не воспринимает команду DownLoad,
   она может вывести эту команду на дисплей через стандартный 
   error выход и затем вернуть ZCOMPL.

     8.2 Примеры.

8.2.1. Пример передачи файла.

     Передатчик                        Приемник
   ----------------------------------------------
     "rz",
     ZRQINIT(0)
                                     ZRINIT
     ZFILE
                                     ZRPOS
   ----------------------------------------------¬
   ¦ ZDATA date ...                              ¦
   ¦                                 [ZACK,ZNAK] ¦
   L----------------------------------------------
     ZEOF
                                     ZRINIT
     ZFIN
                                     ZFIN
     "OO"

8.2.2. Пример кодировщика данных передатчика.


    ZSend_Byte( current_byte )

    registers current_byte ;
    {
      static     last_byte ;

      switch( current_byte & 0X7F )
      {
        case 13 : if ( last_byte & 0X7F ) != '@' goto send;
        case 16 :
        case 17 :
        case 19 :
        case 24 : Send_Byte( ZDLE );
                  current_byte ^= 0X40;
  send:
        default : Send_Byte( last_byte = current_byte );
      }

    }  // ZSend_Byte


     8.3 Содержание фрейма ZFILE.

Имя файла 

   при этом pathname преобразуется в filename и посылается как 
   завершенная нулем ASCII строка следующего вида:
     - буквы должны быть преобразованы в маленькие;
     - приемник должен принимать большие и маленькие буквы;
     - когда передача осуществляется между различными ОС 
       имя файла должно быть приемлемо для обоих.

Длинна    
   
   длинна файла сохраняется как цифровая строка содержащая 
   количество байт в файле.Zmodem использует длинну файла 
   только для оценки.Она может быть использована для оценки 
   времени передачи и сравнения с количеством свободного места 
   на диске.Файл может увеличиваться в момент передачи,но все 
   данные будут посланы.

Модифицированная дата

   Отделяется пробелом от длинны.Модифицированная дата посы-
   лается как восьмеричное число времени в секундах от 1.1.70
   до времени последней модификации файла.Нулевая дата озна-
   чает,что дата неизвестна и принимается равной текущей.

Файлова мода

   Отделяется пробелом от даты.Файловая мода сохраняется как 
   восьмериченое число.rs(1) проверяет файловую моду на
   0x8000 бит,который определяет unix тип файла.Такие файлы
   посылаются от другой unix системы.Такой файл не передается
   иначе.

Серийный номер

   Отделяется пробело от моды.Серийный номер передается как 
   восьмеричное число.Программа которая не имеет номера,
   устанавливает этот параметр равным нулю.

*Оставшееся количество файлов

   Это поле содержит десятичное число файлов,для отправки,
   включая текущий.

*Оставшееся количество байт

   Это поле содержит десятичное число оставшегося количества 
   байт включая текущий файл.

Тип файла

   Кодируется десятичным числом.Приемник использует это поле
   для оптимизации.
     0 - последовательный файл не специального типа;
     1 - другой тип.

   Информация завершается нулем.Если только имя файла пере-
   дается,то двумя нулями.Длинна информации должна быть
   меньше 1к.Типичная длинна 64 байта.

 Описание ZMODEM протокола.
Лента новостей


2006 (c) Copyright Hardline.ru