Come evitare di essere strozzato?


9

Sto scrivendo un gioco iOS in rete. Quando si inviano pacchetti con GKMatchSendDataReliable(che supponevo fosse UDP con il proprio codice di ricezione dei pacchetti scritto) a 60 pacchetti al secondo (quindi 16 ms tra pacchetti adiacenti), i tempi medi di ping peggiorano rapidamente: ho aperto 7 partite di GameCenter in basso (una dopo l'altra ) e ha semplicemente inviato un "diluvio" di 100 pacchetti (al ritmo di 60 pacchetti al secondo). Ho misurato il tempo di andata e ritorno medio e questi sono i risultati:

[ 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

Dopo gli ultimi 2 test i risultati sono circa 1000 ms.

Sembrerebbe che io sia strozzato, molto probabilmente dal mio ISP. Poiché si tratta di un gioco iOS, le persone useranno regolari connessioni residenziali.

Quando ho cambiato la velocità di invio dei pacchetti per essere 10 volte più lenta (quindi 1 pacchetto ogni 160 ms), i test impiegano molto più tempo, ma i tempi di andata e ritorno rimangono costantemente bassi.

[21:31:27]: ho visto un tempo di andata e ritorno medio di 55.289109 ms, ha visto 69.032727 ms

Quindi sembra mantenere una bassa latenza sulla connessione (e non essere "punito" dagli ISP). Devo ridurre la velocità dei pacchetti che invio. Tieni presente che si tratta di pacchetti molto piccoli, come massimo 40 byte, eppure sono ancora limitato.

Sto cercando linee guida su quanti pacchetti UDP posso inviare al secondo per evitare di essere strozzato! Ci sono linee guida generali da qualche parte?


Hai provato? Cosa succede se si scende a 10 pacchetti / sec? Ti viene gravemente strozzato allora? Questo potrebbe aiutare a rispondere all'ultima parte della tua domanda.
notlesh

"Puoi dire molto di un ragazzo da come ti strangola ..." Oh, intendevi quella definizione di "acceleratore": P
Casey,

Assicurati di non solo saturare la tua connessione con qualsiasi sistema affidabile che hai costruito su UDP. Quando UDP inizia a perdere terreno, i sistemi di recupero ad hoc tendono ad essere un po 'difficili da ottenere. Non attribuire mai alla cattiveria ciò che può essere spiegato da ...
Lars Viklund

Sembra che potrei aver fatto un errore. Potrebbe essere stato NAGLES ancora una volta.
bobobobo,

Risposte:


9

Nemmeno i giochi d'azione basati su PC domestici o i grandi MMO eseguono i loro pacchetti a 60Hz. Inoltre, avere dimensioni di pacchetti davvero ridotte non è necessariamente una buona cosa, ognuna di quelle bustine ha un grande sovraccarico nel spedirlo.

Prova a scattare per aggiornamenti a 10Hz con qualche interpolazione sul lato client. Presumo che tu stia già interpolando perché ci saranno sempre ritardi di ping.

Leggi le dimensioni dell'MTU e aggiungi più informazioni per coprire l'intervallo di tempo più lungo. Una dimensione media dei pacchetti a livello di trasporto sarà di circa 1400, qualsiasi cosa oltre la dimensione MTU dividerà il tuo messaggio e causerà un sovraccarico ancora maggiore.


7

Innanzitutto, devi assicurarti di quanto siano grandi tutti i dati. Molto probabilmente il tuo ISP si preoccuperà dei byte effettivamente inviati, non della quantità o della frequenza dei datagrammi. Se invii datagrammi di dimensioni massime (65507 payload octect) 60 volte al secondo, stai inviando a monte circa 30 Mb / s. Non tutti hanno quel tipo di connessione.

Ricorda che l'intestazione IP è lunga 20 ottetti e l'intestazione UDP è lunga 8 ottetti. Sono altri 28 ottetti che stai inviando per ciascun datagramma.

Se non stai massimizzando la tua connessione, ci sono molti posti in cui i tuoi pacchetti potrebbero essere ritardati: vale a dire il sistema operativo del client, il tuo gateway (probabilmente un router wireless o un modem via cavo), il tuo ISP, l'ISP dell'altro peer, l'altro peer gateway, il sistema operativo dell'altro peer, tra gli altri.

Se non l'hai ancora usato, ti consiglio di usare Wireshark , uno strumento estremamente potente per diagnosticare problemi di rete. Pensalo come l'equivalente di un debugger, ma per il networking.

Esistono diversi modi per diagnosticare il traffico di rete con Wireshark:

  • Usa Wireshark in un PC nella stessa rete del dispositivo mobile, con un hub promiscuo e impostando il tuo dispositivo di rete come promiscuo

  • Imposta un PC come gateway wireless e collega il tuo dispositivo mobile a quel gateway, quindi ascolta con Wireshark su detto PC

  • Esegui Wireshark nella stessa macchina di un emulatore

  • Esegui tcpdump nel dispositivo stesso (facile su Android, richiede il jailbreak su iOS), quindi leggi i dati acquisiti su Wireshark

  • Crea un semplice programma che fa esattamente la stessa cosa, ma che funzioni su un PC e usa Wireshark.

  • ... e molti altri

Vuoi verificare quali pacchetti vengono inviati e quando. Ad esempio, se il ritardo si verifica prima che vengano inviati, il sistema operativo viene limitato; mentre se stai ricevendo il ritardo anche su una versione desktop dello stesso programma, questo significa che sei bloccato dalla rete da qualche parte.

Di solito, se vieni limitato dalla rete, dovresti ottenere i datagrammi di tipo 4 ICMP, quindi puoi usarli per controllare esattamente dove stai per essere limitato.

In conclusione, ci sono molte ragioni per cui i tuoi pacchetti potrebbero essere ritardati, e sarebbe saggio scoprire dove si trova il problema prima di iniziare a tentare di risolverlo.


0

Sembra che uno dei miei presupposti fosse sbagliato. Secondo questo :

Modalità GKMatchSendDataUnreliable, l'immagine da trasmettere nel cosiddetto UDP. GKMatchSendData Immagine in modalità affidabile inviata da TCP. Dovrebbe essere un GKMatchSendDataUnreliable di solito.

La modifica della modalità di invio in UDP reale (ad es. GKMatchSendDataUnreliable) Sembra mantenere basse frequenze di ping a 60 pacchetti al secondo. Sembra che sono stato colpito ancora una volta da Nagles .

Ricevo ancora comportamenti strani (periodi con tempi di ping molto alti), ma non sono sicuro della causa principale (ISP o congestione della rete).

[ 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

Dopo:

[ 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     

Quindi è sporadico e va a ondate. Immagino che dovrò provare alcuni dei suggerimenti negli altri post come ridurre la mia velocità di invio dei pacchetti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.