Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Сессии

Сессия MQTT хранит подписки клиента и неподтверждённые сообщения; постоянная сессия переживает соединение и возобновляется при переподключении.

Постоянная сессия от первого CONNECT до её возобновления после потери соединенияЭтот сервисСервер MQTTCONNECT: client id,clean start false,срок сессии, воляCONNACKsession present: нетPINGREQ в простоедля keep-aliveСоединение потеряно,без DISCONNECTСервер публикуетпоследнюю волюХранит сессию:подписки, сообщениябез подтвержденияСнова CONNECT:тот же client id,clean start falseCONNACKsession present: даХранимые сообщенияотправляются снова
Схема текстом
  1. Этот сервис: CONNECT: client id, clean start false, срок сессии, воля; PINGREQ в простое для keep-alive; Снова CONNECT: тот же client id, clean start false
  2. Сервер MQTT: CONNACK session present: нет; Соединение потеряно, без DISCONNECT; Сервер публикует последнюю волю; Хранит сессию: подписки, сообщения без подтверждения; CONNACK session present: да; Хранимые сообщения отправляются снова
  3. CONNECT: client id, clean start false, срок сессии, воля → CONNACK session present: нет
  4. CONNACK session present: нет → PINGREQ в простое для keep-alive
  5. PINGREQ в простое для keep-alive → Соединение потеряно, без DISCONNECT
  6. Соединение потеряно, без DISCONNECT → Сервер публикует последнюю волю
  7. Сервер публикует последнюю волю → Хранит сессию: подписки, сообщения без подтверждения
  8. Хранит сессию: подписки, сообщения без подтверждения → Снова CONNECT: тот же client id, clean start false
  9. Снова CONNECT: тот же client id, clean start false → CONNACK session present: да
  10. CONNACK session present: да → Хранимые сообщения отправляются снова

Идентификатор клиента называет сессию. MqttBroker::new принимает его рядом с URL, и второе соединение с тем же идентификатором забирает сессию себе.

Переживёт ли сессия соединение, решают два параметра CONNECT. clean_start(false) просит сервер возобновить сессию, которая уже есть у этого идентификатора клиента. session_expiry задаёт, сколько целых секунд сервер хранит сессию после конца соединения. Без них соединение начинает чистую сессию, и она заканчивается вместе с соединением.

CONNACK сообщает, нашёл ли сервер сессию. Если сессии нет, этот крейт заново подписывает каждый фильтр. Если сессия есть, подписки всё ещё на сервере, а следом приходят сообщения с QoS 1 и QoS 2, которые поступили, пока сервиса не было, или которые он так и не подтвердил. Такие сообщения могут прийти раньше, чем откроется подписка, к которой они относятся, поэтому крейт держит до 1024 из них, пока она не откроется.

Keep-alive - самое долгое молчание, которое допускает соединение. Когда больше ничего не передаётся, клиент отправляет PINGREQ, а сервер закрывает соединение, которое молчит в полтора раза дольше интервала. rumqttc запрашивает 60 секунд, если keep_alive не задаёт другое значение, и не принимает меньше 5 секунд.

Последняя воля - сообщение, которое CONNECT оставляет серверу. Сервер публикует его, когда соединение заканчивается без DISCONNECT: при падении процесса, потере сети или истёкшем keep-alive. Остановка отправляет DISCONNECT, поэтому сервис, который останавливается штатно, последнюю волю не публикует.

Ещё два параметра CONNECT ограничивают то, что отправляет сервер. Receive Maximum описан на странице Качество обслуживания. Maximum Packet Size - наибольший пакет протокола, который принимает клиент. Сообщение крупнее этого предела сервер отбрасывает для этого клиента, а не отправляет. По умолчанию этот крейт объявляет 1 МиБ, а max_packet_size меняет это значение. CONNACK также сообщает, поддерживает ли сервер идентификаторы подписок, на которые опирается Демультиплексирование.

Сессию определяет сам протокол, разделы 3.1, 3.2 и 4.1 стандарта MQTT 5.0. Как этот крейт открывает и закрывает её, показывает страница Жизненный цикл.