No, UDP sigue siendo superior en términos de latencia de rendimiento y siempre será más rápido, debido a la filosofía de los 2 protocolos: suponiendo que sus datos de comunicación se diseñaron teniendo en cuenta UDP o cualquier otra comunicación con pérdida.
TCP crea una abstracción en la que llegan todos los paquetes de red, y llegan en el orden exacto en que fueron enviados. Para implementar tal abstracción en un canal con pérdida, debe implementar retransmisiones y tiempos de espera, que consumen tiempo. Si envía 2 actualizaciones en TCP y se pierde un paquete de la primera actualización, no verá la segunda actualización hasta que:
- Se detecta la pérdida de la primera actualización.
- Se solicita una retransmisión de la primera actualización.
- La retransmisión ha llegado y ha sido procesada.
No importa qué tan rápido se haga esto en TCP, porque con UDP simplemente descartas la primera actualización y usas la segunda, más nueva, en este momento. A diferencia de TCP, UDP no garantiza que lleguen todos los paquetes y tampoco garantiza que lleguen en orden.
Esto requiere que envíe el tipo correcto de datos y diseñe su comunicación de tal manera que sea aceptable perder datos.
Si tiene datos a donde debe llegar cada paquete, y su paquete debe procesarlos en el orden en que fueron enviados, entonces UDP no será más rápido. De hecho, usar UDP en este caso probablemente sea más lento porque está reconstruyendo TCP e implementándolo por medio de UDP, en cuyo caso también podría usar TCP.
EDITAR: agregar información adicional para incorporar / abordar algunos de los comentarios:
Normalmente, la tasa de pérdida de paquetes en Ethernet es muy baja, pero se vuelve mucho más alta una vez que WiFi está involucrado o si el usuario tiene una carga / descarga en progreso. Supongamos que tenemos una pérdida de paquetes perfectamente uniforme de 0.01% (unidireccional, no ida y vuelta). En un juego de disparos en primera persona, los clientes deben enviar actualizaciones cada vez que sucede algo, como cuando el cursor del mouse gira el reproductor, lo que ocurre aproximadamente 20 veces por segundo. También podrían enviar actualizaciones por cuadro o en un intervalo fijo, que serían 60-120 actualizaciones por segundo. Como estas actualizaciones se envían en diferentes momentos, se enviarán / deberían enviarse en un paquete por actualización. En un juego de 16 jugadores, los 16 jugadores envían estos 20-120 paquetes por segundo al servidor, lo que da como resultado un total de 320-1920 paquetes por segundo. Con nuestra tasa de pérdida de paquetes de 0.01%, esperamos perder un paquete cada 5.2-31.25 segundos.
En cada paquete que recibamos después del paquete perdido, enviaremos un DupAck, y después del tercer DupAck, el remitente retransmitirá el paquete perdido . Por lo tanto, el tiempo que TCP requiere para iniciar la retransmisión es de 3 paquetes, más el tiempo que tarda el último DupAck en llegar al remitente. Luego, debemos esperar a que llegue la retransmisión, por lo que en total esperamos 3 paquetes + 1 latencia de ida y vuelta. La latencia de ida y vuelta suele ser de 0-1 ms en una red local y de 50-200 ms en Internet. 3 paquetes llegarán típicamente en 25 ms si enviamos 120 paquetes por segundo, y en 150 ms si enviamos 20 paquetes por segundo.
En contraste, con UDP nos recuperamos de un paquete perdido tan pronto como recibimos el siguiente paquete, por lo que perdemos 8,3 ms si enviamos 120 paquetes por segundo y 50 ms si enviamos 20 paquetes por segundo.
Con TCP, las cosas se vuelven más complicadas si también tenemos que considerar Nagle (si el desarrollador olvida desactivar la fusión de envíos o no puede deshabilitar el ACK retrasado ), evitar la congestión de la red o si la pérdida de paquetes es lo suficientemente mala como para tener que dar cuenta de múltiples pérdidas de paquetes (incluidas las pérdidas Ack y DupAck). Con UDP podemos escribir fácilmente un código más rápido porque simplemente no nos importa ser un buen ciudadano de la red como lo hace TCP.