//-----------------------------------------------------------------------------
Введение
//-----------------------------------------------------------------------------
Протокол передачи данных между узлами распределённой нейросети
(Data Transfer Protocol between the nodes in a Distributed Neural Network),
коротко DTPDNN.
//-----------------------------------------------------------------------------
Потоки
//-----------------------------------------------------------------------------
Минимальная единица данных при передаче между двумя узлами называется потоком.
Поток представляет собой XML-документ с родительским элементом stream:
//-----------------------------------------------------------------------------
Инициализация
//-----------------------------------------------------------------------------
При соединении двух узлов должна произойти инициализация протокола.
При инициализации протокола указывается его версия, а также уникальный
идентификатор клиента.
Примеры версии протокола:
1.0, 1.2.5, 2RC и т.д.
Уникальный идентификатор должен представлять собой MD5-хеш.
Первый поток должен быть отправлен инициализатором соединения:
1.0
b52c96bea30646abf8170f333bbd42b9
Поток ответа может содержать признак успешной инициализации или сообщение
о возникшей ошибке.
Например, сообщение об успешной инициализации:
b52c96bea30646abf8170f333bbd42b9
NeuroHopking
Подробней о сообщениях см. "Сообщения"
//-----------------------------------------------------------------------------
Сообщения
//-----------------------------------------------------------------------------
Признак успешной инициализации, а также другие сообщения, которые передаются
для подтверждения чего-либо или для указания ошибки, имеют такую структуру:
b52c96bea30646abf8170f333bbd42b9
NeuroHopking
Атрибут text должен содержать человекочитаемое сообщение.
Атрибут state может быть следующим:
PROTO_INIT_OK - инициализация протокола успешна
PROTO_INIT_ERROR - инициализация протокола неуспешна
TRANS_BEGIN_OK - начало транзакции успешно
TRANS_BEGIN_ERROR - начало транзакции провалено
TRANS_END_OK - транзакция окончена успешно
TRANS_END_ERROR - транзакция окончена с ошибкой
TRANS_STOP - транзакция не состоится
Можно также определить пользовательские сообщения для обеспечения логики
уровня приложения.
Тег clientID должен содержать в себе MD5-хеш, который был изначально
передан при инициализации в теге uid.
Этот тег должен передаваться в дальнейшем во всех передаваемых потоках
для однозначной идентификации узлов.
Поскольку каждая задача будет выполняться в отдельном потоке, необходимо
знать, какой задаче предназначен поток.
Тег threadID содержит строковый идентификатор задачи, для которой
предназначается поток.
//-----------------------------------------------------------------------------
Транзакции
//-----------------------------------------------------------------------------
При передаче больших массивов данных имеет смысл разбивать данные на части
(chunks). Протокол TCP разбивает информацию на пронумерованные пакеты.
Далее с помощью протокола IP все пакеты передаются получателю,
где они располагаются в нужном порядке и собираются в единое целое.
То есть TCP/IP фактически разбивает данные на маленькие пакеты одинакового
размера и автоматически определяет маршрут, по которому данные будут
добираться до адресата.
Однако, для того, чтобы принять массив данных, необходимо знать величину
этих данных в байтах, которую необходимо указать в параметре функции recv.
Транзакции разбивают процесс получения больших массивов данных на две части:
1) Происходит инициализация транзакции:
b52c96bea30646abf8170f333bbd42b9
NeuroHopking
Атрибут state указывает на этап транзакции. Он может принимать несколько
значений:
TRANS_BEGIN - начало транзакции
Атрибут chunk-size должен содержать целочисленное значение величины
передаваемых данных в байтах. Обрамляющий XML также должен учитываться
при вычислении значения chunk-size. То есть chunk-size должен отражать
размер в байтах всего потока.
Ответ может быть таким:
b52c96bea30646abf8170f333bbd42b9
NeuroHopking
Что означает, что отвечающая сторона готова принять данные.
Или таким:
b52c96bea30646abf8170f333bbd42b9
NeuroHopking
Что означает, что отвечающая сторона по какой-то причине не может
принять данные.
2) Передаются данные:
b52c96bea30646abf8170f333bbd42b9
NeuroHopking
SGVsbG8gd29ybGQhISE=
Тег data должен содержать base64-хеш передаваемых данных. В нашем случае
была передана строка "Hello world!!!".
Ответ должен содержать сообщение об успехе либо провале при принятии данных:
b52c96bea30646abf8170f333bbd42b9
NeuroHopking
или
b52c96bea30646abf8170f333bbd42b9
NeuroHopking
Получив отрицательный ответ от принимающей стороны, можно попытаться
передать данные повторно, либо отказаться от передачи, передав сообщение:
b52c96bea30646abf8170f333bbd42b9
NeuroHopking
В таком случае получаемая сторона может больше не ожидать данные и продолжить
работу по своему сценарию. Это сообщение может отправить только сторона,
отправляющая данные.
//-----------------------------------------------------------------------------