Следующая:j Protocol, Следующая:, Предыдущая:i Protocol, Вверх:Protocols



UUCP j Protocol

Протокол j

Протокол j является вариантом протокола i. Он также был написан Ian Lance Taylor, и первоначально появился в версии Taylor UUCP 1.04.

Протокол j - это версия протокола i, разработанного для коммуникационных каналов, которые не могут передавать несколько символов, например XON или XOFF. Данный протокол неэффективно использовать на каналах связи, которые исключают много символов, например на семи битовых каналах связи. Протокол j не поддерживает исправление ошибки или обнаружение; предполагается, что это является ответственностью протокола i.

При запуске j протокола, каждая из систем посылает строку печатных ASCII символов, которая указывает какие символы, требуется не использовать. Строка начинается с символа ASCII ^ (восьмеричное 136) и заканчивается символом ASCII ~ (восьмеричное 176). После отсылки данной строки, каждая система просматривает соответствующую строку удаленной системы. Строки составляются из escape последовательностей: \ooo, где o - восьмеричная цифра. Например, строка ^\021\023~ обозначает, что следует исключить ASCII символы XON и XOFF. Объединение символов, заданных в обоих строках (в строке, которая была отослана и в строке, которая была получена) представляет собой набор символов, которые следует избегать в данном сеансе связи. Исключение printable ASCII символов (символов, которые можно напечатать) (от восьмеричного 040 до восьмеричного 176, включительно) не разрешается.

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

Каждый пакет j протокола состоит из семи байтового заголовка, за которым следуют байты данных, затем следуют индексные байты, а затем идет хвостовой байт. Заголовок пакета выглядит следующим образом:

^
Каждый пакет начинается с ASCII символа ^, восьмеричный 136.
high
low
Данные два символа задают общее количество байт пакета. Как и high, так и low являются печатными printable символами ASCII. Длина пакета составляет '(high - 040) * 0100 + (low - 040)', где '040 <= high < 0177' и '040 <= low < 0140'. При этом получаются длины пакетов до 6079 байт, но кроме данного есть еще ограничение на размер пакета, которое описано ниже.
=
ASCII символ =, восьмеричное 075.
data-high
data-low
Данные два символа дают общее количество байтов данных в пакете. Кодирование описано при кодировании high, low. Количество байтов данных это размер пакета протокола i, находящийся внутри пакета j протокола.
@
ASCII символ @, восьмеричное 100.

За заголовком следуют данные, количество байт данных задается daa-high, data-low. Эти байты данных являются пакетом протокола i, который оборачивается j пакетом. Однако, каждый символ пакета протокола i, который должен избегаться в j протоколе, преобразуется в printable символ ASCII (повторно заметим, что избежать printable ASCII символа в данном протоколе не возможно). Для каждого, преобразуемого символа, используются два индексных байта.

Индексные байты следуют непосредственно за байтами данных. Индексные байты создаются парами. Каждая пара индексных байтов кодирует местоположение символа в пакете протокола i, который преобразуется, чтобы стать printable ASCII символом. Каждая пара индексных байтов также задает преобразование, которое было выполнено.

Когда отправитель находит символ, который следует исключить, это преобразует это, используя одну или две операции. Если символ 0200 или больше, то из него вычитается 0200. Если результирующий символ меньше чем 020 или равен 0177, для него выполняется xor 020. Результат является printable ASCII символом.

Определяется индексный байт символа внутри пакета i протокола. Данный индекс преобразуется в два байтовый printable ASCII индекс, index-high и index-low, таким образом, что индекс равен (index-high - 040) * 040 + (index-low - 040). На index-low наложено следующее ограничение 040 <= index-low < 0100. index-high не может быть 0176, поэтому 040 <= index-high < 0176. Затем index-low модифицируется, для того чтобы закодировать преобразование:

Приемник декодирует индексные байты следующим образом (реверсия операций, выполненных отправителем, здесь приводится для внесения дополнительной ясности):

Это означает самый большой i пакет, который может находиться внутри j пакета составляет (0175 - 040) * 040 + (077 - 040) == 3007 байт.

Финальный символ в пакете j протокола, который следует за индексными байтами, является ASCII символом ~ (восьмеричный 176).

Причина, из-за которой выбрана схема с индексированием, а не схема с escape символами, заключается в стремлении избежать перемещения данных. Отправитель может просто добавить заголовок и хвостовую часть к пакету i протокола. После того как получатель загрузил пакет j протокола, он может отсканировать индексные байты, выполнить соответствующее преобразование, а затем передавать байты данных в непосредственную процедуру обработки протокола i.