# Протокол NEX - легка альтернатива Gemini

Останнім часом стало поширеним явище інтеграції TLS навіть там, де використання цієї технології може бути зайвим.

Сьогодні майже кожна програма включає в себе параноїдальні пресети безпеки з коробки, через які результуючий трафік часто шифрується в декілька шарів, тим само створюючи часові затримки на handshake і вичерпуючи заряд мобільних акумуляторів при передачі великих об'ємів даних.

Звісно, протокол Gemini - не про великий трафік. Тим не менше, хотілось би поділитись його спрощеною альтернативою - NEX, яка може згодитись деяким гікам, зокрема - в альтернативних мережах Onion та Yggdrasil, де канальний трафік між двома підключеннями вже зашифрований а використання класичного DNS вважається поганим тоном.

## Архітектура

NEX - це мережний протокол прикладного рівня, сімейства Gopher / Gemini.

Окрім відсутності характерних для Gemini вимог шифрування, протокол також зручний для прямих підключень по IP без використання DNS та SNI. Не потрібно генерувати сертифікати, слідкувати за їх актуалізацією та вигадувати костилі для Certbot.

Подібно до Gemini, взаємодія між клієнтом і сервером відбувається шляхом надсилання пакету через сокет. Для ідентифікації типу підключення клієнтом використовується схема nex://, а замість порту 1965 стандартним є 1900.

NEX не містить жодних мета заголовків: переадресацій, кодів статусів, MIME типів та іншого. Тим не менше, він підтримує і дозволяє працювати з різними типами даних, включно з Gemtext і медіа форматами.

Ось кілька простих правил з документації:

* формат файлу визначається клієнтом (браузером) за його розширенням у назві
* якщо розширення не вказано, клієнт буде інтерпретувати документ як text/plain
* якщо адреса закінчується слешем, таку адресу прийнято вважати директорією

Специфікація протоколу не декларує власного типу даних і розмітки за виключенням синтаксису посилань, формат яких подібний до Gemtext - тобто посилання можна робити клікабельними, використовуючи префікс => в text/plain.

## Клієнти

Протокол NEX є поширеним і давно відомим в середовищі Geminispace - такий популярний браузер як Lagrange підтримує його з коробки, тому не потрібно шукати додаткових рішень для GUI чи змінювати улюблений клієнт.

Говорячи про CLI, на мою думку, NEX є зручнішим і більше орієнтованим для користувачів саме командного рядка: для взаємодії можна використовувати такі базові утиліти як telnet, nc, ncat тощо:

``` bash
telnet nightfall.city 1900
nex
```

## NPS

Подібно Titan для Gemini, NPS є сателітом для відправки даних на сервер - для NEX.

### Специфікація

Стандартним для NPS є порт 1915.

В залежності від реалізації та специфіки конкретного сервера, клієнт може відправляти команди і типи даних в порядку що відрізняється і так, як задумано автором конкретного сервісу.

Зокрема, сервіс чату в блокчейн KevaChat NPS - вимагає на першому кроці введення ASCII каптчі, вибору кімнати і вже потім - безпосередньо відбувається надсилання текстового повідомлення.

Кожен сервер має власний гайд в режимі CLI, та як правило посилання на документацію.

Характерною рисою NPS є одна крапка в останньому рядку повідомлення, яка також сигналізує кінець з'єднання.

### Приклади

Розберемо приклад надсилання оголошення на сервіс classifieds серверу nightfall.city

``` bash
nc nightfall.city 1915
classifieds
YOUR MESSAGE GOES HERE
.
```

Якщо коротко розібрати команди:

* першим кроком відбувається підключення до серверу по DNS чи IP на 1915 порт
* далі слідує вибір URI ресурсу, у даному випадку classifieds
* після цього надсилається тіло повідомлення по одному рядку
* якщо рядок містить тільки крапку - пакет вважається надісланим

Згідно такому принципу, можна надсилати і багато-строкові дані з певного файлу:

створимо file.txt з наступним вмістом:

``` file.txt
classifieds
      ___
     /\__\          ___
    /:/  /         /\  \
   /:/__/          \:\  \
  /::\  \ ___      /::\__\
 /:/\:\  /\__\  __/:/\/__/
 \/__\:\/:/  / /\/:/  /
      \::/  /  \::/__/
      /:/  /    \:\__\
     /:/  /      \/__/
     \/__/
.
```

тепер надішлемо його на сервер nightfall.city, до розділу classifieds (що вказаний у першому рядку) за допомогою утиліти cat

``` bash
cat file.txt | nc nightfall.city 1915
```

* сервер у прикладі не є тестовим, експериментуючи дотримуйтесь мережної етики і змістовності повідомлень
* для коректної роботи nc в середовищі IPv6, можливо доведеться встановити пакет netcat-openbsd
* варто зауважити, що деякі емулятори терміналу (наприклад, Tilda) можуть некоректно обробляти кириличні символи командою backspace, через відсутність підтримки мультибайтового UTF-8. Виправити це можна зміною емулятора або спробувавши вказати stty iutf8 в ~/.bashrc

## Проксі

Потокові дані легко проксуються через сервер Nginx, простий приклад з nginx.conf:

``` /etc/nginx/nginx.conf
stream {
        server {
                listen 1915;
                proxy_pass [IP]:1915;
        }
}
```

## Висновки

Протокол NEX - це окремий різновид взаємодії та спілкування у мережі. Його переваги здебільшого стають зрозумілими після досвіду роботи з Gemini, який не дивлячись на лаконічність, все ж має ряд особливостей, які у певних випадках бувають зайві.

## Посилання

=> https://nightfall.city/nex/info/specification.txt Специфікація NEX
=> https://nightfall.city/nps/info/specification.txt Специфікація NPS
=> https://nightfall.city Офіційний сайт

## Читайте також

=> gemini-protocol-as-http-alternative.gmi Протокол Gemini як альтернатива HTTP
=> yggdrasil-is-network-with-distributed-routing.gmi Yggdrasil - мережа з децентралізованим роутингом