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

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

Кадры

Соединение ZMTP открывается приветствием и командой READY, затем передаёт сообщения из кадров; сообщение этого крейта - три кадра: имя, заголовки, полезная нагрузка.

Открытие соединения ZMTP, затем одно сообщение этого крейта в виде трёх кадровСоединение ZMTP, оба узлаОдно сообщение этого крейтаПриветствиесигнатура, версия 3.0, механизм NULLКоманда READYSocket-Type, а также Identity, если она есть у сокетаСообщениякадры, все, кроме последнего, с флагом MOREКадр 0имяКадр 1заголовкиКадр 2нагрузкаИмя - текст в UTF-8, заголовки - строки «имя: значение»,а нагрузка - байты, которые записал кодек
Схема текстом
  1. Соединение ZMTP, оба узла: Приветствие сигнатура, версия 3.0, механизм NULL; Команда READY Socket-Type, а также Identity, если она есть у сокета; Сообщения кадры, все, кроме последнего, с флагом MORE
  2. Одно сообщение этого крейта: Кадр 0 имя; Кадр 1 заголовки; Кадр 2 нагрузка
  3. Приветствие сигнатура, версия 3.0, механизм NULL → Команда READY Socket-Type, а также Identity, если она есть у сокета: в обе стороны
  4. Команда READY Socket-Type, а также Identity, если она есть у сокета → Сообщения кадры, все, кроме последнего, с флагом MORE: в обе стороны
  5. Сообщения кадры, все, кроме последнего, с флагом MORE → Одно сообщение этого крейта: одно сообщение
  6. Имя - текст в UTF-8, заголовки - строки «имя: значение», а нагрузка - байты, которые записал кодек

ZMTP - протокол, на котором работает каждый сокет ZeroMQ. Оба узла отправляют приветствие с версией протокола и механизмом безопасности. Клиент zeromq указывает в приветствии версию 3.0 и механизм NULL, который не проверяет подлинность и не шифрует. Затем каждый узел отправляет команду READY со своим типом сокета, и если типы несовместимы, соединение на этом закрывается.

Сообщение - это список кадров. Каждый кадр, кроме последнего, помечен флагом MORE, поэтому получатель знает, где кончается одно сообщение. Сокет передаёт сообщение целиком или не передаёт ничего.

Этот крейт кладёт в каждое сообщение три кадра. Кадр 0 - имя, кадр 1 - заголовки, кадр 2 - полезная нагрузка. Узел на любом языке составляет такое сообщение одной многочастной отправкой, как показывает формат передачи. Сообщение из двух кадров читается как имя и полезная нагрузка без заголовков.

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

Запросы и ответы​

Запрос на ROUTER отвечающей стороны и ответ на него: кадр идентичности становится reply-to, и ответ отправляется вслед за нимЗапрос, как его читает ROUTERОтвет, как его отправляет ROUTERИдентич-ность узлаИмяЗаголовкиНагрузкаОбработчик видит заголовокreply-to: zmq-reply:<идентичность в hex>Идентич-ностьreplyЗаголовкиНагрузкаROUTER снимает идентичность, и DEALERзапрашивающей стороны получает остальные три кадра
Схема текстом
  1. Запрос, как его читает ROUTER: Идентич- ность узла; Имя; Заголовки; Нагрузка
  2. Ответ, как его отправляет ROUTER: Идентич- ность; reply; Заголовки; Нагрузка
  3. Идентич- ность узла → Обработчик видит заголовок reply-to: zmq-reply:<идентичность в hex>: становится
  4. Обработчик видит заголовок reply-to: zmq-reply:<идентичность в hex> → Идентич- ность: адресует ответ
  5. ROUTER снимает идентичность, и DEALER запрашивающей стороны получает остальные три кадра

ROUTER отвечающей стороны читает запрос, перед тремя кадрами которого стоит идентичность запрашивающей стороны. Крейт превращает эту идентичность в заголовок reply-to: префикс zmq-reply: и за ним идентичность в шестнадцатеричном виде. Ответ обработчика адресуется туда. Отвечающая сторона монтирует преобразование, которое задаёт этот адрес для каждой доставки.

На обратном пути кадры такие: идентичность, буквальное имя reply, заголовки и полезная нагрузка. ROUTER отправляет их соединению, которое названо идентичностью, и снимает идентичность.

Запрос уходит через собственный DEALER со своей случайной идентичностью, поэтому ответ может дойти только до того запроса, который его задал. В запросе есть заголовок correlation-id; если вызывающий код задал его сам, значение сохраняется. Ответ с тем же идентификатором завершает запрос. Заголовки перечислены на странице Конверт.

Протокол - ZMTP 3.0, а конверт с идентичностью взят из паттерна запрос-ответ.