DOCS / сеть и радио

Апдейты протокола: что менялось на проводе

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


v1.0.11–1.0.12 — контракт дверного звонка и дельта-предложения

  • Каждый пинг ждёт понга в пятнадцать секунд — припаркованный слушатель с просроченным понгом объявляется мёртвым и перепарковывается; успех отправки keepalive больше не считается живостью. В сотовых сетях каденция пинга — четыре минуты, внутри терпимого для операторских NAT.
  • Ящику предлагается только дельта — история перекладывается лишь при смене маршрута, при вытеснении догадки заявленным маршрутом или раз в день на угаданном реле. Измерено на амстердамском реле: 1270 путов/мин → 62, 48 МБ/мин → 1.7. Что считается доставленным — не изменилось.
  • «Я переехал» (1.0.12): устройство, сменившее реле, объявляет, где слушает, каждому пиру в каждом общем пространстве — одним бескадровым бандлом, до первого цикла на новом реле. Предположения о маршрутах старше тридцати дней истекают.
  • terminal-relay --status-listen отдаёт публичный, только-агрегатный Relay Status API — тот самый контракт, под который страница реле этого сайта строилась в августе.
  • Совместимость: пиры на 1.0.12+ заявляют своё реле при старте; старшие разрешаются из догадок по мере обновления (1.0.15 делает копию, принятую по догадке, видимой как принятая).

v1.0.2 — небо это штрихи, а не холст

  • Общие рисунки едут событиями, а не состоянием (ADR-036): небо — один момент в чате, а каждый жест — маленькое подписанное событие, указывающее на него: точки на сетке 128×128, по байту каждая. Штрихи коммутируют: картинка — объединение, лог — merge, и порядок воспроизведения одинаков на каждой реплике. Стирание убирает только собственные штрихи автора.
  • Доставка инструмента подтверждается, а не предполагается (из 1.0.1-rc.2): USB-стенд подтверждает каждый применённый кадр по id события; плата считает кадр доставленным только по этому подтверждению, а отвергнутый кадр остаётся долгом — в цепочке инструмента больше не может вырасти дыра.
  • Совместимость: клиенты старых сборок рендерят небо строкой «✦ общее небо»; знаки комнат едут именами с фолбэком на глиф — старые и новые клиенты согласны в том, что видят.

v1.0.1-rc.1 — Wi-Fi-курьер и эпохи инструментов

  • Носитель — курьер, а не участник (ADR-035): подготовленная плата слышит LAN-объявление узла, узнаёт своё пространство по подсказке, набирает по TLS и стучится подписью, привязанной к сертификату узла. Показания едут вверх; ротации ключей и часы (NTP) — вниз. Транспорт носит — и никогда не становится участником.
  • Членство инструмента следует за эпохой: инструмент — участник, пока говорит под текущей эпохой ключа: карточка появляется с первым показанием и уходит вместе с ключом, на всех репликах разом. Призрачные личности, отчеканенные и брошенные платой, больше не живут вечно.
  • Совместимость: новых замороженных семей нет — курьер это транспорт под существующим конвертом; USB остаётся дорогой спасения для плат, не достающих до сети.

v1.0.0-beta.2 — форматы свипов входят в заморозку

  • Две новые замороженные семьи .v1: field.track.v1 (траектория свипа — упорядоченный поток сэмплов, где разрыв — это сэмпл, а не тишина: point(dt, lat, lon, accuracy) или gap(dt, duration, reason) с no_fix / suspended / unknown — рендерер не может соединить через отсутствие, которое обязан потребить) и sweep.completed.v1 (канонический факт завершения: сектор, начало/конец, дистанция, результат, bbox, ссылка на трек-asset).
  • Событие завершения радиоразмерно по измерению: 348 байт в худшем случае против 500-байтового кадра LoRa. Факт завершённого свипа пересекает радио немедленно; детальный трек едет как asset, когда появляется broadband.
  • Доказательство наблюдения: событие наблюдения несёт 32-байтовую ссылку на медиа — заметка остаётся радиоразмера, фото догоняет обычным медиа.
  • Совместимость: всё, что ADR-033 заморозил в beta.1, остаётся замороженным; свипы добавляют семьи, не меняя ничего существующего. (ADR-034)

