Como evitar ser estrangulado?

9

Estou escrevendo um jogo para iOS em rede. Ao enviar pacotes com GKMatchSendDataReliable(que eu assumi ser UDP com seu próprio código de recepção de pacotes gravados) a 60 pacotes por segundo (16 ms entre pacotes adjacentes), os tempos médios de ping pioram rapidamente: abri 7 correspondências do GameCenter abaixo (uma após a outra ) e simplesmente enviou uma "inundação" de 100 pacotes (a uma taxa de 60 pacotes por segundo). Eu medi o tempo médio de ida e volta, e estes são os 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

Após os últimos 2 testes, os resultados estão em torno de 1000 ms.

Parece que estou sendo estrangulado, provavelmente pelo meu ISP. Por ser um jogo para iOS, as pessoas usarão conexões residenciais regulares.

Quando alterei a taxa de envio de pacotes para 10 vezes mais lenta (portanto, 1 pacote a cada 160 ms), os testes demoram muito mais, mas os tempos de ida e volta permanecem consistentemente baixos.

[21:31:27]: vi um tempo médio de ida e volta de 55.289109 ms, ele viu 69.032727 ms

Portanto, parece manter baixa latência na conexão (e não ser "punido" pelos ISPs). Tenho que reduzir a taxa de pacotes que envio. Lembre-se de que são pacotes muito pequenos, com no máximo 40 bytes, mas ainda estou sendo acelerado.

Estou procurando orientações sobre quantos pacotes UDP posso enviar por segundo para evitar ser acelerado! Existem diretrizes gerais em algum lugar?

bobobobo
fonte
Você já testou? O que acontece se você cair para 10 pacotes / s? Você fica severamente estrangulado? Isso pode ajudar a responder a última parte da sua pergunta.
Notlesh #
"Você pode dizer muito sobre um cara pela forma como ele o estrangula ..." Ah, você quis dizer ESTA definição de 'acelerador': P
Casey
Certifique-se de que você não está apenas saturando sua conexão com o sistema confiável que você construiu sobre o UDP. Quando o UDP começa a cair, os sistemas de recuperação ad-hoc tendem a ser um pouco difíceis de acertar. Nunca atribua à malícia o que pode ser explicado por ...
Lars Viklund
Parece que eu cometi um erro. Pode ter sido NAGLES mais uma vez.
31413 Bobobobo

Respostas:

9

Nem mesmo jogos de ação baseados em PC em casa ou grandes MMOs executam seus pacotes a 60Hz. Além disso, ter tamanhos de pacotes realmente pequenos não é necessariamente uma grande coisa, cada um desses pequenos pacotes tem uma grande sobrecarga em apenas enviá-los.

Tente fotografar para atualizações de 10 Hz com alguma interpolação do lado do cliente. Presumo que você já esteja interpolando porque sempre haverá atrasos no ping.

Leia os tamanhos de MTU e lance mais informações para cobrir o período mais longo. Um tamanho médio de pacote na camada de transporte será aproximadamente 1400, qualquer coisa acima do tamanho da MTU dividirá sua mensagem e causará ainda mais sobrecarga.

Patrick Hughes
fonte
7

Primeiro, você precisa ter certeza de quão grande são os dados inteiros. Seu ISP provavelmente se preocupará com os bytes reais enviados, não com a quantidade ou a frequência dos datagramas. Se você estiver enviando datagramas com tamanho máximo (65507 cargas úteis) 60 vezes por segundo, estará enviando cerca de 30 Mb / s a ​​montante. Nem todo mundo tem esse tipo de conexão.

Lembre-se de que o cabeçalho IP tem 20 octetos e o cabeçalho UDP tem 8 octetos. São 28 octetos adicionais que você está enviando para cada datagrama.

Se você não está maximizando sua conexão, há muitos locais onde seus pacotes podem estar atrasados: ou seja, o SO do cliente, seu gateway (provavelmente um roteador sem fio ou modem a cabo), seu ISP, o ISP do outro ponto, o outro ponto do outro gateway, o SO do outro ponto, entre outros.

Caso você ainda não o tenha usado, recomendo usar o Wireshark , que é uma ferramenta extremamente poderosa para diagnosticar problemas de rede. Pense nisso como o equivalente a um depurador, mas para redes.

Existem várias maneiras de diagnosticar o tráfego de rede com o Wireshark:

  • Use o Wireshark em um PC na mesma rede que o dispositivo móvel, com um hub promíscuo e configurando seu dispositivo de rede como promíscuo

  • Defina um PC como um gateway sem fio e conecte seu dispositivo móvel a esse gateway e, em seguida, ouça com o Wireshark no referido PC

  • Execute o Wireshark na mesma máquina que um emulador

  • Execute o tcpdump no próprio dispositivo (fácil no Android, requer jailbreak no iOS) e leia os dados capturados no Wireshark

  • Crie um programa simples que faça exatamente a mesma coisa, mas que funcione em um PC, e use o Wireshark lá.

  • ... e muitos outros

Você deseja verificar quais pacotes estão sendo enviados e quando. Por exemplo, se o atraso ocorrer antes de serem enviados, você estará sendo controlado pelo sistema operacional; enquanto que se você estiver recebendo o atraso, mesmo em uma versão desktop do mesmo programa, isso significa que você está sendo prejudicado pela rede em algum lugar.

Geralmente, se você estiver sendo otimizado pela rede, deverá obter datagramas do tipo 4 do ICMP, para poder usá-los para verificar exatamente onde está sendo otimizado.

Em conclusão, há muitas razões pelas quais seus pacotes podem estar atrasando, e seria sensato descobrir onde está o problema antes de começar a tentar resolvê-lo.

Panda Pajama
fonte
0

Parece que uma das minhas suposições estava errada. De acordo com isso :

GKMatchSendDataNão confiável, a imagem a ser transmitida no chamado UDP. Imagem do modo GKMatchSendDataReliable enviada pelo TCP. Normalmente, deve ser um GKMatchSendDataUnreliable.

Alterar o modo de envio para UDP real (ou seja GKMatchSendDataUnreliable) parece manter baixas taxas de ping a 60 pacotes por segundo. Parece que fui atingido por Nagles mais uma vez .

Ainda sinto um comportamento estranho (períodos com tempos de ping muito altos), mas não tenho certeza da causa raiz (ISP ou congestionamento da rede).

[ 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

Mais 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     

Então é esporádico e vai em ondas. Acho que vou ter que tentar algumas das sugestões nos outros posts, como reduzir minha taxa de envio de pacotes.

bobobobo
fonte