Después de leer ¿UDP es aún mejor que TCP para juegos en tiempo real con muchos datos? , Me pregunto si tiene sentido usar TCP y UDP al mismo tiempo, pero para diferentes cosas:
TCP para enviar información que se envía con poca frecuencia, pero se debe garantizar que llegue de manera confiable.
Como las actualizaciones de puntaje, el nombre de un jugador o incluso el estado de encendido / apagado de una luz en el mundo del juego.UDP para transmitir información que se actualiza constantemente y puede perderse ocasionalmente, ya que la información más nueva siempre está en camino.
Tales como posición, rotación, etc.
¿Es esta una idea razonable? ¿Cuáles son los posibles inconvenientes?
¿Hay mejores formas de manejar esto?
networking
multiplayer
udp
gandalf3
fuente
fuente
Respuestas:
Resulta en la pérdida de paquetes para UDP debido a la contención entre los dos protocolos; recuerde que UDP no garantiza la entrega, mientras que TCP sí. Más paquetes TCP pasarán mientras UDP sufre: TCP induce la pérdida de paquetes UDP . También ha surgido la idea (histórica) de que la infraestructura del enrutador favorece el TCP sobre el UDP, aunque dudo que aún sea cierto en esta etapa tardía.
Creo que sería mejor encontrar uno de los protocolos UDP orientados a la conexión que está disponible para su uso en juegos y similares, que le ofrece algunos de los beneficios de TCP sin ninguna de sus desventajas. Hay algunos de estos, generalmente con un documento técnico que detalla cada concepto.
Un ejemplo de ellos es la biblioteca de código abierto Enet , su característica principal es la entrega confiable y en orden de paquetes por UDP.
fuente
Aquí hay una cita de Sam Jansen de un comentario en gafferongames.com :
El documento Características de la pérdida de paquetes UDP: el efecto del tráfico TCP obtuvo sus resultados al abrir múltiples conexiones TCP a la vez e inundar la red con datos. Esto conduce a la congestión seguida de la sincronización global , que causan paquetes descartados. Obviamente, un cliente de juegos no abrirá una docena de conexiones a la vez e inundará la red con datos, por lo que sus resultados serán diferentes.
Para responder tu pregunta:
Sí, esto es aceptable si se mantiene dentro de los límites de ancho de banda.
Cuando use TCP y UDP, siempre debe preferir enviar tanto como sea posible a través de UDP y lo menos posible a través de TCP.
Ahora, te pregunto esto: ¿es realmente necesario enviar la puntuación, el nombre del jugador y el estado de una luz sobre TCP? Si bien es cierto que necesita recibir estos datos eventualmente, ¿es cierto que necesita recibir estos datos estrictamente en orden y exactamente una vez?
Probablemente no.
UDP funciona bien para estos casos, y Quake 3 es un buen ejemplo de cómo.
Entonces, ¿cuál es un buen ejemplo de TCP junto con UDP? Bueno, piensa en el chatbox de un juego. Las actualizaciones de este chatbox (es decir, las nuevas líneas de texto) deben enviarse de manera confiable y estrictamente en orden. Por lo tanto, TCP es un buen ajuste.
fuente
¿Es esta una idea razonable?
¿Cuáles son los posibles inconvenientes?
¿Hay mejores formas de manejar esto?
fuente
Hay una restricción de recursos adicional a considerar. La mayoría de las implementaciones (creo en todo, pero no tengo referencia) de TCP en el servidor tienen límites en la cantidad de conexiones TCP simultáneas que el servidor puede tener abiertas al mismo tiempo. Esto limitaría la cantidad de jugadores que puedes tener abiertos al mismo tiempo si cada jugador necesita su propia conexión.
Los límites están definidos por la configuración en el sistema de red. Además, cada conexión utiliza algo de memoria que debe provenir de algún lugar del servidor.
Una solución es abrir solo una conexión TCP temporal mientras se transfieren los datos y cerrarla de inmediato. Esto hará que las transacciones sean más lentas, abrir una conexión tcp es un proceso bastante "costoso". Como siempre, se trata de diseñar un sistema robusto desde el principio para permitir un gran crecimiento.
fuente