Следующая:j Protocol, Следующая:x Protocol, Предыдущая:i Protocol, Вверх:Protocols
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
протокола состоит из семи байтового заголовка, за
которым следуют байты данных, затем следуют индексные байты, а затем
идет хвостовой байт. Заголовок пакета выглядит следующим образом:
i
, находящийся внутри пакета
j
протокола.
За заголовком следуют данные, количество байт данных задается
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
модифицируется, для того чтобы закодировать преобразование:
Приемник декодирует индексные байты следующим образом (реверсия операций, выполненных отправителем, здесь приводится для внесения дополнительной ясности):
040 <= index-high < 0176
, то индекс ссылается
на байт данных в позиции (index-high - 040) * 040 +
index-low % 040
.
040 <= index-low < 0100
, то следует добавить
0200 для индексирования байта.
0100 <= index-low < 0140
, то для индексируемого
байта должна быть выполнена операция xor 020.
0140 <= index-low < 0177
, то 0200 должно быть
добавлено к индексируемому байту, и должна быть выполнена операция xor 020.
index-high == 0176
, то индекс ссылается на байту
данных в позиции (index-low - 040) * 040 + 037
. 0200 должно
быть добавлено к индексированному байту, затем к нему должна быть
применена операция xor 020.
Это означает самый большой i
пакет, который может находиться
внутри j
пакета составляет (0175 - 040) * 040 + (077 - 040) ==
3007
байт.
Финальный символ в пакете j
протокола, который следует за
индексными байтами, является ASCII символом ~ (восьмеричный 176).
Причина, из-за которой выбрана схема с индексированием, а не схема
с escape
символами, заключается в стремлении избежать перемещения
данных. Отправитель может просто добавить заголовок и хвостовую часть
к пакету i
протокола. После того как получатель загрузил пакет
j
протокола, он может отсканировать индексные байты, выполнить
соответствующее преобразование, а затем передавать байты данных в
непосредственную процедуру обработки протокола i
.