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



UUCP g Protocol

UUCP протокол 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
Каждый пакет начинается с ^P.
k (1 <= k <= 9)
The k value is always 9 for a control packet. For a data packet, the k value indicates how much data follows the six byte header. The amount of data is

Для пакета управления k всегда составляет 9. Для пакета данных, значение k указывает, сколько байт данных следует за шести байтовым заголовком. Количество данных составляет 2**(k + 4), где ** символ экспоненты. Таким образом, значение k равное 1 указывает на 32 байта данных, а k равное 8 указывает на 4096 байта данных. Значение k для пакета данных должно лежать между 1 и 8 включительно.

checksum low byte
checksum high byte
Значение контрольной суммы, описанное ниже.
control byte
Байт управления указывает тип пакета, и описан ниже.
xor byte
Этот байт составляет xor k, младшего байта контрольной суммы (checksum low byte) и старшего байта контрольной суммы (checksum high byte) и байта управления (control byte) (то есть, второго, третьего, четвертого и пятого байта заголовка). Данный байт используется, для проверки правильности данных заголовка.

Байт управления заголовка составлен из трех битовых полей, упомянутых здесь как tt (два бита), xxx (три бита) и yyy (три бита). Байт управления составляет - TTXXXYYY, или (TT<<6)+(XXX<<3)+YYY.

Поле TT принимает следующие значения:

0
Управляющий пакет. В этом случае k байт заголовка должны быть 9. Поле xxx указывает тип пакетов управления; данные типы описываются ниже.
1
Пакет альтернативного канала данных. Не используется UUCP.
2
Пакет данных, содержимое подключенной области данных (длина задается k байтом заголовка) правильно. Содержимое полей xxx и yyy описано ниже.
3
Короткий пакет данных. Пусть длина поля данных (задается байтом k заголовка) составляет l. Первый байт поля данных равен b1. Если b1 меньше чем 128 (те наиболее значимый бит b1 составляет 0), то в поле данных находятся 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 принимают следующие значения:

1 CLOSE
Соединение следует закрыть немедленно. Типично отсылается, когда одна сторона видит много ошибок. Также отсылается при закрытии (shutting down) протокола. Если принимается неожиданный пакет CLOSE, то в качестве ответа следует отослать пакет CLOSE, протокол должен остановиться, и UUCP должен перейти к финальной handshake процедуре.
2 RJ or NAK
Последний пакет не был правильно получен. Поле yyy содержит порядковый номер последовательности для последнего правильно полученного пакета.
3 SRJ
Selective reject. Пакет селективного отклонения. Поле yyy содержит последовательный номер пакета, который не был получен правильно, и должен быть повторно передан. Данная команда не используется протоколом UUCP, и большинство реализаций не поддерживают данную команду.
4 RR or ACK
Подтверждение пакета. Поле yyy содержит порядковый номер последнего правильно полученного пакета.
5 INITC
Третий инициализационный пакет. Поле yyy содержит максимальный размер окна, который следует использовать.
6 INITB
Второй пакет инициализации. Поле yyy содержит размер пакета, для использования. При этом запрашиваемый размер составляет

Отметим, что используется не то же самое кодирование, которое используется для кодирования k байта заголовка пакета. Большинство реализаций UUCP, которые запрашивают размер пакета больший, чем 64 байта, могут обрабатывать любой размер пакета, до указанного.

7 INITA
Первый инициализационный пакет. Поле yyy содержит максимальный размер окна, который следует использовать.

Для того чтобы посчитать контрольную сумму, назовем 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.