#sockets #tcp #network-programming #udp #data-transfer
#сокеты #tcp #сетевое программирование #udp #передача данных
Вопрос:
Наша компания разработала станции, которые собирают данные на сельскохозяйственном поле. Эти поля могут находиться в глуши, поэтому станции используют GSM / GPRS с SIM-картой, которая автоматически переключается на самого сильного провайдера.
Каждые 5 минут устанавливается подключение к Интернету для отправки данных на сервер. Данные имеют структуру с длиной пакета, командой, данными датчика и проверкой crc. Но эти структуры данных отправляются с http post на URL.
Для 480 байт данных используется около 2550 байт трафика данных. В протоколе HTTP много накладных расходов. Поскольку нам нужно отправить только 480 байт данных, у нас 80% накладных расходов на post через http. Сейчас у нас несколько сотен станций, и это число растет. Таким образом, затраты на трафик данных быстро растут.
Мы хотим переделать передачу данных. Данные отправляются микропроцессором microchip на станциях.
Наша цель — максимально снизить накладные расходы при гарантированной доставке данных. Итак, я изучил TCP и UDP.
TCP имеет обнаружение сбоев и восстановление, но имеет более высокие издержки. UDP имеет меньшие накладные расходы, но там не гарантируется, что данные доставляются без сбоев.
Моя первая идея — создать сервер, который прослушивает TCP-порт. И станции отправляли данные по протоколу TCP. В основном из-за гарантированной доставки данных.
С UDP мы должны сами разрабатывать проверку и повторную отправку данных, но структура данных наших записей уже подготовлена для выполнения проверок.
Так что я действительно сомневаюсь, что делать. И я пытаюсь получить ответ на эти вопросы:
-
Сколько байтов потребуется TCP и UDP для отправки (и доставки) 480 байт данных?
-
Являются ли TCP и UDP лучшими способами для отправки 480 байт данных или есть более разумное решение с еще меньшими накладными расходами?
Комментарии:
1. Экспериментируйте и тестируйте . Если вы можете измерить, сколько данных отправляется вашим текущим методом, вы должны быть в состоянии измерить, как это происходит при использовании TCP или UDP. И не забудьте протестировать с плохим приемом и плохими проводными соединениями, чтобы проверить, как это работает, когда требуется много повторных передач и попыток.
2. Да, мы можем это измерить. Поставщик sim-карты предоставляет нам подробную информацию об отправленных и полученных байтах для каждого соединения. Поэтому мы должны сначала запрограммировать решение. Теперь мы выбираем TCP.
Ответ №1:
Сколько байтов потребуется TCP и UDP для отправки (и доставки) 480 байт данных?
A (типичный) Длина заголовка TCP составляет 20 байт, хотя с помощью опций он может быть (немного) длиннее. Если все 480 байт отправляются в одном сегменте TCP, вы получите 480 20 20 (IP-заголовок) = 520 байт перед служебными данными уровня 2.
UDP имеет 8-байтовый заголовок, поэтому для UDP у вас будет 480 8 20 = 508 байт.
Однако вам следует учитывать, что TCP является потоковым протоколом. Чтение из сокета TCP похоже на чтение из двоичного файла — вам нужно будет самостоятельно разделить этот поток на отдельные сообщения, используя какой-то разделитель или добавляя длину сообщения к каждому сообщению.
UDP, с другой стороны, работает с отдельными сообщениями. Чтение из сокета UDP будет возвращать сообщения по одному за раз.
Являются ли TCP и UDP лучшими способами для отправки 480 байт данных или есть более разумное решение с еще меньшими накладными расходами?
UDP и TCP являются транспортными протоколами самого низкого уровня в Интернете. HTTP и другие протоколы высокого уровня построены поверх них. Если размер данных критичен, необработанные TCP и UDP имеют настолько низкие накладные расходы, насколько это возможно без использования необработанных сокетов и встраивания ваших данных непосредственно в IP-пакеты.
Комментарии:
1.
SOCK_SEQPACKET
Для надежности, подобной TCP, также используются UDP-подобные дейтаграммы. И, учитывая вариант использования, описанный в OP, надежность может быть большой проблемой (возможно, даже больше, чем накладные расходы TCP и UDP).