Извините за такой длинный пост. Я провел много и много исследований по этой теме, и у меня есть вторая предпосылка, по которой я должен идти. Спасибо заранее за ваши мысли и вклад.
Сценарий:
Создание программы в Java, которая посылает пакеты данных каждые. 2-.5 секунд, которые содержат простые "в этот момент" или данных в реальном времени до примерно 5-7 клиентов. (Приблизительно всего 10 байт данных для каждого пакета). Сервер может быть подключен через Wi-Fi или Ethernet. Однако клиенты ограничены только использованием Wi-Fi. Клиент не будет отправлять какие-либо пакеты на сервер, поскольку он будет отображать только данные, полученные с сервера.
Мои мысли:
Я изначально начал создавать серверную программу с использованием TCP в качестве транспортного уровня. Это будет использовать класс ServerSocket внутри Java. Я также сделал многопоточность для приема нескольких клиентов.
TCP звучал как отличная идея по разным причинам.
Настолько совершенен! Управление потоком имеет решающее значение для этого сценария (так как клиент хочет самую параллельную информацию), время настройки не такое большое, и я в значительной степени гарантирован, что сообщение будет получено. Итак, его чиновник, я принял решение пойти с TCP....
Кроме того, что происходит, когда TCP отстает из-за потери пакетов? "Самая большая проблема с TCP в этом сценарии - это алгоритм управления перегрузкой, который рассматривает потерю пакетов как признак ограничений пропускной способности и автоматически дросселирует отправку пакетов. В сетях 3G или Wi-Fi это может вызвать значительную задержку".
Увидев заметную фразу "значительная латентность", я понял, что это не будет хорошо для этого сценария, так как клиенту необходимо увидеть текущие данные в этот момент, а не продолжать получать данные с.8 секунд назад. Итак, я вернулся к чертежной доске.
После проведения дополнительных исследований я обнаружил еще одну процедуру, которая включала UDP с многоадресной рассылкой. Это использует DatagramSocket на стороне сервера и MulticastSocket на стороне клиента.
UDP с многоадресной рассылкой также имеет свои преимущества:
Поскольку скорость отправки пакетов будет довольно быстрой (. 2-.5 сек.), Я не слишком беспокоюсь о потере пакетов (если он не будет последовательно отбрасывать пакеты и выглядит невосприимчивым). Основная проблема, с которой я сталкиваюсь с UDP над чем-либо, заключается в том, что она не знает порядок отправки пакетов. Так, например, скажем, я хотел отправить текущие данные текущего времени. Сервер отправляет пакеты, содержащие "11:59:03", "11:59:06", "11:59:08" и т.д. Я бы не хотел, чтобы данные были представлены клиенту как "11:59: 08 "," 11:59:03 "," 11:59:06 "и т.д.
После представления всей информации выше, вот мои вопросы:
TCP "догоняет" себя при возникновении проблем с задержкой или всегда остается в стороне, когда возникает латентность при получении пакетов? Если да, то достаточно ли быстро восстановить "живые" данные?
Как часто пакеты данных выходят из строя с UDP?
И превыше всего:
Спасибо за помощь!
TCP "догоняет" себя при возникновении проблем с задержкой или всегда остается в стороне, когда возникает латентность при получении пакетов?
TCP восстанавливает скорость передачи, когда он сталкивается с перегрузкой, и пытается восстановить, увеличивая его.
Если да, то достаточно ли быстро восстановить "живые" данные?
Я не знаю, что означает это предложение, но, как правило, полная скорость в конечном итоге восстанавливается.
Как часто пакеты данных выходят из строя с UDP?
Это полностью зависит от промежуточной сети. На это нет единого ответа.
NB Это довольно обычная ссылка, которую вы цитируете.
Я не люблю эту практику, ссылаясь на произвольный интернет-мусор здесь, а затем задавая вопросы на его основе.
UDP-пакеты могут выйти из строя, если между сервером и клиентом существует много перелетов, но более вероятно, чем выйти из строя, так это то, что некоторые из них будут сброшены (опять же, чем больше шансов, тем больше шансов). Если ваша главная проблема с UDP - это порядок, и если у вас есть контроль над клиентом, вы можете просто отказаться от любых сообщений с более ранней меткой времени, чем предыдущая.