Gemini (протокол)

Gemini - сетевой протокол прикладного уровня, являющийся наследником протокола Gopher.

Ориентирован на минимализм и приватность, поскольку исключает использование таких технологий как сжатие, Cookies и JavaScript; формат передаваемых данных ограничен текстом или бинарными данными, обязательной является подпись TLS.

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

В виду своих характеристик, Gemini будет интересен тем, кого не устраивает «раздутость» современного протокола HTTP, а также подойдёт для пользователей командной строки, E-ink планшетов.

Терминология

Как и во многих других экосистемах, для Gemini характерна своя терминология, знание которой поможет лучше понимать контекст и формировать поисковые запросы.

  • Gemini space - экосистема Gemini, подобно термину «Fediverse» для федеративной тематики
  • Capsule - капсула, веб-сайт - название протокола отсылается к тематике космической программы, поэтому в сети многие ресурсы наследуют концепцию в своих названиях
  • Gemlog - блог, персональная страница, фид профиля

Разметка

Gemtext

Текстовые ресурсы gemtext - это обычный текст (MIME text/gemini) опционально содержащий мета-теги в начале каждой строки:

# h1
## h2
### h3
=> ссылка
> цитата
* элемент списка
``` 
исходный код
```

Некоторые браузеры поддерживают разметку inline:

