Предотвращение TCP-соединений от потери пакетов UDP - PullRequest
1 голос
/ 27 марта 2011

Рассмотрим прототип многопользовательского игрового сервера.

Клиенты, подключающиеся к серверу, могут загружать карты и сценарии.Для этого просто создать TCP-соединение.

Однако сервер должен по-прежнему реагировать на остальных клиентов через UDP.Если загрузочным соединениям TCP разрешено насыщать доступную полосу пропускания, трафик UDP сильно пострадает от потери пакетов.

Как лучше всего решить эту проблему?Это определенно кажется хорошей идеей как-то «ограничить» TCP-соединение для загрузки, отслеживая время и send() через регулярный интервал времени.Таким образом, если потеря пакетов UDP начинает происходить чаще, соединения TCP могут быть дополнительно ограничены.Будет ли ОС склоняться к объединению данных вместо того, чтобы отправлять их в устойчивом потоке?Как часто я хотел бы звонить send()?Я полагаю, что выполнение этого слишком часто приведет к буферизации данных, что сделает метод неэффективным, а слишком частое выполнение приведет к недостаточной (и неэффективной работе) пропускной способности.Аналогичные соображения существуют в отношении того, сколько данных send каждый раз.

Ответы [ 3 ]

2 голосов
/ 27 марта 2011

Звучит так, будто вы решили проблему не так, как надо:

  1. Если вы беспокоитесь о потере пакетов UDP, вам следует рассмотреть возможность не использовать UDP.
  2. Если вы беспокоитесь о распределении пропускной способности между двумя функциями, вам следует рассмотреть возможность использования для них отдельных каналов (пропускной способности).
  3. Формирование трафика (как это звучит) обычно используется в ОС. Вы должны посмотреть в этом направлении, прежде чем вносить странные изменения в свое приложение.
  4. Если приложение еще не запущено и вы столкнулись с этой проблемой, вы, вероятно, преждевременно оптимизируете.
1 голос
/ 23 сентября 2016

Чтобы избежать насыщения полосы пропускания, вам нужно применить какое-то ограничение скорости. TCP фактически уже делает это, но в некоторых случаях это может быть неэффективно. Например, он понятия не имеет, вы считаете, что трафик TCP или UDP является более важным.

Для реализации любой формы ограничения скорости, связанной с UDP, сначала необходимо рассчитать коэффициент потерь UDP. Пакеты UDP должны иметь порядковые номера, а затем клиент должен посчитать, сколько уникальных пакетов он фактически получил, и отправить эту информацию обратно на сервер. Это дает вам коэффициент потери пакетов. Сервер должен следить за этим, и если потеря пакета увеличивается после начала передачи файла, начните снижать скорость передачи, пока потеря пакета не станет приемлемой. (Возможно, вам все равно придется сделать это для UDP, поскольку UDP не контролирует перегрузку.)

Обратите внимание, что, хотя я упоминал выше "сервер", это действительно может быть сделано либо в одном направлении, либо в обоих случаях. В зависимости от того, кто должен отправить что. Представьте себе игру с картами, созданными игроками, которые передают эти карты через одноранговые соединения.

Хотя понижение скорости передачи может быть столь же простым, как и менее частый вызов функции отправки, попытка управлять TCP таким образом, несомненно, будет конфликтовать с существующим контролем скорости передачи, который имеет TCP. Как предлагается в другом ответе, вы можете рассмотреть возможность поиска более всеобъемлющих способов управления TCP.

В данном конкретном случае я сомневаюсь, что это будет проблемой, если только вам действительно не нужно отправлять много UDP-информации , пока клиенты передают файлы. Я ожидаю, что большинство игр покажет экран загрузки или лобби, когда это происходит. Ни один из них не должен требовать большого трафика UDP, если ваша игра не имеет собственного VOIP.

Вот отличная серия статей, в которых объясняются некоторые возможные варианты использования как TCP, так и UDP, особенно в контексте сетевых игр. TCP против UDP

В более поздней статье из этой серии он даже объясняет способ сделать UDP «почти» таким же надежным, как TCP (с примерами кода).

И как всегда ... и оцените свои результаты. У вас нет возможности узнать, ускоряет или замедляет ваш код соединение, если вы не измеряете.

0 голосов
/ 27 марта 2011

"# Если вы беспокоитесь о потере пакетов UDP, вам следует подумать о том, чтобы не использовать UDP."

Отлично.UDP означает отсутствие гарантии доставки пакетов, особенно через Интернет.Проверьте скорость TCP, которая является приемлемой в современных интернет-соединениях для большинства пользователей, играющих в игры.

...