Bagaimana cara membuat permainan multipemain bekerja secara andal di belakang NAT?

20

Bahkan game yang 100% client / server terkadang memiliki masalah ketika klien berada di belakang NAT. Game pee-peer bahkan merupakan masalah yang lebih besar. Beberapa gim perlu menggunakan beberapa transport (seperti UDP dan TCP) atau banyak koneksi (seperti port UDP yang berbeda untuk suara).

Apa sajakah cara untuk memastikan gim bekerja dengan andal saat berjalan di belakang perute NAT?

  • Peer-Peer: Tidak ada server terpusat yang ada. Pemain A memulai permainan dan Pemain B ingin bergabung
  • Client-Server: Server terpusat pada alamat yang terkenal (nama host) menerima semua koneksi yang masuk. Setiap klien hanya berkomunikasi dengan server itu.
  • Combo: Di mana server hanya perjodohan, tetapi pembaruan game bersifat peer-peer. Peer yang berbeda mungkin melihat setiap pemain dengan IP / port yang berbeda berpotensi (mis. Beberapa klien berada di belakang NAT yang sama dan beberapa di router yang berbeda)
kevin42
sumber

Jawaban:

9

Teknik yang paling umum digunakan disebut sebagai NAT punch-through. Inilah intro yang layak: http://www.mindcontrol.org/~hplus/nat-punch.html

Setidaknya ada proyek OSS untuk UDP: http://udt.sourceforge.net/index.html

RakNet juga mendukung punch-through, saya percaya. Ini komersial, tetapi memiliki lisensi "Indie" gratis. Lihat di sini: http://www.jenkinssoftware.com/

Googling untuk "pukulan NAT" akan memberi Anda lebih banyak bahan bacaan

Rachel Blum
sumber
1
Saya tahu ini adalah pertanyaan dan jawaban yang sangat lama tetapi jika ada yang membaca ini, RakNet diakuisisi oleh OculusVR dan sekarang open-source dengan lisensi BSD 2-klausa. github.com/OculusVR/RakNet
Quad
9
  • Jangan minta klien memberi tahu server atau rekannya tentang alamatnya sendiri. Dengan kata lain, jangan embed IP klien A dalam paket game dan minta klien B atau server membalas alamat itu. Selalu balas alamat / port asal pesan itu.

  • Minimalkan berbagai port UDP atau TCP yang digunakan untuk gim. Ini membuat pengaturan aturan NAT lebih mudah.

  • Izinkan pengguna untuk mengganti port default yang digunakan dalam game. Dengan cara ini beberapa server dapat di-host di belakang NAT yang sama.

  • Dokumentasikan port dan aturan apa pun yang mereka ikuti dalam dokumentasi game Anda (terima kasih untuk yang Zorba). Dalam Descent 3, saya membuat aplikasi pengujian yang berdiri sendiri yang akan membantu Anda memecahkan masalah router atau konfigurasi NAT Anda dengan mengirimkan paket ke server uji.
kevin42
sumber
7
Selain dari balasan yang baik ini, sertakan catatan port game dalam dokumentasi game . Sungguh menakjubkan berapa banyak game yang tidak melakukan ini - orang-orang membasmi port secara manual dengan "netstat" dan salah melakukannya.
ZorbaTHut
Dengan UDP, Anda tidak benar-benar tahu dari mana pesan itu berasal. Apa pun bisa ditulis di alamat pengirim.
MickLH
0

Bersamaan dengan jawaban lain, gunakan roda yang ada: http://miniupnp.free.fr/ Perpustakaan ini memerangi hampir semua gangguan dalam bentuk fungsi, memberi Anda kendali atas kapan dan bagaimana meninju dan menarik :)

underscorediscovery
sumber