¿Cómo evitar ser estrangulado?

9

Estoy escribiendo un juego de iOS en red. Al enviar paquetes con GKMatchSendDataReliable(que supuse que era UDP con su propio código de recepción de paquetes escrito) a 60 paquetes por segundo (es decir, 16 ms entre paquetes adyacentes), los tiempos de ping promedio empeoran rápidamente: abrí 7 coincidencias de GameCenter a continuación (una tras otra ) y simplemente envió una "inundación" de 100 paquetes (a una velocidad de 60 paquetes por segundo). Medí el tiempo promedio de ida y vuelta, y estos son los resultados:

[ 21:16:39 ]:  I saw an average roundtrip time of 52.342787 ms, he saw 54.496590 ms
[ 21:16:34 ]:  I saw an average roundtrip time of 62.631942 ms, he saw 61.991655 ms
[ 21:16:45 ]:  I saw an average roundtrip time of 88.394380 ms, he saw 83.619123 ms
[ 21:16:51 ]:  I saw an average roundtrip time of 179.053118 ms, he saw 156.869141 ms
[ 21:16:57 ]:  I saw an average roundtrip time of 75.025076 ms, he saw 75.419723 ms
[ 21:17:23 ]:  I saw an average roundtrip time of 8832.082488 ms, he saw 7616.877558 ms
[ 21:19:33 ]:  I saw an average roundtrip time of 25088.962344 ms, he saw 16833.064914 ms

Después de las últimas 2 pruebas, los resultados son alrededor de 1000 ms.

Parece que estoy siendo estrangulado, probablemente por mi ISP. Debido a que este es un juego de iOS, la gente usará conexiones residenciales regulares.

Cuando cambié la velocidad de envío de paquetes a 10 veces más lenta (1 paquete cada 160 ms), las pruebas tomaron mucho más tiempo, pero los tiempos de ida y vuelta siguen siendo consistentemente bajos.

[21:31:27]: vi un tiempo promedio de ida y vuelta de 55.289109 ms, vio 69.032727 ms

Por lo tanto, parece mantener una baja latencia en la conexión (y no ser "castigado" por los ISP). Tengo que reducir la velocidad de los paquetes que envío. Tenga en cuenta que estos son paquetes muy pequeños, como un máximo de 40 bytes, pero todavía estoy siendo estrangulado.

¡Estoy buscando pautas sobre cuántos paquetes UDP puedo enviar por segundo para evitar ser acelerado! ¿Hay alguna guía general en alguna parte?

bobobobo
fuente
¿Has probado? ¿Qué sucede si baja a 10 paquetes / seg? ¿Entonces te estrangulan severamente? Esto podría ayudar a responder la última parte de su pregunta.
notlesh
"Puedes decir mucho sobre un chico por cómo te estrangula ..." Oh, te referías a ESA definición de 'acelerador': P
Casey
Asegúrese de no solo saturar su conexión con cualquier sistema confiable que haya construido sobre UDP. Cuando UDP comienza a desaparecer, los sistemas de recuperación ad-hoc tienden a ser un poco difíciles de corregir. Nunca atribuya a la malicia lo que puede explicarse por ...
Lars Viklund
Parece que he cometido un error. Puede haber sido NAGLES una vez más.
bobobobo

Respuestas:

9

Ni siquiera los juegos de acción basados ​​en PC o grandes MMO ejecutan sus paquetes a 60Hz. Además, tener paquetes de tamaño realmente pequeño no es necesariamente una gran cosa, cada uno de esos pequeños paquetes tiene una gran sobrecarga al enviarlo.

Intente disparar para actualizaciones de 10Hz con alguna interpolación del lado del cliente. Supongo que ya estás interpolando porque siempre habrá retrasos en el ping.

Lea sobre los tamaños de MTU y agregue más información para cubrir el período de tiempo más largo. Un tamaño de paquete promedio en la capa de transporte será de aproximadamente 1400, cualquier cosa por encima del tamaño de MTU dividirá su mensaje y causará aún más sobrecarga.

Patrick Hughes
fuente
7

Primero, debe asegurarse de cuán grande es la información completa. Su ISP probablemente se preocupará por los bytes reales enviados, no por la cantidad o frecuencia de datagramas. Si envía datagramas de tamaño máximo (65507 octetos de carga útil) 60 veces por segundo, está enviando alrededor de 30 Mb / s en sentido ascendente. No todos tienen ese tipo de conexión.

Recuerde que el encabezado IP tiene 20 octetos de largo y el encabezado UDP tiene 8 octetos de largo. Eso es 28 octetos adicionales que está enviando para cada datagrama.

Si no está maximizando su conexión, hay muchos lugares donde sus paquetes pueden retrasarse: a saber, el sistema operativo del cliente, su puerta de enlace (probablemente un enrutador inalámbrico o módem de cable), su ISP, el ISP del otro par, el otro par gateway, el sistema operativo del otro par entre otros.

En caso de que aún no lo haya usado, le recomiendo que use Wireshark , que es una herramienta extremadamente poderosa para diagnosticar problemas de red. Piense en ello como el equivalente de un depurador, pero para redes.

