Следующая:g Protocol, Следующая:f Protocol, Предыдущая:UUCP Protocol, Вверх:Protocols
g
ProtocolUUCP протокол g
Протокол g
это пакетный протокол с исправлением ошибок и с
управлением потоком, который требует восьми битового соединения. Это
оригинальный UUCP протокол, который поддерживается всеми реализациями
UUCP протокола. Существует много реализаций данного протокола, которые
способны использовать только маленькое окно и небольшие размеры
пакетов, обычно в таких реализациях размер окна составляет 3, а размер
пакета составляет 64 байта, сам протокола может поддерживать размер
окна в равный 7, и размера пакетов до 4096 байт. Сообщения о
неэффективности протокола g
относятся к определенной реализации, а
не к правильно реализованному протоколу.
Протокол g
был первоначально разработан для общих пакетных
драйверов, и таким образом содержит некоторые особенности, которые не
используются в UUCP, включая альтернативный канал данных и способность
передоговариваться о размерах пакета и о размерах окна в течение
одного сеанса связи.
Протокол g
- поддерживается многими Telebit модемами. Когда
поддерживается spoofing g
, каждый Telebit модем использует g
протокол для взаимодействия с подключенным компьютером, при этом данные
между модемами отсылаются, используя собственный Telebit протокол с
исправлением ошибок. Это позволяет обеспечить очень высокую
производительность по Telebit соединению, которое, из-за того что
является полудуплексным не способно хорошо обрабатывать g
протокол.
Когда Telebit реализует spoofing g
протокола, размер пакета
устанавливается в 64 байта, а размером окна в 3.
Данное обсуждение протокола g
объясняет, как это работает, но не
обсуждает полезные методы обработки ошибки. Некоторое обсуждение
данного вопроса можно найти в Jamie E. Hanrahan's paper.
(смотрите UUCP Protocol Sources).
Обмен по протоколу g
осуществляется пакетами. Каждый пакет
начинается с шести байтового заголовка. Пакеты управления состоят
только из заголовков. Пакеты данных содержат дополнительные данные.
Заголовок состоит из следующего:
\020
Для пакета управления k всегда составляет 9. Для пакета данных,
значение k указывает, сколько байт данных следует за шести
байтовым заголовком. Количество данных составляет 2**(k + 4), где
** символ экспоненты. Таким образом, значение k равное 1 указывает
на 32 байта данных, а k равное 8 указывает на 4096 байта данных.
Значение k для пакета данных должно лежать между 1 и 8
включительно.
Байт управления заголовка составлен из трех битовых полей,
упомянутых здесь как tt (два бита), xxx (три бита) и yyy
(три бита). Байт управления составляет - TTXXXYYY, или
(TT<<6)+(XXX<<3)+YYY
.
Поле TT принимает следующие значения:
0
1
2
xxx
и
yyy описано ниже.
3
l - b1
значащих байт данных,
начиная со второго байта. Если b1 > = 128
и b2 это
второй байт поля данных. При этом допустимыми являются l-
((b1&0x7f)+(b2<<7))
байт поля данных, начиная с третьего
байта. Во всех случаях отсылается l байтов данных (все байты
данных участвуют в вычислении контрольной суммы) но некоторые из хвостовых
байт могут быть отброшены получателем. Поля xxx и yyy описаны
ниже.
В пакете данных (коротком или нормальном пакете данных) поле xxx задает последовательный номер пакета. Таким образом, последовательные номера могут находиться в диапазоне от 0 до 7, включительно. Поле yyy задает последовательный номер последнего правильно полученного пакета.
Каждое коммуникационное направление использует окно, которое
указывает, сколько неподтвержденных пакетов могут быть переданы без
приема подтверждения. Размер окна может быть от 1 до 7, и может
различаться для каждого направления. Например, если размер окна
составляет 3, а последний подтвержденный пакет имеет номер 6, то могут
быть отосланы пакеты с номерами 7, 0 и 1, но отправитель должен
ожидать подтверждение перед посылкой пакета с номером 2. Подтверждение
может прийти в поле yyy пакета данных, или в поле yyy пакета
rj или пакета управления rr
(описаны ниже).
Пакеты должны отправляться в порядке возрастания номеров (отправитель не может пропустить последовательный номер). Каждый пакет должен быть подтвержден.
В управляющем пакете, поле xxx принимают следующие значения:
CLOSE
CLOSE
, то в качестве ответа следует отослать пакет CLOSE
,
протокол должен остановиться, и UUCP должен перейти к финальной
handshake процедуре.
RJ
or NAK
SRJ
RR
or ACK
INITC
INITB
Отметим, что используется не то же самое кодирование,
которое используется для кодирования k байта заголовка пакета.
Большинство реализаций UUCP, которые запрашивают размер пакета
больший, чем 64 байта, могут обрабатывать любой размер пакета, до
указанного.
INITA
Для того чтобы посчитать контрольную сумму, назовем control byte (контрольный байт) (пятый байт заголовка) c.
Контрольная сумма пакета управления вычисляется просто как
0xaaaa - c
.
Контрольная сумма пакета данных составляет 0xaaaa-(check^c)
,
где ^
обозначает исключающий или, а check представляет результат
выполнения следующей процедуры, в которую передается содержимое поля
данных (каждый байт поля данных участвует в подсчете контрольной
суммы, даже для коротких пакетов данных). Ниже приведена процедура,
используемая более ранней версией Taylor UUCP; это слегка
модифицированная версия процедуры, которую John Gilmore получил из
G.L. Chesson's paper. Аргумент z
указывает на данные, а параметр
c
указывает на длину данных.
int igchecksum (z, c) register const char *z; register int c; { register unsigned int ichk1, ichk2; ichk1 = 0xffff; ichk2 = 0; do { register unsigned int b; /* Rotate ichk1 left. */ if ((ichk1 & 0x8000) == 0) ichk1 <<= 1; else { ichk1 <<= 1; ++ichk1; } /* Add the next character to ichk1. */ b = *z++ & 0xff; ichk1 += b; /* Add ichk1 xor the character position in the buffer counting from the back to ichk2. */ ichk2 += ichk1 ^ c; /* If the character was zero, or adding it to ichk1 caused an overflow, xor ichk2 to ichk1. */ if (b == 0 || (ichk1 & 0xffff) < b) ichk1 ^= ichk2; } while (--c > 0); return ichk1 & 0xffff; }
Когда запускается протокол g
, вызывающий UUCP отсылает
управляющий пакет INITA
в котором размер окна установлен в
значение, которое желательно чтобы использовал вызываемый пакет UUCP.
Вызываемый UUCP отвечает пакетом INITA
, в котором размером окна
установлен на значение, желательное для использования вызывающей
стороной. Далее аналогично происходит обмен пакетами INITB
и INITC
. Когда данный обмен заканчивается, считается, что
протокол запущен.
Отметим, что размер окна и размер пакета не являются предметом переговоров. Каждая система объявляет размер окна и размер пакета, которые должна использовать другая система. Возможно, в каждом направлении будут использоваться различные размер окна и размер пакетов. Протокол работает таким образом в предположении, что каждая система знает, сколько данных она может принять без того, чтобы произошло переполнение. Поэтому, каждая система сообщает другой системе, сколько данных посылать перед ожиданием подтверждения.
Когда UUCP пакет передает команду, то при этом отсылается один или большее количество пакетов данных. Все пакеты данных обычно являются полными, хотя последний пакет данных может быть коротким. Командная строка отсылается с хвостовым нулевым байтом, что позволяет принимающему пакету знать, когда завершается команда. Некоторые UUCP пакеты требуют, чтобы последний байт последнего пакета был установлен в нуль, даже если команда заканчивается раньше в пакете. Некоторые пакеты требуют, чтобы все хвостовые байты последнего пакета, были нулевыми, но я (автор) не подтверждаю это.
Когда UUCP пакет отсылает файл, он отсылает последовательность пакетов данных. Признаком конца файла является короткий пакет данных, содержащий нулевое количество допустимых байт (данному пакету обычно предшествует короткий пакет данных, содержащий последние несколько байтов файла).
Обратите внимание, что последовательные номера (sequence numbers) относятся целиком к коммуникационной сессии, включая как команду, так и файл данных.
Когда протокол закрывается (shut down), каждый UUCP пакет отсылает
пакет управления CLOSE
.