``` заголовок неформатируемого блока
*bold*
_underline_

В разметке gemini не используются декоративные технологии вроде CSS, при этом задача отрисовки ресурса выполняется на стороне браузера и полностью делегирована клиенту.

Различные браузеры по-разному отрисовывают содержимое, некоторые добавляют отступы.
Поэтому главный принцип создания «кроссбраузерных» страниц - разметка должна удобно читаться в исходном виде.

Gemfeed

Поскольку текстовый регламент протокола не подразумевает использование тегов, такие стандарты оповещений как Atom и RSS, без внешних средств интеграции, в Gemini неприменимы.

Несмотря на это, нативные подписки возможны - средствами стандарта для программной интерпретации изменений документа gemtext.

Говоря проще, протокол сохраняет человеко-понятную структуру документа, при этом позволяет клиентским приложениям отслеживать его обновления.

В браузере Lagrange, подписаться на обновления страницы можно с помощью меню Bookmarks - Subscribe to page… и выбрать соответствующий странице способ (меню подписок: View - Show Feeds)

Отслеживание по дате

В данном подходе, осуществляется отслеживание по впереди идущей за ссылкой дате, в формате ISO 8601 (Y-m-d), например:

/index.gmi
# Заголовок страницы, выполняет роль заголовка фида

Содержимое параграфа, игнорируется

=> /index.gmi любая ссылка, игнорируется

## Подраздел страницы, игнорируется

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

## Публикации

=> /pub1.gmi 2024-01-28 Ссылка на первую публикацию, отслеживается
=> /pub2.gmi 2024-01-29 Ссылка на вторую публикацию, отслеживается
=> /pub3.gmi Ссылка публикацию, не отслеживается (так как не содержит даты)
=> /pub4.gmi Ссылка публикацию, не отслеживается (так как дата является частью заголовка) 2024-01-30

Таким образом, документ не теряет читаемость для человека и при этом содержит мета-информацию для интерпретатора обновлений.

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

Отслеживание по заголовкам

Альтернативный подход, отслеживающий изменения в заголовках документа

blog.gmi
# Мой блог, заголовок фида

Параграф описания

## Первая публикация, отслеживается

Описание первой публикации

=> /pub1.gmi Читать

## Вторая публикация, отслеживается

Описание второй публикации

=> /pub2.gmi Читать

...

Коды статусов

  • 10-19 - input expected - ожидается ввод - используется например для отправки и получения данных форм
  • 20-29 - success - код 20 аналогичен коду 200 в HTTP
  • 30-39 - redirection - диапазон переадресации, в отправляемом пакете, код обычно сопровождается мета-ссылкой: code + link + \n\r + text
  • 40-49 - temporary failure
  • 50-59 - permanent failure
  • 60-69 - client certificates - в Gemini сертификаты используются для идентификации и авторизации пользователей

Клиент обязан отклонять любой код меньше 10 или больше 69, при этом уведомить пользователя.

В неопределённых случаях, приоритет будет отдан коду с начальным значением диапазона, например, 10 для 11 или 20 для 27.

Обработка запросов

Протокол предусматривает обмен пакетами с заголовками длиной максимум 1024 байт. В эту длину необходимо уместить мета информацию пакета - например строку URI и/или данные пользовательского ввода.

Текстовые данные должны быть закодированы в стандарт RFC 3986 (известный такими функциями, как urlencode). В какой то степени, это сокращает полезный объём заголовка при использовании например кириллицы.

Тело пакета состоит из «сырых» текстовых или бинарных данных без сжатия; сервер закрывает соединение после отправки последнего байта.

С помощью отправляемых клиенту статусов группы «10», сервер способен запрашивать пользовательский ввод (вместо привычных форм, обычно в браузерах Gemini - это всплывающее текстовое окно) После получения и обработки данных, сервер обычно возвращает статус «20», статус «51» (не найдено) или редирект на целевую страницу с кодом «30».

Пример типичного пакета с фразой «Hello world!»:

20 text/gemini; charset=utf-8; lang=en\r\nHello%20world%21

Клиент

Чтобы открыть ресурс с адресом gemini:// необходим специальный браузер, стандартно работающий с портом 1965.

Пользователи GUI, могут начать с популярных Lagrange, Eva, Kristall и других.

Специфика

  • так как большинство клиентов возвращают одно-текстовое строчное поле запроса, добавить новую строку можно комбинацией клавиш Shift+Enter
  • в протоколе Gemini нет webstorage и cookies, поэтому некоторые интерактивные сайты запрашивают для авторизации сертификат, который также используется для быстрой смены аккаунта
  • вместо фидов RSS есть встроенные в браузер инструменты отслеживания контента (см. gemfeed)

Сервер

Понятие «сервер» в среде Gemini может быть непривычным для пользователей веб, поскольку вместо прокси Nginx или Apache, этот термин зачастую предусматривает полноценный сервис для конкретной задачи, резервирующий за собой отдельный хост и порт.

В каталоге awesome-gemini представлено большое количество таких решений.

Например, для запуска простой статики, подойдёт сервер Agate (Rust). При этом, название привычного index.html будет зависеть от выбранного сервера, для Agate - это index.gmi

Запуск динамических ресурсов часто предусматривает разработку собственного сокет-сервера для реализации специфики отдельно взятого приложения.

Веб-разработчикам проще понять принцип работы «server-side» на примере нескольких файлов gemini-php. В разработке новых проектов - лучше использовать более актуальне решения, например, из простых - форк библиотеки titan-II, примеры реализации на базе которой, можно посмотреть в исходном коде geminiapp для KevaChat или проекте зеркала данного сайта.

Виртуальные хосты

Чтобы запускать различные сервисы на одном IP (не меняя стандартный порт) следует установить общий прокси-сервер, который будет осуществлять маршрутизацию запросов на соответствующий адрес/интерфейс.

Если для HTTP - это Apache или Nginx, то для протокола Gemini используются следующие решения:

Ресурсы

  • gemini://geminiprotocol.net - домашняя страница проекта
  • gemini://geminiprotocol.net/docs/ru/ - документация на русском
  • gemini://geminispace.info - внутрисетевой поиск
  • gemini://station.martinrue.com - социальная сеть по типу twitter
  • gemini://astrobotany.mozz.us - ASCII ботаника
  • gemini://gemlog.blue - самый простой способ разместить страничку в сети Gemini (веб-прокси)
  • gemini://cities.yesterweb.org - хостинг с поддоменом, есть возможность загрузки файлов через Titan и WebDAV
  • gemini://flounder.online - хостинг с поддоменом и динамическим агрегатором активности на главной странице, есть SFTP

Yggdrasil

В зависимости от поддержки IPv6 отдельно взятым сервером, в большинстве случаев, Gemini штатно и без проблем работает с Yggdrasil.

Спорным моментом является обязательное шифрование TLS поверх уже имеющегося слоя.

Пользователи DNS с подключением через Yggdrasil и в частности - Alfis DNS, использующего стандартно AdGuard, могут столкнуться с задержками при открытии казалось-бы легковесных страниц Gemtext. Связано это с относительно простым устройством внутрисетевых браузеров, разработчики которых не особо стремятся вникать в особенности альтернативных подключений. В то время, как HTTP браузеры из коробки имеют встроенные инструменты кеширования, пользователи Gemini могут ускорить загрузку с помощью кеширующих DNS серверов. Также можно снизить задержки для резольва Clearnet, указав DNS CloudFlare (1.1.1.1) с обычно наиболее высокими показателями отклика.

Внутрисетевые ресурсы

  • gemini://[301:23b4:991a:634d::b] - зеркало сайта, в рамках проекта β-Doku
    • gemini://betahowto.ygg - алиас
    • gemini://betahowto.duckdns.org - алиас в Интернет
  • gemini://[301:23b4:991a:634d::1965] - инстанс KevaChat
    • gemini://kevachat.ygg - алиас
  • gemini://[301:23b4:991a:634d::db] - эксплорер блокчейна KevaCoin KVAZAR
    • gemini://kvazar.ygg - алиас
    • gemini://kvazar.duckdns.org - алиас в Интернет

Похожие протоколы

  • Gopher
  • Guppy - gemini://guppy.000090000.xyz/guppy-spec.gmi
  • Spartan
  • Nex

Статьи внутри раздела

Ссылки

Обсуждение

newbie, 2024/02/05 10:50
Что-то gemini://[301:23b4:991a:634d::b] и алиасы не открываются ни в браузерах (Lagrange, Kristall), ни через web-прокси https://portal.mozz.us/

https://imgur.com/a/9G3M6e0

d4708, 2024/02/05 12:58, 2024/02/05 13:00
Это у меня сервер периодически падает (с другими сайтами тоже)

Вообще уже после запуска вчера обнаружил другую проблему - прокси twins (оба адреса с DNS) кропает контент и визуально кодировку на прокси также не работает проброс медиа.

Пробрасывать size в заголовке не помогает, может из-за символа перевода строки. В общем, тестируйте пока на прямом IPv6

Только авторизованные участники могут оставлять комментарии.
gemini_protocol.txt · Последнее изменение: 2024/04/09 09:47 — d4708
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki