Введение
Протокол передачи файлов YMODEM — это протокол передачи файлов, используемый между микрокомпьютерами, соединенными друг с другом через модемы. Он в основном применялся для передачи файлов в системы электронных досок объявлений (BBS) и из них. YMODEM был разработан Чаком Форсбергом как расширение протокола XMODEM и впервые реализован в его программе CP/M YAM. Изначально также известный как YAM, он был официально назван "YMODEM" в 1985 году Уордом Кристенсеном, автором оригинального XMODEM. YMODEM расширил XMODEM тремя способами, объединив возможности, встречающиеся в других расширенных версиях XMODEM. Как и XMODEM CRC, YMODEM заменил 8-битную контрольную сумму на 16-битную циклическую проверку избыточности (CRC), но сделал её стандартным методом коррекции ошибок вместо необязательного. От TeLink он позаимствовал заголовок "блок 0", который передавал имя файла и его размер, что позволило осуществлять пакетную передачу (несколько файлов в одном сеансе) и избавило от необходимости добавлять заполнение в конце файла. Наконец, YMODEM позволил увеличить размер блока с исходных 128 байт данных до 1024, как в XMODEM 1k, что значительно повысило скорость передачи данных на более быстрых модемах. Форсберг разработал стандарт, предусматривающий все эти функции как опции, позволяя одному драйверу протокола переключаться на XMODEM CRC или даже XMODEM при подключении к системам, не поддерживающим YAM. Он полагал, что программисты захотят реализовать как можно больше этих функций на любой платформе. Он был разочарован, обнаружив, что большинство реализаций предоставляют лишь размер блока 1k с CRC 16, не реализуя "блок 0", но при этом продолжая использовать название YMODEM. В результате появилось множество несовместимых реализаций YMODEM, и для обозначения версий, поддерживающих полный стандарт, стало использоваться название YMODEM Batch.
YMODEM is a file transfer protocol used between microcomputers connected together using modems. It was primarily used to transfer files to and from bulletin board systems. YMODEM was developed by Chuck Forsberg as an expansion of XMODEM and was first implemented in his CP/M YAM program. Initially also known as YAM, it was formally given the name "YMODEM" in 1985 by Ward Christensen, author of the original XMODEM. YMODEM extended XMODEM in three ways, combining features found in other extended XMODEM varieties. Like XMODEM CRC, YMODEM replaced the 8 bit checksum with a 16 bit cyclic redundancy check (CRC), but made it the default form of correction instead of optional. From TeLink it added the "block 0" header that sent the filename and size, which allowed batch transfers (multiple files in a single session) and eliminated the need to add padding at the end of the file. Finally, YMODEM allowed the block size to be increased from the original 128 bytes of data to 1024, as in XMODEM 1k, which greatly improved throughput on faster modems. Forsberg built the standard with all of these features as runtime options, allowing a single protocol driver to fall back to XMODEM CRC or even XMODEM when connecting to non YAM systems. He believed that programmers would want to implement as many of these features as possible on any given platform. He was dismayed to find that the majority of implementations were actually providing nothing more than 1k block size with CRC 16, failing to implement the "block 0" while continuing to use the YMODEM name. The result was the release of many mutually incompatible YMODEM implementations, and the use of the name YMODEM Batch to clearly indicate those versions that did support the complete standard.
XMODEM
Первоначальный XMODEM был очень простым протоколом, и это стало причиной его успеха; его можно было реализовать практически на любом компьютере того времени, даже на тех, у которых были очень ограниченные процессоры и память. Он работал, разбивая передаваемые данные на пакеты по 128 байт, добавляя 3-байтовый заголовок и 1-байтовый контрольный блок (footer) с контрольной суммой, и отправляя полученные 132-байтовые пакеты последовательно. Принимающий компьютер пересчитывал контрольную сумму на основе 128 байт данных, и если она совпадала с контрольной суммой, отправленной в контрольном блоке, он отправлял в ответ , а если не совпадала – . Когда отправитель получал , он отправлял следующий пакет, а при получении – повторно отправлял последний. В протоколе было несколько проблем. Использование простой контрольной суммы означало, что некоторые распространенные ошибки могли оставаться незамеченными. Небольшой размер пакета и необходимость ожидания или приводили к снижению производительности на высокоскоростных каналах связи или каналах с большой задержкой. Наконец, поскольку передача не содержала информации о файле, каждый файл приходилось запускать вручную, что могло быть утомительно при передаче множества небольших файлов. Решения этих проблем были разработаны в начале 1980-х годов. XMODEM CRC заменил контрольную сумму на 16-битную циклическую проверку избыточности (CRC), которая была гораздо более устойчива к распространенным ошибкам. XMODEM 1k увеличил размер пакета с 128 до 1024 байт, что повысило производительность на высокоскоростных соединениях, а другие протоколы, такие как WXMODEM и SEAlink, вместо этого внедрили системы скользящего окна для повышения производительности и снижения задержки, хотя и за счет некоторой сложности. Другие протоколы, такие как TeLink и MODEM7, добавили информацию о файлах, чтобы одна передача могла содержать несколько файлов, позволяя отправлять пакеты файлов одной командой.
YMODEM (Яндекс)
Чак Форсберг, автор CP/M "Yet Another Modem program", или YAM, решил написать единый драйвер протокола, поддерживающий больше функций, чем XMODEM, и назвал его YMODEM. При начале передачи пользователи могли указывать желаемые опции в командной строке, например, запрашивая использование CRC. Протокол был разработан таким образом, чтобы сначала пытаться использовать указанный режим, но при необходимости корректно переключаться на те возможности, которые реализованы в удалённом программном обеспечении.
Отменить
Одна из проблем оригинального XMODEM заключалась в отсутствии чёткого способа прервать передачу после её начала. Стандартным решением было отправлять символ 's' в каждый последующий пакет, если пользователь этого требовал. Поскольку протокол XMODEM устанавливал ограничение в десять символов 's' для отмены отправки, а каждый пакет мог отправляться в течение секунды, это приводило к десятисекундной задержке, в течение которой отправитель непрерывно отправлял данные, которые просто игнорировались. Некоторые реализации добавили возможность отправки символа '¬' вместо 's' или 'E' в конце принятого пакета для указания на прерывание. К сожалению, существовала вероятность, что символ '¬' мог быть сгенерирован помехами в линии связи и вызвать ложное прерывание. YAM немного изменил этот механизм, потребовав два символа 's' подряд, что немедленно приводило к "мягкому прерыванию" на стороне отправителя.
КРС
В XMODEM CRC была добавлена поддержка CRC. Это было очень простое изменение оригинального протокола: по запросу, получатель пытался инициировать передачу, отправляя начальный символ вместо . Если удаленный отправитель поддерживал опцию CRC, он начинал отправлять пакеты как обычно, но с 16-битным CRC в конце каждого пакета вместо однобайтовой контрольной суммы. YAM поддерживал эту опцию без каких-либо изменений.
1 тыс.
В XMODEM 1k были введены пакеты размером 1024 байта. Эта версия не изменила управляющий символ, передаваемый получателем, поэтому отправитель не мог узнать, поддерживает ли получатель пакеты большего размера. Вместо этого XMODEM 1k рассматривался как отдельный протокол на обоих концах соединения. При установлении такого соединения отправитель мог выбирать отправку пакетов размером 1024 байта или 128 байт, указывая на больший размер специальным символом в заголовке, а не обычным. Как правило, меньшие пакеты использовались только для последних нескольких пакетов, чтобы избежать отправки большого количества дополнений. 1k также предполагал использование CRC для всех соединений. YAM поддерживал 1k без изменений.
Нулевой пакет
Для поддержки автоматизированных передач почты FidoNet, MODEM7 ввёл возможность отправки имени файла в виде обычного текста перед отправкой первого блока данных. Это было ненадежно, и TeLink улучшил это, поместив имя файла и, опционально, другие данные, такие как дата создания и длина файла, в полный 128-байтный пакет. XMODEM начинал передачу с пакета номер один, поэтому TeLink отправлял этот пакет как номер ноль. Этот "нулевой пакет" или "блок ноль" стал распространённым в других системах FidoNet, таких как SEAlink и другие. YAM поддерживал формат нулевого пакета, но он игнорировался многими сторонними реализациями YMODEM. Когда одна реализация пыталась отправить нулевой пакет версии, которая его не поддерживала, получатель естественно отбрасывал пакет, поскольку нулевой пакет является недопустимым. Отправитель тогда воспринимал это как ошибку передачи и пытался отправить пакет снова, повторяя попытку десять раз, прежде чем передача завершалась неудачей. По причинам, которые не совсем ясны, многие реализации YMODEM не реализовали эту функцию. Поскольку они не знали о ней, они отправляли запрос, что приводило к серии повторных попыток передачи, прежде чем передача завершалась неудачей. Это означало, что если пользователь выбирал использование совместимого YMODEM с несовместимой версией, передача завершалась неудачей. Тем не менее, такие несовместимые версии были распространены. В результате, YMODEM и YMODEM Batch часто указывались как два отдельных протокола. Дальнейшую путаницу создавало сходство между XMODEM 1k и этими несовместимыми YMODEM, которые были настолько похожи, что их часто ошибочно указывали как один и тот же протокол.
Поддержка потоковой передачи
YMODEM G – это потоковая разновидность, используемая для соединений без ошибок. Он не дожидается получения подтверждения (ACK) перед отправкой следующего пакета. Протокол быстрее, чем YMODEM, поскольку между пакетами не возникает задержек, но не имеет возможности исправления ошибок. Он полагается на то, что базовое соединение будет безошибочным, что справедливо для модемов, поддерживающих MNP, например. Обычно передачу YMODEM инициирует принимающая сторона, отправляя символ, чтобы указать на желание использовать 128-байтовый формат с CRC, или символ, если требуется оригинальная система контрольных сумм. Если желателен протокол g, передача вместо этого запускается отправкой символа . Если отправитель не поддерживает протокол g, он рассматривает это как ошибку и игнорирует ее, но если он поддерживает g, он начинает отправлять пакеты непрерывным потоком. Он ожидает только одно подтверждение после получения последнего пакета, что указывается наличием символа в данных. YMODEM g предполагает доступность пакетов размером 1 КБ. Однако, несмотря на то, что этот протокол потенциально быстрее, чем ZMODEM, он все равно редко использовался. Это было частично связано с отсутствием дополнительной функциональности, но также и с более серьезной проблемой. До появления UART 16550 существовал значительный риск переполнения буфера последовательного порта. Хотя YMODEM g обнаруживал бы это, исправить проблему было невозможно, поскольку повторная передача блока не предусмотрена. Принимающей стороне приходилось отменять и перезапускать всю передачу с самого начала. ZMODEM, напротив, имеет возможность возобновления передачи, что делало его более привлекательным.