2016-09-02 4 views
2

Если да, то знаете ли вы примеры того, что может пойти не так в сети, отличной от TCP?Является ли TCP/IP обязательным для MQTT?

Узнав о MQTT Я столкнулся с несколькими упоминаниями о том, что MQTT полагается на стек TCP/IP. Например, из mqtt.org:

MQTT для сенсорных сетей направлена ​​на встраиваемых устройств на не-TCP/IP сетей, в то время как сам MQTT явно ожидает TCP/IP стека.

Но если вы прочитаете справочные документы, вы не найдете ничего подобного. Кроме того, есть поле QoS, которое может использоваться для надежной доставки и значения, отличные от 0, практически бесполезны в сетях TCP/IP. Прямо сейчас я не вижу ничего, что помешало бы мне установить соединение MQTT с использованием UNIX-канала, домена или сокета UDP, а не сокета TCP.

ответ

7

MQTT просто требует заказанной и надежной доставки, она не обязательно должна быть TCP. SCTP работает очень хорошо, например, но UDP не потому, что не существует способа гарантировать, что ваш большой пакет PUBLISH, состоящий из нескольких UDP-пакетов, поступит в порядок и завершен.

Что касается надежности TCP, теоретически то, что вы говорите, верно, но на практике, когда приложение вызывает write() и получает успешное возвращение, оно не может гарантировать, когда данные фактически вывели его из компьютера на удаленный узел. Все write() (или send()) действительно копирует данные в буферы ядра, после чего у вас больше нет контроля.

Единственный способ убедиться, что сообщение достигло удаленного хоста на уровне приложения - это ответить на удаленный хост.

+0

Я не пробовал, но я бы подумал, что гнездо Unix типа SOCK_STREAM достаточно близко к TCP, чтобы оно работало нормально. Хотя единственное преимущество, о котором я могу думать, это разрешения Unix. – njh

+0

Да, я специально не исключил разъемы UNIX. – ralight

Смежные вопросы