Виртуальный терминал (NVT - Network Virtual Terminal) это мнимое символьное устройство с клавиатурой и принтером. Данные, набранные на клавиатуре, отправляются серверу, а ответ сервера печатается на принтере. Под «клавиатурой» и «принтером» подразумеваются некие мнимые устройства. В действительности ответ сервера вовсе не обязательно выводить на настоящий принтер, вместо этого обычно используется экран.
Виртуальный терминал позволяет согласовать форматы представления данных обеих сторон, ширину и высоту экрана и т.д. Соответствие между мнимыми и физическими устройствами узла должна обеспечить реализация протокола.
Подробнее о виртуальном терминале рассказано ниже, в конце этой главы.
Протокол telnet использует довольно оригинальный способ передачи команд, называемый команды в потоке (in-band signaling), заключающийся в следующем: любой байт из интервала [0x0, 0xFF) [185] интерпретируется как данные, а байт 0xFF, называемый IAC (Interpret As Command - интерпретировать как команду), указывает на то, что следующий за ним байт является командным байтом. Если возникнет необходимость передать байт данных, равный 0xFF, его следует продублировать, т.е. отправить два байта 0xFF 0xFF.
Командный байт может принимать следующие значения, перечисленные в таблице (необходимые объяснения даны ниже).
???? Имя Код Пояснения
???? EOF 0xEC Конец файла
???? SUSP 0xED Приостановить текущий процесс
???? ABORT 0xEE Прекратить процесс
???? EOR 0xEF Конец записи
???? SE 0xF0 Конец подопции
???? NOP 0xF1 Нет операции
???? DM 0xF2 Маркер данных
???? BRK 0xF3 Прерывание
???? IP 0xF4 Прервать процесс
???? AO 0xF5 Прекратить вывод
???? AYT 0xF6 Есть кто живой?
???? EC 0xF7 Удалить последний введенный символ
???? EL 0xF8 Стереть строку
???? GA 0xF9 Идти дальше
???? SB 0xFA Начало под опции
???? WILL 0xFB Обсуждение опции
???? WONT 0xFC Обсуждение опции
???? DO 0xFD Обсуждение опции
???? DONT 0xFE Обсуждение опции
???? IAC 0xFF Байт данных 0xFF
Многие из перечисленных в таблице команд в настоящее время вышли из употребления и поэтому представляют лишь исторических интерес, а потому рассмотрены по возможности кратко:
· EOF
· End Of File - конец файла. Получатель команды уведомляет процесс, подсоединенный к NVT терминалу, что был достигнут конец файла. В настоящее время эта команда не используется.
· SUSP
· (сокращение от Suspend - приостановить) «замораживает» связанный с NVT процесс и передает управление другому процессу. «Замороженный» процесс позднее сможет продолжить свое выполнение с той же самой точки. Эта команда в настоящее время игнорируется большинством получателей.
· EOR
· End of Record - конец записи. Аналогично EOF. Подобно эта команда описана в RFC-885.
· NOP
· No operation - нет операции. Эта команда обычно используется для проверки работоспособности сессии. Если соединение с получателем разорвано, то попытка посылки NOP приведет к ошибке TCP/IP. Некоторые сервера периодически посылают NOP, чтобы убедится в активности клиента.
·
DM
· Data Mark - маркер данных. Используется в качестве сигнала синхронизации, который передается в виде срочных данных TCP. Когда получатель принимает уведомление о том, что отправитель вошел в режим срочности, он начинает читать поток данных, отбрасывая все, кроме telnet-команд. Команда DM сообщает принимающему о необходимости вернуться в обычный режим работы.
·
BRK
· Break - прерывание. Уведомляет о нажатии клавиши «Break» и приводит к прерыванию сессии с очисткой буферов ввода вывода.
· IP
· Interrupt Process - Прервать Процесс. Прервать, приостановить или завершить процесс, связанный с NVT терминалом
· AO
· Abort Output - Прервать Вывод. Принудительное завершение вывода с очисткой буферов.
· AYT
· Are You There - Есть кто живой? Эта команда приписывает получателю вернуть отправителю нечто читабельное для подтверждения факта своей активности.
· EC
· Erase Character - Удалить Символ. Эта команда предписывает получателю удалить последний символ, полученный им от отправителя.
· EL
· Erase Line - Удалить Строку. Эта команда предписывает получателю удалить последнюю строку, полученную им от отправителя.
· GA
· Go Ahead - Далее. Эта команда передает управление получателю (используется в полудуплексном режиме)
Для согласования дополнительных параметров используются квиточки WILL, WONT, DO, DONT. Отправитель может попросить получателя изменить требуемые опции или уведомлять его об изменении своего состояния.
· Квиток WILL, посылаемый отправителем, говорит, что отправитель хочет включить некую опцию для себя. Если получатель согласен, он отправляет квиток DO, в противном случае DONT.
· Квиток DO, посылаемый отправителем, просит получателя включить некую опцию. Если получатель согласен, он отправляет квиток WILL или WONT в противном случае.
· Квиток WONT, посылаемый отправителем, уведомляет получателя, что отправитель выключил у себя некую опцию. Получатель обязан подтвердить это квитком DONT
· Квиток DONT, посылаемый отправителем, приказывает получателю выключить некую опцию. Получатель обязан подтвердить это квитком WONT.
Существует множество опций, подробно описанных в “Assigned Numbers RFC”, ниже для примера описаны лишь некоторые, наиболее часто употребляемые, из них.
– Код опции Назначение
– Десятичный Шестнадцатеричный.
– 1 0x1 Эхо
– 3 0х3 Запрещение команды GA
– 5 0x5 Статус
– 6 0х6 Маркер времени
– 24 0х18 Тип терминала
– 31 0х1F ? азмер окна
– 32 0x20 Скорость терминала
– 33 0x21 Удаленный контроль потоком данных
– 34 0х22 Линейный режим (line mode)
– 36 0х24 Прочесть (изменить) переменные окружения
Некоторые опции, такие, например, как тип терминала, имеют один или несколько параметров, которые передаются следующим образом: сразу за опцией следует команда «IAC SB», а за ней один или несколько байт параметров. Команда «IAC SE» завершает ввод. Например, изменение размеров окна может происходить так: «IAC DO 0x1F» «IAC SB» «00 50 00 20» «IAC SE», где “00 50” количество символов в строке (первым идет старший байт) - первый параметр, а «00 20» количество символов в строке - второй параметр.
Протокол telnet поддерживает четыре режима передачи данных: полудуплексный, символьный, строчечный и линейный.
Полудуплексный режим в настоящее время практически вышел из употребления и используется крайне редко. Обмен данными происходит так: клиент дожидается получения команды GA от сервера и только после этого начинает передачу данных, завершаемую командой GA, после чего он готов к приему ответа сервера. Т.е. команда GA играет роль ключа, меняющие обе стороны ролями. Такая форма общения заметно ускоряет обмен (особенно на медленных каналах), но не позволяет взаимодействовать с приложениями, посимвольно обрабатывающими ввод. По стандарту клиент по умолчанию находится в полудуплексном режиме.