Saya sedang menulis game iOS jaringan. Ketika mengirim paket dengan GKMatchSendDataReliable
(yang saya asumsikan adalah UDP dengan kode penerimaan paket mereka sendiri ditulis) pada 60 paket per detik (jadi 16 ms antara paket yang berdekatan), waktu ping rata-rata dengan cepat menjadi lebih buruk: Saya membuka 7 pertandingan GameCenter di bawah ini (satu demi satu ) dan hanya mengirim "banjir" 100 paket (dengan kecepatan 60 paket per detik). Saya mengukur waktu pulang pergi rata-rata, dan ini adalah hasilnya:
[ 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
Setelah 2 tes terakhir hasilnya sekitar 1000 ms.
Tampaknya saya diperlambat, kemungkinan besar oleh ISP saya. Karena ini adalah permainan iOS, orang akan menggunakan koneksi perumahan biasa.
Ketika saya mengubah kecepatan pengiriman paket menjadi 10 kali lebih lambat (jadi 1 paket setiap 160 ms), pengujiannya memakan waktu lebih lama, tetapi waktu bolak-balik tetap rendah secara konsisten.
[21:31:27]: Saya melihat waktu pulang pergi rata-rata 55.289109 ms, ia melihat 69.032727 ms
Jadi sepertinya menjaga latensi rendah pada koneksi (dan tidak akan "dihukum" oleh ISP) saya harus mengurangi tingkat paket yang saya kirim. Perlu diingat bahwa ini adalah paket yang sangat kecil, seperti maksimum 40 byte, namun saya masih dibatasi.
Saya mencari pedoman tentang berapa banyak paket UDP yang dapat saya kirim per detik untuk menghindari terkekeh! Apakah ada pedoman umum di mana saja?
sumber
Jawaban:
Bahkan game aksi berbasis rumahan atau MMO besar tidak menjalankan paket mereka pada 60Hz. Ditambah memiliki ukuran paket yang sangat kecil belum tentu merupakan hal yang hebat, masing-masing paket kecil tersebut memiliki overhead yang besar hanya dengan mengirimkannya.
Cobalah memotret untuk pembaruan 10Hz dengan interpolasi sisi klien. Saya berasumsi bahwa Anda sudah melakukan interpolasi karena akan selalu ada penundaan ping.
Baca tentang ukuran MTU dan berikan lebih banyak info di sana untuk menutupi jangka waktu yang lebih lama. Ukuran paket rata-rata pada lapisan transpor adalah 1400 atau lebih, apa pun di atas ukuran MTU akan membagi pesan Anda dan menyebabkan lebih banyak overhead.
sumber
Pertama, Anda harus memastikan seberapa besar seluruh data. ISP Anda kemungkinan besar akan peduli dengan byte aktual yang dikirim, bukan jumlah atau frekuensi datagram. Jika Anda mengirim datagram berukuran maksimum (65507 payload) 60 kali per detik, Anda mengirim sekitar 30 Mb / s ke hulu. Tidak semua orang memiliki koneksi semacam itu.
Ingat bahwa tajuk IP memiliki panjang 20 oktet, dan tajuk UDP memiliki panjang 8 oktet. Itu adalah 28 oktet tambahan yang Anda kirim untuk setiap datagram.
Jika Anda tidak memaksimalkan koneksi Anda, ada banyak tempat di mana paket Anda mungkin tertunda: yaitu OS klien, gateway Anda (mungkin router nirkabel atau modem kabel), ISP Anda, ISP rekan lain, ISP lain gateway, OS rekan lainnya antara lain.
Jika Anda belum menggunakannya, saya sarankan Anda menggunakan Wireshark , yang merupakan alat yang sangat kuat untuk mendiagnosis masalah jaringan. Anggap itu setara dengan debugger, tetapi untuk jaringan.
Ada beberapa cara Anda dapat mendiagnosis lalu lintas jaringan dengan Wireshark:
Gunakan Wireshark di PC di jaringan yang sama dengan perangkat seluler, dengan hub yang bebas pilih-pilih dan atur perangkat jaringan Anda sebagai promiscuous
Atur PC sebagai gateway nirkabel dan sambungkan perangkat seluler Anda ke gateway itu, lalu dengarkan dengan Wireshark pada PC tersebut
Jalankan Wireshark di mesin yang sama dengan emulator
Jalankan tcpdump di perangkat itu sendiri (mudah di Android, membutuhkan jailbreak di iOS), dan kemudian baca data yang diambil di Wireshark
Buat program sederhana yang melakukan hal yang persis sama, tetapi itu bekerja pada PC, dan gunakan Wireshark di sana.
... dan banyak lagi
Anda ingin memeriksa paket mana yang dikirim, dan kapan. Misalnya, jika penundaan terjadi sebelum dikirim, Anda dihambat oleh OS; sementara jika Anda mendapatkan penundaan bahkan pada versi desktop dari program yang sama, ini berarti Anda sedang diperketat oleh jaringan di suatu tempat.
Biasanya, jika Anda mendapatkan pembatasan oleh jaringan, Anda harus mendapatkan datagram tipe 4 ICMP, sehingga Anda dapat menggunakannya untuk memeriksa di mana tepatnya Anda mendapatkan pembatasan.
Sebagai kesimpulan, ada banyak alasan mengapa paket Anda mungkin tertunda, dan akan lebih bijaksana untuk mencari tahu di mana masalahnya sebelum Anda mulai mencoba menyelesaikan masalah.
sumber
Tampaknya salah satu asumsi saya salah. Menurut ini :
Mengubah mode kirim ke UDP nyata (yaitu
GKMatchSendDataUnreliable
) tampaknya mempertahankan tingkat ping rendah pada 60 paket per detik. Sepertinya aku sudah dikejutkan oleh Nagles lagi .Saya masih mendapatkan perilaku aneh (periode dengan waktu ping yang sangat tinggi), tapi saya tidak yakin penyebab dasarnya (ISP atau kemacetan jaringan).
Kemudian:
Jadi ini sporadis dan berjalan bergelombang. Saya kira saya harus mencoba beberapa saran di posting lain seperti mengurangi tingkat pengiriman paket saya.
sumber