v1.0.0-beta.1 — форматы заморожены

  • Всё, что ездит между устройствами или переживает перезапуск, теперь обязательство: девяносто подписанных схем, конверт, раскладка на диске, контейнер бэкапа, провод реле, радиопрофиль. Лог, записанный сегодня, откроет каждая будущая 1.x.
  • Что не заморожено — названо так же прямо: локальный loopback HTTP API, интерфейс, пер-устройственные проекции и всё перезапрашиваемое (тайлы карт, превью ссылок). Правило: что ездит или сохраняется — заморожено; что устройство решает для себя — свободно. (ADR-033)
  • Новые жители провода с 0.1.7: события объектов/работ/field (каждое событие field помещается в один кадр LoRa — измерено и запиннено тестом), публичные кадры инструментов с заверенными писателями и wake-подсказки реле, не несущие содержимого.
  • Совместимость: «бета» отмечает дальность доказательств, а не оговорку — заморозка действует с этого релиза.

v0.1.7 — плоскость инструментов · идемпотентная отправка

  • Показания инструментов ездят на собственной запечатанной плоскости, рядом с разговором, никогда не внутри него. Запечатана на пространство; реле не читает ни ту, ни другую. Ротации ключей доезжают до инструментов как до устройств.
  • Каждая отправка несёт референс дедупликации. Ретрай — или двойное нажатие — не может отчеканить вторую копию: узел дедуплицирует по референсу, клиенты могут повторять свободно.
  • Совместимость: показания ездят в конвертах, которые носит только 0.1.6+. Старые устройства игнорируют плоскость; разговоры не затронуты.

v0.1.6 — конверты стука · запечатанные превью ссылок

  • Стук — новый вид конверта, запечатанный на почтовый ящик человека, не на комнату. Общая комната никогда не узнаёт, что стук был. Ответ (включая постоянное «больше не спрашивать») едет той же дорогой обратно.
  • Превью ссылок забирает отправитель, едут они запечатанным контентом. Узел отправителя забирает превью один раз, до отправки; читатели не запрашивают ничего — с устройства читателя не уходит ни одного запроса к автору ссылки, и ссылка не может стать уведомлением о прочтении.
  • Совместимость: стук доезжает только до устройств на 0.1.6+; старые его просто никогда не видят.

v0.1.5 — медиа в конверте · объявления адресов

  • Небольшое медиа едет вместе с сообщением в почтовый ящик каждого получателя в момент отправки; устройство отправителя после этого не нужно. Большие файлы стримятся запечатанными чанками от того, кто их держит.
  • Каждое сообщение тихо объявляет, где достижимо отправившее устройство; новейшее заявление побеждает. Устройство, переехавшее на другое реле, становится достижимым с первого своего слова.
  • Спаривание вводит устройство в существующую личность, а не копирует снимок; знание о до-сертификационных контактах человека едет вместе со спариванием (закрывает случай пустых комнат из 0.1.2).
  • Совместимость: устройство, которое держит байты, должно быть на 0.1.5+, чтобы его ответы маршрутизировались; одно старое устройство в паре сохраняет старое молчание.

v0.1.2 — сертификаты устройств, с проверкой

  • Каждое устройство несёт сертификат, подписанный корневым ключом человека, и каждая реплика проверяет его до приёма сообщения.
  • Придерживается, не отбрасывается: сообщение, пришедшее раньше сертификата своего устройства, ждёт и принимается в момент прибытия доказательства — на любом транспорте, включая забывающие, что уже передали.
  • Правило ядра из этого релиза: временный отказ в приёме никогда не должен превращаться — транспортом, дедупликацией или кэшем — в отказ навсегда.
  • Совместимость: пространства, созданные до сертификации, работают без миграции хоть байта истории.

Текущий лимит провода на одно сообщение — 16 KiB (интерфейс просит ~4000 знаков — страницу — сильно раньше). Полный протокол живёт в исходниках; проектные записи (ADR) в репозитории несут обоснование каждого правила.