Tengo una pregunta sobre UDP. Por contexto, estoy trabajando en un juego de acción en tiempo real.
He leído bastante sobre las diferencias entre UDP y TCP y creo que las entiendo bastante bien, pero hay una pieza que nunca se ha sentido correcta, y es la fiabilidad y los reconocimientos específicos . Entiendo que UDP no ofrece confiabilidad por defecto (es decir, los paquetes se pueden descartar o llegar fuera de servicio). Cuando se requiere cierta confiabilidad, la solución que he visto (lo que tiene sentido conceptualmente) es usar confirmaciones (es decir, el servidor envía un paquete al cliente, y cuando el cliente recibe ese mensaje, envía una confirmación al servidor) .
¿Qué sucede cuando se descarta el reconocimiento?
En el ejemplo anterior (un servidor que envía un paquete a un cliente), el servidor maneja la pérdida potencial de paquetes reenviando paquetes en cada trama hasta que se reciban los acuses de recibo de esos paquetes. Aún podría encontrarse con problemas de ancho de banda o mensajes fuera de servicio, pero puramente desde una perspectiva de pérdida de paquetes, el servidor está cubierto.
Sin embargo, si el cliente envía un acuse de recibo que nunca llega, el servidor no tendría más remedio que dejar de enviar ese mensaje, lo que podría interrumpir el juego si se requiere la información contenida en ese paquete. Podría adoptar un enfoque similar al servidor (es decir, ¿seguir enviando acuses de recibo hasta que reciba un reconocimiento por el reconocimiento?), Pero ese enfoque lo obligaría a ir y venir para siempre (ya que necesitaría un reconocimiento por el reconocimiento por el reconocimiento) y así).
Siento que mi lógica básica es correcta aquí, lo que me deja con dos opciones.
- Envíe un solo paquete de reconocimiento y espere lo mejor.
- Envíe un puñado de paquetes de reconocimiento (quizás 3-4) y espere lo mejor, suponiendo que no todos se descartarán.
¿Hay una respuesta a este problema? ¿Estoy fundamentalmente malentendido algo? ¿Hay alguna garantía de usar UDP que desconozco? Me siento reacio a avanzar con demasiado código de red hasta que me sienta cómodo de que mi lógica es sólida.