Я отправляю небольшие объемы данных (до 100 байт) каждые 10 минут с устройств на TCP-сервер. В моем случае накладные расходы кажутся огромными (мы платим за каждый байт). Я обнаружил, что у меня есть как минимум 7-10 пакетов (трехстороннее рукопожатие (3), запрос с подтверждением (2), ответ с подтверждением (2, необязательно) и удаление (3)). Суммарные накладные расходы составляют не менее 400 байтов (40 байтов заголовка TCP / IP для каждого пакета).
Вопросы такие:
Почему мои заголовки больше 40 байтов (60 или 52)? Например, вот этот:
0x0000: 4500 0034 73d7 4000 3506 d2ee 5c17 1b9b E..4s.@.5...\...
0x0010: 2599 61b3 be7e 23a3 31a9 710a 6a2f 6371 %.a..~#.1.q.j/cq
0x0020: 8010 0073 2672 0000 0101 080a 02dc 02ef ...s&r..........
0x0030: 1dc2 dad6 ....
Как я могу распечатать список ключей и значений заголовков вместо шестнадцатеричных значений? (это второстепенно)
Каков эффективный способ надежной отправки таких небольших объемов данных? (UDP с подтверждением?)
Да, именно для этого и был изобретен UDP. Это или использовать долгоживущие TCP-соединения.
Почему мои заголовки больше 40 байтов (60 или 52)?
Большинство операционных систем включают в себя гораздо больше, чем просто минимум.
Как я могу распечатать список ключей и значений заголовков вместо шестнадцатеричных значений?
Захватите пакет в Wireshark и сбросьте его анализ.
В зависимости от того, что вы ищете, для получения формата «ключ-значение» может потребоваться нечто большее, чем просто это.
Как долго может жить TCP-соединение?
Технически навсегда. На самом деле, это зависит ... TCP сам по себе не имеет ограничений, соединения могут оставаться в живых в течение многих лет. Реально у большинства приложений есть тайм-аут, по истечении которого они отключают неактивных клиентов. Кроме того, брандмауэры обычно сбрасывают правила с отслеживанием состояния для бездействующих соединений через долгое время.
Отправляет ли TCP дополнительные пакеты, если соединение остается открытым?
Если у вас включена поддержка активности, да. В противном случае, вероятно, нет. Зависит от реализации.
Насколько эффективно держать все связи открытыми?
Чтобы поддерживать каждое соединение открытым, требуется память (обычно несколько КБ). Одна или две тысячи подключений займут всего несколько МБ. Миллионы начинают врезаться в область «много» памяти. Современные операционные системы могут легко отслеживать многие тысячи подключений; но ваше приложение должно быть разумно спроектированным, чтобы вместить это количество.
Каков эффективный способ надежной отправки таких небольших объемов данных?
Определенно UDP, я бы использовал UDP с некоторыми байтами пакета, зарезервированными для контрольной суммы или другого механизма обнаружения ошибок для моих данных, просто для предосторожности.