TCP против UDP - проблемы, возникающие при использовании обоих - PullRequest
5 голосов
/ 16 ноября 2011

Когда я изучаю различные технологии, я часто пытаюсь думать о том, как приложения, которые я регулярно использую, реализуют такие вещи. Я сыграл несколько ММО вместе с несколькими FPS. Я осмотрелся и наткнулся на эту тему:

http://www.gamedev.net/topic/319003-mmorpg-and-the-ol-udp-vs-tcp

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

Я уже несколько раз видел, как кто-то указывал на проблемы, которые могут возникнуть при одновременном использовании UDP и TCP. Какие могут быть некоторые из этих проблем? Являются ли эти проблемы, с которыми в основном сталкиваются начинающие программисты? Мне кажется, что было бы идеально использовать комбинацию UDP и TCP, получая преимущества каждого из них. Однако, если совместное использование этих двух компонентов значительно усложняет код для решения возникших проблем, в определенных ситуациях это может не стоить.

Ответы [ 4 ]

5 голосов
/ 17 ноября 2011

Многие игры используют UDP и TCP вместе. Поскольку каждая игра обязана передавать действия игрока всем, это должно быть сделано тем или иным способом. Теперь все зависит от того, какую игру вы хотите сделать. В RTS, конечно, TCP был бы намного мудрее, так как вы не можете потерять информацию о движении ваших оппонентов. В RPG не так уж важно следить за всем каждую секунду игры.

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

И так началось безумие. Если вы хотите получить максимум от обоих, вам придется адаптировать их. TCP иногда может быть медленным, и вам придется ждать, если пакеты фрагментированы или не поступают по порядку, пока ОС не соберет их заново. В некоторых случаях было бы целесообразно создать свой собственный надежный протокол поверх UDP. Это позволит вам полностью контролировать свой трафик. Большинство брандмауэров не сбрасывают UDP или что-либо еще, но, как и в случае с TCP, любой трафик, который не объявлен безопасным (открытие портов, перенаправление пакетов и т. Д.), Сбрасывается. Я бы посоветовал вам прочитать статью TCP и UDP и UDP-Lite в Википедии, а затем решить, какие из них вы хотите использовать для каких целей. AFAIK Battle.net использует комбинацию из двух.

1 голос
/ 08 февраля 2013

Многие сервисы используют udp и tcp вместе, но это без добавления контроля перегрузки к вашей реализации udp может вызвать серьезные проблемы для tcp. Короче говоря, UDP может и часто будет закупоривать маршрутизаторы в каждой конечной точке, что заставляет tcp контролировать перегрузку, что приводит к потере работоспособности и значительно ограничивает все соединения tcp. Перегрузка на основе udp также может привести к значительному увеличению потерь пакетов для tcp, еще больше ограничивая пропускную способность tcp, так как для этого потребуется повторная передача этих пакетов. Совместное их использование не является плохой идеей и даже становится довольно распространенным явлением, но вы должны помнить об этом.

1 голос
/ 17 ноября 2011

Я думаю, что если вам нравится передавать игровые данные, TCP будет единственным решением. Представьте, что вы отправляете команду (например, получил х элемент: P) на сервере, и этот пакет никогда не достигает своего места назначения. (У УДП нет гарантий).

Также представьте себе сценарий, когда два или более пакетов UDP достигают своего назначения в неправильном порядке.

Но если в вашей игре вы интегрируете какие-либо возможности VoIP или видеозвонка, вы можете использовать эти UDP.

1 голос
/ 16 ноября 2011

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

Это может вызвать проблемы, если вы используете TCP для управленияили контролировать передачу UDP;Например, вы можете сообщить серверу через TCP, что вы будете отправлять некоторые дейтаграммы через UDP на порт X. Если удаленный компьютер еще не прослушивает порт X, он может не получить некоторые из этих дейтаграмм, поскольку они прибыли раньшебыло сказано слушать;если он слушает, но не ожидает трафика от вас, он может отбросить их, потому что они появились до того, как было сказано ожидать их.Это может отрицательно повлиять на ход вашей программы или опыт пользователя.

...