Hay varias formas de diagnosticar el tráfico de red con Wireshark:

  • Use Wireshark en una PC en la misma red que el dispositivo móvil, con un hub promiscuo y configurando su dispositivo de red como promiscuo

  • Configure una PC como puerta de enlace inalámbrica y conecte su dispositivo móvil a esa puerta de enlace, luego escuche con Wireshark en dicha PC

  • Ejecute Wireshark en la misma máquina que un emulador

  • Ejecute tcpdump en el propio dispositivo (fácil en Android, requiere jailbreak en iOS), y luego lea los datos capturados en Wireshark

  • Haga un programa simple que haga exactamente lo mismo, pero que funcione en una PC, y use Wireshark allí.

  • ... y muchos otros

Desea verificar qué paquetes se envían y cuándo. Por ejemplo, si el retraso se produce antes de que se envíen, el sistema operativo lo estrangula; mientras que si está recibiendo el retraso incluso en una versión de escritorio del mismo programa, esto significa que la red lo está estrangulando en alguna parte.

Por lo general, si la red lo estrangula, debe obtener datagramas ICMP tipo 4, de modo que pueda usarlos para verificar exactamente dónde se estrangula.

En conclusión, hay muchas razones por las cuales sus paquetes pueden retrasarse, y sería conveniente averiguar dónde está el problema antes de comenzar a intentar resolverlo.

Pijama Panda
fuente
0

Parece que uno de mis supuestos estaba equivocado. De acuerdo a esto :

GKMatchSendDataUnreliable mode, la imagen que se transmitirá en el llamado UDP. Imagen de modo GKMatchSendDataReliable enviada por TCP. Debe ser un GKMatchSendDataUnreliable por lo general.

Cambiar el modo de envío a UDP real (es decir GKMatchSendDataUnreliable) parece mantener bajas tasas de ping a 60 paquetes por segundo. Parece que Nagles me ha golpeado una vez más .

Todavía tengo un comportamiento extraño (períodos con tiempos de ping muy altos), pero no estoy seguro de la causa raíz (ISP o congestión de la red).

[ 10:30:33 ]:  I saw an average roundtrip time of 39.908923 ms, he saw 48.437794 ms
[ 10:30:39 ]:  I saw an average roundtrip time of 26.278577 ms, he saw 27.023854 ms
[ 10:30:48 ]:  I saw an average roundtrip time of 23.254163 ms, he saw 24.495182 ms
[ 10:30:54 ]:  I saw an average roundtrip time of 37.333127 ms, he saw 34.780404 ms
[ 10:31:03 ]:  I saw an average roundtrip time of 29.198575 ms, he saw 29.071106 ms
[ 10:31:11 ]:  I saw an average roundtrip time of 49.030299 ms, he saw 48.675459 ms
[ 10:31:18 ]:  I saw an average roundtrip time of 34.031792 ms, he saw 34.698117 ms
[ 10:31:24 ]:  I saw an average roundtrip time of 30.058642 ms, he saw 32.814952 ms
[ 10:31:30 ]:  I saw an average roundtrip time of 53.110438 ms, he saw 54.271453 ms
[ 10:31:45 ]:  I saw an average roundtrip time of 119.693933 ms, he saw 107.616359 ms
[ 10:31:50 ]:  I saw an average roundtrip time of 222.644443 ms, he saw 229.589861 ms
[ 10:31:57 ]:  I saw an average roundtrip time of 166.827070 ms, he saw 167.647724 ms
[ 10:32:05 ]:  I saw an average roundtrip time of 765.356593 ms, he saw 859.600923 ms
[ 10:32:13 ]:  I saw an average roundtrip time of 357.522686 ms, he saw 339.648654 ms
[ 10:32:24 ]:  I saw an average roundtrip time of 1115.639593 ms, he saw 1060.574401 ms
[ 10:32:39 ]:  I saw an average roundtrip time of 175.845995 ms, he saw 171.112166 ms
[ 10:32:44 ]:  I saw an average roundtrip time of 47.262925 ms, he saw 41.987869 ms
[ 10:32:52 ]:  I saw an average roundtrip time of 74.524443 ms, he saw 78.868198 ms
[ 10:33:47 ]:  I saw an average roundtrip time of 20.943917 ms, he saw 21.217377 ms
[ 10:33:52 ]:  I saw an average roundtrip time of 28.944821 ms, he saw 29.303144 ms
[ 10:34:06 ]:  I saw an average roundtrip time of 25.581624 ms, he saw 25.439416 ms
[ 10:34:13 ]:  I saw an average roundtrip time of 25.565568 ms, he saw 25.655267 ms
[ 10:34:18 ]:  I saw an average roundtrip time of 38.609394 ms, he saw 37.462835 ms

Más tarde:

[ 10:38:11 ]:  I saw an average roundtrip time of 40.037623 ms, he saw 43.367524 ms
[ 10:38:21 ]:  I saw an average roundtrip time of 121.222703 ms, he saw 118.855264 ms
[ 10:38:28 ]:  I saw an average roundtrip time of 726.391897 ms, he saw 685.742454 ms
[ 10:38:33 ]:  I saw an average roundtrip time of 60.251207 ms, he saw 57.974503 ms
[ 10:38:42 ]:  I saw an average roundtrip time of 1133.909392 ms, he saw 1124.404501 ms     

Entonces es esporádico y va en oleadas. Supongo que tendré que probar algunas de las sugerencias en las otras publicaciones, como reducir la tasa de envío de paquetes.

bobobobo
fuente