Кратко

  • Пункт Gopher содержал тип, отображаемое имя, непрозрачный selector, host и port. Человек выбирал имя, а клиент использовал остальные поля для нового соединения.
  • Видимая иерархия была графом ссылок между независимыми операторами. Автор меню мог предложить маршрут, но не получал власть над целью и не доказывал подлинность или неизменность ответа.

Название оставалось прежним, оператор мог смениться

Студент выбирает в университетском меню «Расписание занятий». Интерфейс похож на переход в соседнюю папку. На деле клиент может завершить текущий обмен, разрешить другое имя и подключиться к иному порту другой машины. Координаты перехода уже находились в строке, хотя пользователь видел лишь ее понятную часть.

RFC 1436 определил Directory Entity из пяти полей. Первый символ задавал item type; далее шли имя для показа, Tab, selector, Tab, host, Tab, port и CRLF. Читатель обычно видел имя. Клиент получал исполнимое описание следующего шага.

Так распределенная публикация становилась дешевой. Одной кафедре не требовалось копировать документы другой в центральное хранилище. Достаточно было добавить строку, после чего клиент самостоятельно обращался к указанной службе.

Экономия одновременно ограничивала полномочия. Редактор меню выбирал подпись, порядок и сам факт включения. Удаленный оператор определял смысл selector и ответ. Записать адрес означало сделать цель находимой, а не приобрести ее.

Значение selector не принадлежало клиенту

В примерах selectors нередко напоминали пути к файлам. Однако RFC требовал, чтобы строка ничего не значила для клиента и никогда им не изменялась.

Это сохраняло свободу сервера. Одна реализация могла разрешать pathname, другая — запускать script, application или query, формирующую документ. Общий протокол не вынуждал всех раскрывать filesystem или принимать глобальную схему идентификаторов.

Непрозрачность не обещала постоянства. Одинаковые байты могли означать разные вещи на разных hosts. После migration тот же сервер мог изменить трактовку. Selector не был content hash, credential или вечным именем. Он имел смысл только в локальной грамматике названной службы.

Поэтому в evidence следовало сохранять точные байты. Нормализация slash, догадка о private encoding или «исправление» странного символа могли незаметно запросить другой объект. Совместимость требовала не только умения интерпретировать, но и дисциплины не интерпретировать чужое.

Root был входом, а не верховной властью

Метафора filesystem облегчала навигацию, но не делала сеть деревом. Меню могло указывать на secondary servers, службы в любой точке Internet или уже посещенные узлы. RFC прямо называл результат произвольным графом.

Организация могла держать известный top-level server, регистрировать там подразделения и клонировать вход ради нагрузки. Но подразделения оставались свободны размещать собственные ссылки. Root помогал начать поиск; он не владел всем достижимым содержимым.

При каждом переходе полномочия оставались раздельными. Источник меню писал label и descriptor. Целевой сервер толковал selector. DNS мог переназначить alias. Процесс на port определял фактического ответчика. Client решал, поддерживает ли type. Reader выбирал из того, что ему показали.

Строка доказывала лишь, что один источник в определенный момент предложил такой путь. Host мог быть ошибочным, selector устаревшим, имя вводящим в заблуждение. DNS мог измениться без правки меню. Граф жил благодаря продолжающемуся сотрудничеству автономных сторон, а не центральному владельцу отношений.

Непрерывную прогулку собирал клиент

Базовая транзакция была короткой: открыть TCP, отправить строку selector, возможно пустую, получить ответ. Server не хранил client state между транзакциями. Один CRLF мог запросить верхнее меню.

Тексты и каталоги завершались строкой из одной точки. Если реальная строка начиналась точкой, отправитель добавлял вторую, а клиент снимал лишнюю. Binary types использовали иной delimiter: данные читались до закрытия TCP.

Поэтому close не всегда означал отказ; для binary он мог быть нормальным концом. И наоборот, правильная точка подтверждала framing, но не содержание. Полное меню могло состоять из мертвых маршрутов, а правильно завершенный текст — оказаться не тем документом.

Ощущение session создавалось локально. Client мог складывать посещенные места в stack для возврата или cache каталоги. Последовательным серверам не требовалась общая история. Путь собирался из независимых exchanges и памяти клиента.

Type выбирал процедуру, а не истинность

Первый символ определял действие. 0 означал текст, 1 — меню, 7 — index search. Другие значения направляли к binary, CSO, Telnet или TN3270. Неизвестный дополнительный type можно было скрыть либо показать как неизвестный.

Символ не был сертификатом формата, аутентификацией или разрешением на безопасный rendering. Это был dispatch hint. Неверная классификация могла заставить клиента начать неправильную транзакцию с полностью доступным endpoint.

Для type 7 клиент отправлял selector, Tab и search string. Ответом служило virtual menu. Разные indexes и gateways могли охватывать разные коллекции, сохраняя одну модель клиента.

Результат поиска оставался referral. Search server решал, что совпало, и выдавал координаты; destination контролировал retrieval. Присутствие в списке не доказывало долговременную доступность, правильность совпадения или неизменность документа.

URI сохранил рецепт запроса

RFC 1738 перенес координаты в URL: host, необязательный port, односимвольный gophertype и selector. При отсутствии port использовался 70; пустой path мог означать top-level menu типа 1; %09 отделял поисковую строку.

RFC 4266 позднее сохранил scheme на Standards Track. Маршрут можно было вынести из исходного меню, сохранить и передать.

Но URI не замораживал объект. Сервер продолжал толковать selector, DNS мог изменить адрес, а на port мог появиться другой процесс. Повторяемой стала форма запроса, не его результат и не identity содержимого.

Защита тоже не появилась. RFC 1436 сообщил, что security issues не обсуждаются. RFC 4266 позже предупредил об отсутствии privacy и cleartext passwords. Синтаксически правильный маршрут не становился аутентифицированным.

Малый формат выражал разделение власти

Как многим publishers создать общее навигационное пространство, не отдавая серверы одному администратору? Gopher передавал клиенту координаты следующего участника.

Концентрация оставалась возможной. Популярное меню управляло видимостью, индекс — охватом, client — поддерживаемыми types. Но эти полномочия можно было различить, назвать их владельца и оспаривать по отдельности.

Урок шире протокола: каталог может координировать пути и делать цели находимыми, не становясь владельцем указанных систем. Тот, кто ведет адресную книгу, не получает власть над домами в ней.

Источники