Вот цитата Сэма Янсена из комментария на gafferongames.com :
Выступая в роли исследователя сети, а не разработчика игр, вывод о том, что никогда не следует использовать TCP и UDP, кажется довольно убедительным. TCP будет иметь потерю пакетов, только если он отправляет слишком много данных; в некотором смысле так же, как данные UDP, которые вы отправляете. Разница в том, что у вас нет прямого контроля над скоростью, с которой отправляется TCP, это скрыто от вас.
Если вам просто нужно отправить некоторые надежные данные, и вы не хотите беспокоиться о повторной передаче и реализации надежного протокола, и вы знаете, что скорость будет низкой, то не возникнет никаких проблем с использованием как TCP, так и UDP.
Отношения между этими двумя понятиями не так уж и сложны: TCP просто увеличивает свою скорость отправки (если есть данные для отправки) до тех пор, пока не получит потерю пакета, в этом случае он снова набирает скорость, а затем снова начинает увеличивать скорость (это время медленнее). Когда его увеличение скорости вызывает потерю пакетов, вполне вероятно, что оно затронет и любые другие потоки данных, включая ваши пакеты UDP.
В статье Характеристики потери пакетов UDP: влияние трафика TCP получил свои результаты, открыв сразу несколько соединений TCP и наполнив сеть данными. Это приводит к перегрузке, сопровождаемой глобальной синхронизацией , которая вызывает потерю пакетов. Очевидно, что игровой клиент не откроет сразу дюжину соединений и не наполнит сеть данными, поэтому ваши результаты будут другими.
Чтобы ответить на ваш вопрос:
Мне интересно, имеет ли смысл использовать одновременно TCP и UDP, но для разных целей [...]
Да, это приемлемо, если вы не выходите за пределы полосы пропускания.
- TCP для отправки информации, которая отправляется нечасто, но должна быть гарантированно надежно доставлена. Такие как обновления счета, имя игрока или даже состояние включения / выключения света в игровом мире.
При использовании как TCP, так и UDP, вы всегда должны отдавать как можно больше по UDP и как можно меньше по TCP.
Теперь я спрашиваю вас: действительно ли необходимо отправлять счет, имя игрока и состояние индикатора по TCP? Хотя это правда, что вам нужно в конечном итоге получить эти данные, правда ли, что вам нужно получать эти данные строго по порядку и ровно один раз?
Возможно нет.
UDP отлично работает для этих случаев, и Quake 3 является хорошим примером того, как это сделать.
Так что же тогда является хорошим примером TCP наряду с UDP? Ну, подумайте о игровом чате. Обновления для этого чата (то есть новые строки текста) необходимо отправлять как надежно, так и строго по порядку. Таким образом, TCP хорошо подходит.