Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Протокол ZMODEM


1. Пакеты.

Фреймы ZMODEM имеют отличие от блоков XMODEM протокола. XMODEM блоки не используются по следующим причинам:

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

2.ESC коды.

ZMODEM использует при передачи 8 битовые коды с ESC последовательностями базирующимися на связи ZMODEM данных с ESC символом

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 заголовков.Любой из заголовков содержит одиу и туже последовательность информации:

  • байт типа;
  • четыре байта данных или параметры зависящие от типа фрейма.
  1. Тип фрейма это целое число начиная с 0 до минимального значения передающей таблицы требуемой памяти.
  2. В будущем расширении ZMODEM может использовать старшие биты для индикации трех вариантов:
    • F0 - флаг наименее значимого байта;
    • P0 - наименее значимая позиция в файле;
    • P3 - наиболее значимая позиция в файле.
             +-----+----+----+----+----+
             ¦ Тип ¦ F3 ¦ F2 ¦ F1 ¦ F0 ¦
             +-----+----+----+----+----+
             ¦ Тип ¦ P0 ¦ P1 ¦ P2 ¦ P3 ¦
             +-----+----+----+----+----+
   Рис 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. Примеры

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

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

8.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 байта.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
21K
27 сентября 2006 года
omka
1 / / 27.09.2006
Мне нравитсяМне не нравится
27 сентября 2006, 18:46:34
Подскажите плиз на счет кодирования служебных смиволов (ZDLE и т.д.):

1) кодируется ли байт если он равен служебному и встретился в бинарном заголовке пакета?

2) я так понял кодирование служебного символа осуществляется так:
- не береться во внимание символ ZDLE;
- служебный_символ ^= 0x40.
или как?
Например, надо передать данные:
... 0x9 | ZDLE | ZDLE | 0x03 |...
после кодирования получаем:
... 0x9 | ZDLE | ZDLE ^ 0x40 | 0x03 |...
после декодирования получаем:
... 0x9 | ZDLE | ZDLE | 0x03 |...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог