Пропускная способность экономит GPRS и TCP - PullRequest
1 голос
/ 06 марта 2011

Здравствуйте, я создал программу для моего старого телефона Windows Mobile, которая отправляет данные GPS, температуру и т. Д. Каждые 5 секунд только для экспериментальных целей, чтобы создать систему управления парком.

Я заметил, что в течение одного часа было использовано 350 КБ, хотя я отправил только 20 КБ данных ...

Поскольку я не обладаю глубокими знаниями в сетях, сколько стоит TCP-соединение в байтах?

Может быть, я должен сохранить сокет живым, потому что я закрываю и открываю его каждые 5 секунд. Это сохранит байты?

Также имеет значение MTU здесь? Любая другая идея уменьшить накладные расходы? спасибо

1 Ответ

8 голосов
/ 06 марта 2011

Давайте немного подсчитаем.

Каждые 5 секунд - 720 подключений в час плюс данные.20K / 720 - это около 28 байт полезной нагрузки (ваши данные GPS) для каждого соединения.

IP and TCP headers along are 48 bytes in addition to whatever data is being sent.

3-way handshake connection: 3 packets (2 out, 1 in) == 96 bytes out and 48 bytes in
Outbound Data-packet: 48+28 bytes == 76 bytes (out)
Inbound Ack: 48 bytes (in)
Close: 48 bytes (out)
Final Ack: 48 bytes (in)

Total out per connection: 220
Total in per connection:  144
Total data send/received per connection: 220+144 = 364
Total data usage in one hour = 364 * 720 = 262K

Так что я нахожусь на уровне ваших оценок использования данных.

Если выЧтобы уменьшить использование полосы пропускания, вот три идеи:

  1. Уменьшите частоту обновления.

  2. Не прерывайте сокетное соединение каждыйвремя.Просто держите его открытым.

  3. Учитывая, что ваши GPS-координаты периодически обновляются, вы можете рассмотреть возможность использования UDP вместо TCP.Существует вероятность потери пакетов, но, учитывая, что вы все равно повторно отправляете более свежие данные каждые 5 секунд, потерянное обновление не стоит пропускной способности для повторной передачи.Заголовки IP и UDP объединены только в 28 байтов без дополнительных издержек «соединения».

ОБНОВЛЕНИЕ

Когда я первоначально разместил это сообщение, я ошибочно понялсоединение близко к единственному обмену пакетами FIN между клиентом и сервером.На практике клиент отправляет FIN как часть его, инициируя ЗАКРЫТИЕ.Затем сервер ACKs FIN.Затем сервер отправляет свой собственный FIN, который ACK'd клиентом.Другими словами, дополнительные 96 байтов на соединение.Переделав нашу математику:

Total data send/received per connection =
220+48 + 144+48 = 460
Total data usage in one hour = 460 * 720 = 331K

Таким образом, моя пересмотренная оценка 331KB за один час немного ближе к тому, что видел OP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...