Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Кадры
Соединение ZMTP открывается приветствием и командой READY, затем передаёт сообщения из кадров; сообщение этого крейта - три кадра: имя, заголовки, полезная нагрузка.
Схема текстом
- Соединение ZMTP, оба узла: Приветствие сигнатура, версия 3.0, механизм NULL; Команда READY Socket-Type, а также Identity, если она есть у сокета; Сообщения кадры, все, кроме последнего, с флагом MORE
- Одно сообщение этого крейта: Кадр 0 имя; Кадр 1 заголовки; Кадр 2 нагрузка
- Приветствие сигнатура, версия 3.0, механизм NULL → Команда READY Socket-Type, а также Identity, если она есть у сокета: в обе стороны
- Команда READY Socket-Type, а также Identity, если она есть у сокета → Сообщения кадры, все, кроме последнего, с флагом MORE: в обе стороны
- Сообщения кадры, все, кроме последнего, с флагом MORE → Одно сообщение этого крейта: одно сообщение
- Имя - текст в UTF-8, заголовки - строки «имя: значение», а нагрузка - байты, которые записал кодек
ZMTP - протокол, на котором работает каждый сокет ZeroMQ. Оба узла отправляют приветствие с
версией протокола и механизмом безопасности. Клиент zeromq указывает в приветствии версию 3.0 и
механизм NULL, который не проверяет подлинность и не шифрует. Затем каждый узел отправляет команду
READY со своим типом сокета, и если типы несовместимы, соединение на этом закрывается.
Сообщение - это список кадров. Каждый кадр, кроме последнего, помечен флагом MORE, поэтому получатель знает, где кончается одно сообщение. Сокет передаёт сообщение целиком или не передаёт ничего.
Этот крейт кладёт в каждое сообщение три кадра. Кадр 0 - имя, кадр 1 - заголовки, кадр 2 - полезная нагрузка. Узел на любом языке составляет такое сообщение одной многочастной отправкой, как показывает формат передачи. Сообщение из двух кадров читается как имя и полезная нагрузка без заголовков.
Кадр полезной нагрузки - это сам буфер, который записал кодек, а не его копия. Каждый издатель этого крейта забирает байты, которые закодировал рантайм, а кадр владеет своими байтами, поэтому буфер и становится кадром.
Запросы и ответы
Схема текстом
- Запрос, как его читает ROUTER: Идентич- ность узла; Имя; Заголовки; Нагрузка
- Ответ, как его отправляет ROUTER: Идентич- ность; reply; Заголовки; Нагрузка
- Идентич- ность узла → Обработчик видит заголовок reply-to: zmq-reply:<идентичность в hex>: становится
- Обработчик видит заголовок reply-to: zmq-reply:<идентичность в hex> → Идентич- ность: адресует ответ
- ROUTER снимает идентичность, и DEALER запрашивающей стороны получает остальные три кадра
ROUTER отвечающей стороны читает запрос, перед тремя кадрами которого стоит идентичность
запрашивающей стороны. Крейт превращает эту идентичность в заголовок reply-to: префикс
zmq-reply: и за ним идентичность в шестнадцатеричном виде. Ответ обработчика адресуется туда.
Отвечающая сторона монтирует преобразование,
которое задаёт этот адрес для каждой доставки.
На обратном пути кадры такие: идентичность, буквальное имя reply, заголовки и полезная нагрузка.
ROUTER отправляет их соединению, которое названо идентичностью, и снимает идентичность.
Запрос уходит через собственный DEALER со своей случайной идентичностью, поэтому ответ может дойти
только до того запроса, который его задал. В запросе есть заголовок correlation-id; если
вызывающий код задал его сам, значение сохраняется. Ответ с тем же идентификатором завершает
запрос. Заголовки перечислены на странице Конверт.
Протокол - ZMTP 3.0, а конверт с идентичностью взят из паттерна запрос-ответ.