Ngeunaan modél jaringan dina kaulinan pikeun beginners

Ngeunaan modél jaringan dina kaulinan pikeun beginners
Pikeun dua minggu panungtungan kuring geus dipake dina mesin online pikeun kaulinan kuring. Sateuacan ieu, kuring terang nanaon pisan ngeunaan jejaring dina kaulinan, janten kuring maca seueur tulisan sareng ngalakukeun seueur percobaan pikeun ngartos sadayana konsép sareng tiasa nyerat mesin jaringan kuring sorangan.

Dina pituduh ieu, abdi hoyong bagikeun sareng anjeun rupa-rupa konsép anu anjeun kedah diajar sateuacan nyerat mesin kaulinan anjeun nyalira, ogé sumber daya sareng tulisan anu pangsaéna pikeun diajar.

Sacara umum, aya dua jenis utama arsitektur jaringan: peer-to-peer jeung klien-server. Dina arsitéktur peer-to-peer (p2p), data ditransferkeun antara pasangan pamaén anu disambungkeun, sedengkeun dina arsitektur klien-server, data ditransfer ngan antara pamaén sareng server.

Sanajan arsitéktur peer-to-peer masih dipaké dina sababaraha kaulinan, klien-server standar: leuwih gampang pikeun nerapkeun, merlukeun lebar channel leutik, sarta ngajadikeun eta gampang ngajaga ngalawan selingkuh. Ku alatan éta, dina tutorial ieu kami baris difokuskeun arsitektur klien-server.

Khususna, kami paling resep kana server otoriter: dina sistem sapertos kitu, server sok leres. Salaku conto, upami pamaén nyangka anjeunna aya dina koordinat (10, 5), sareng server nyarios yén anjeunna aya di (5, 3), teras klien kedah ngagentos posisina sareng anu dilaporkeun ku server, sareng henteu sabalikna. sabalikna. Ngagunakeun server otoritatif ngajadikeun eta gampang pikeun ngaidentipikasi cheaters.

Sistem kaulinan jaringan gaduh tilu komponén utama:

  • Protokol angkutan: kumaha data ditransfer antara klien sareng server.
  • Protokol aplikasi: naon anu dikirimkeun ti klien ka server sareng ti server ka klien sareng dina format naon.
  • Logika aplikasi: kumaha data anu ditransfer dianggo pikeun ngapdet kaayaan klien sareng server.

Penting pisan pikeun ngartos peran unggal bagian sareng tantangan anu aya hubunganana sareng aranjeunna.

Protokol angkutan

Léngkah munggaran nyaéta milih protokol pikeun ngangkut data antara server sareng klien. Aya dua protokol Internét pikeun ieu: TCP и UDP. Tapi anjeun bisa nyieun protokol angkutan sorangan dumasar kana salah sahijina atawa ngagunakeun perpustakaan anu ngagunakeun aranjeunna.

Babandingan TCP jeung UDP

Duanana TCP sareng UDP dumasar kana IP. IP ngamungkinkeun hiji pakét bisa dikirimkeun ti sumber ka panarima, tapi teu ngajamin yén pakét dikirim sooner atanapi engké bakal ngahontal panarima, yén éta bakal ngahontal eta sahenteuna sakali, sarta yén runtuyan pakét bakal anjog dina bener. pesenan. Leuwih ti éta, pakét ngan bisa ngandung jumlah kawates data, dibikeun ku nilai JALMA.

UDP ngan ukur lapisan ipis dina luhureun IP. Ku alatan éta, éta boga watesan sarua. Sabalikna, TCP ngagaduhan seueur fitur. Éta nyayogikeun sambungan anu dipercaya sareng teratur antara dua titik kalayan mariksa kasalahan. Lantaran kitu, TCP pohara merenah tur dipaké dina loba protokol séjén, misalna. HTTP, ftp и SMTP. Tapi sadaya fitur ieu hargana: reureuh.

Pikeun ngartos naha fungsi ieu tiasa nyababkeun latency, urang kedah ngartos kumaha TCP jalanna. Nalika titik pangirim ngirimkeun pakét ka titik panarima, éta ngarepkeun nampi pangakuan (ACK). Lamun sanggeus waktu nu tangtu eta teu narima eta (sabab pakét atawa pangakuan ieu leungit, atawa pikeun sababaraha alesan sejenna), mangka dikirim deui pakét. Sumawona, TCP ngajamin yén pakét ditampi dina urutan anu leres, janten dugi ka pakét anu leungit ditampi, sadaya pakét sanés henteu tiasa diolah, sanaos aranjeunna parantos ditampi ku host anu nampi.

Tapi sakumaha anu anjeun tiasa bayangkeun, latency dina kaulinan multiplier penting pisan, khususna dina genre anu dibungkus aksi sapertos FPS. Ieu naha loba kaulinan make UDP kalawan protokol sorangan.

Protokol basis UDP asli tiasa langkung éfisién tibatan TCP kusabab sababaraha alesan. Contona, éta bisa nandaan sababaraha pakét salaku dipercaya jeung lianna salaku untrusted. Ku alatan éta, teu paduli naha pakét untrusted ngahontal panarima. Atanapi tiasa ngolah sababaraha aliran data supados pakét anu leungit dina hiji aliran henteu ngalambatkeun aliran anu sésana. Contona, meureun aya thread pikeun input pamuter jeung thread sejen pikeun pesen obrolan. Lamun pesen obrolan nu teu urgent leungit, eta moal ngalambatkeun input nu urgent. Atawa protokol proprietary bisa nerapkeun reliabiliti béda ti TCP jadi leuwih efisien dina lingkungan video game.

Janten, upami TCP nyedot pisan, maka urang bakal nyiptakeun protokol angkutan sorangan dumasar kana UDP?

Ieu rada leuwih pajeulit. Sanaos TCP ampir suboptimal pikeun sistem jaringan kaulinan, éta tiasa dianggo saé pikeun kaulinan khusus anjeun sareng ngahémat waktos anu berharga. Contona, latency bisa jadi teu jadi masalah pikeun kaulinan dumasar péngkolan atawa kaulinan anu ngan bisa dicoo dina jaringan LAN, dimana latency sarta leungitna pakét leuwih handap ti Internet.

Seueur kaulinan anu suksés, kalebet World of Warcraft, Minecraft sareng Terraria, nganggo TCP. Nanging, kalolobaan FPS nganggo protokol dumasar UDP sorangan, ku kituna urang bakal nyarios langkung seueur ngeunaan aranjeunna di handap.

Upami anjeun mutuskeun nganggo TCP, pastikeun éta ditumpurkeun Algoritma Nagle, sabab buffers pakét saméméh ngirim, nu hartina eta ngaronjatkeun latency.

Pikeun leuwih jéntré ngeunaan bédana antara UDP jeung TCP dina konteks kaulinan multiplayer, Anjeun bisa maca artikel Glenn Fiedler. UDP vs. TCP.

Protokol sorangan

Janten anjeun badé nyiptakeun protokol angkutan anjeun nyalira, tapi henteu terang dimana ngamimitian? Anjeun untung sabab Glenn Fiedler parantos nyerat dua tulisan anu luar biasa ngeunaan ieu. Anjeun bakal manggihan loba pikiran pinter dina aranjeunna.

Artikel kahiji Jaringan pikeun Game Programmer 2008, langkung gampang tibatan anu kadua, Ngawangun Protokol Jaringan Kaulinan 2016. Kuring nyarankeun yén anjeun mimitian ku hiji heubeul.

Catet yén Glenn Fiedler mangrupakeun proponent badag ngagunakeun protokol custom dumasar kana UDP. Sarta sanggeus maca artikel na, Anjeun meureun bakal ngadopsi pamadegan yén TCP boga shortcomings serius dina video kaulinan, tur Anjeun bakal hoyong nerapkeun protokol sorangan.

Tapi upami anjeun anyar dina jaringan, laksanakeun diri anjeun sareng nganggo TCP atanapi perpustakaan. Pikeun suksés ngalaksanakeun protokol angkutan anjeun nyalira, anjeun kedah diajar seueur sateuacanna.

Perpustakaan jaringan

Upami anjeun peryogi anu langkung épisién tibatan TCP, tapi henteu hoyong repot ngalaksanakeun protokol anjeun nyalira sareng seueur detil, anjeun tiasa nganggo perpustakaan jaringan. Aya seueur di antarana:

Kuring henteu acan nyobian sadayana, tapi kuring resep ENet sabab gampang dianggo sareng dipercaya. Salaku tambahan, éta gaduh dokuméntasi anu jelas sareng tutorial pikeun pamula.

Protokol angkutan: kacindekan

Pikeun nyimpulkeun: aya dua protokol angkutan utama: TCP sareng UDP. TCP ngagaduhan seueur fitur anu mangpaat: réliabilitas, pelestarian pesenan pakét, deteksi kasalahan. UDP teu gaduh sadayana ieu, tapi TCP ku alam na geus ngaronjat latency, nu teu bisa ditarima keur sababaraha kaulinan. Hartina, pikeun mastikeun latency low, Anjeun bisa nyieun protokol sorangan dumasar kana UDP atawa ngagunakeun perpustakaan nu implements protokol angkutan on UDP sarta diadaptasi pikeun multiplayer video kaulinan.

Pilihan antara TCP, UDP sareng perpustakaan gumantung kana sababaraha faktor. Kahiji, tina kabutuhan kaulinan: naha éta peryogi latency rendah? Kadua, tina syarat protokol aplikasi: naha éta peryogi protokol anu dipercaya? Salaku bakal urang tingali dina bagian salajengna, kasebut nyaéta dimungkinkeun pikeun nyieun hiji protokol aplikasi nu hiji protokol untrusted cukup merenah. Tungtungna, anjeun ogé kedah tumut kana akun pangalaman pamekar mesin jaringan.

Abdi gaduh dua saran:

  • Abstrak protokol angkutan tina sesa aplikasi saloba mungkin ku kituna bisa gampang diganti tanpa nulis balik sakabéh kode.
  • Ulah ngaoptimalkeun teuing. Mun anjeun lain ahli jaringan sarta teu yakin kana naha anjeun perlu protokol angkutan basis UDP custom, Anjeun bisa mimitian ku TCP atawa perpustakaan nu nyadiakeun reliabiliti, lajeng nguji sarta ngukur kinerja. Upami aya masalah sareng anjeun yakin yén panyababna nyaéta protokol angkutan, maka waktosna pikeun nyiptakeun protokol angkutan anjeun nyalira.

Dina ahir bagian ieu, kuring nyarankeun yén anjeun maca Bubuka keur Multiplayer Game Programming ku Brian Hook, nu nyertakeun loba jejer dibahas didieu.

Protokol aplikasi

Ayeuna urang tiasa tukeur data antara klien sareng server, urang kedah mutuskeun data naon anu bakal ditransfer sareng dina format naon.

Skéma Palasik nya éta klien ngirim input atawa lampah ka server, sarta server ngirimkeun kaayaan kaulinan ayeuna ka klien.

server ngirimkeun teu kaayaan pinuh, tapi kaayaan disaring kalawan éntitas anu lokasina deukeut pamaén. Anjeunna ngalakukeun ieu pikeun tilu alesan. Kahiji, kaayaan lengkep bisa jadi badag teuing pikeun dikirimkeun dina frékuénsi luhur. Bréh, klien utamana museurkeun data visual jeung audio, sabab lolobana logika game ieu simulated dina server kaulinan. Thirdly, dina sababaraha kaulinan pamaén teu kudu nyaho data nu tangtu, contona, posisi musuh dina sisi séjén peta, disebutkeun anjeunna tiasa sniff pakét jeung nyaho persis dimana pindah ka maéhan anjeunna.

Serialisasi

Hambalan munggaran nyaéta pikeun ngarobah data anu urang hoyong kirimkeun (input atanapi kaayaan kaulinan) kana format anu cocog pikeun pangiriman. prosés ieu disebut serialisasi.

Pamikiran anu langsung aya dina pikiran nyaéta ngagunakeun format anu tiasa dibaca manusa, sapertos JSON atanapi XML. Tapi ieu bakal sagemblengna teu epektip tur bakal runtah lolobana saluran.

Disarankeun nganggo format binér, anu langkung kompak. Hartina, pakét ngan ukur ngandung sababaraha bait. Aya masalah mertimbangkeun di dieu urutan bait, nu bisa jadi béda dina komputer béda.

Pikeun serialize data, Anjeun bisa make perpustakaan, contona:

Ngan pastikeun perpustakaan nyiptakeun arsip portabel sareng paduli ngeunaan endianness.

Solusi alternatif nyaéta nerapkeun éta sorangan; éta henteu sesah, khususna upami anjeun nganggo pendekatan data-centric kana kode anjeun. Sajaba ti éta, éta bakal ngidinan Anjeun pikeun ngalakukeun optimizations nu teu salawasna mungkin mun ngagunakeun perpustakaan.

Glenn Fiedler nyerat dua tulisan ngeunaan serialisasi: Maca jeung Nulis Pakét и Stratégi Serialisasi.

Komprési

Jumlah data anu ditransfer antara klien sareng server diwatesan ku rubakpita saluran. Komprési data bakal ngidinan Anjeun pikeun nransper leuwih data dina unggal snapshot, ningkatkeun frékuénsi update, atawa ngan saukur ngurangan sarat saluran.

Bungkusan bit

Téhnik munggaran nyaéta packing bit. Ieu diwangun ku ngagunakeun persis jumlah bit anu diperlukeun pikeun ngajelaskeun nilai nu dipikahoyong. Contona, upami Anjeun gaduh hiji enum nu bisa mibanda 16 nilai béda, lajeng tinimbang sakabeh bait (8 bit), Anjeun bisa make ngan 4 bit.

Glenn Fiedler ngécéskeun kumaha carana nerapkeun ieu dina bagian kadua artikel Maca jeung Nulis Pakét.

Bit packing jalan utamana ogé kalawan sampling, nu bakal topik tina bagian salajengna.

Sampling

Sampling nyaéta téknik komprési lossy anu ngan ukur nganggo sawaréh tina nilai anu mungkin pikeun ngodekeun nilai. Cara panggampangna pikeun nerapkeun discretization nyaéta ku rounding angka floating point.

Glenn Fiedler (deui!) nembongkeun kumaha carana nempatkeun sampling kana prakték dina artikel na Komprési Snapshot.

Algoritma komprési

Téhnik salajengna bakal algoritma komprési lossless.

Di dieu, dina pamanggih kuring, aya tilu algoritma anu paling pikaresepeun anu anjeun kedah terang:

  • Huffman coding kalayan kode anu tos diitung, anu gancang pisan sareng tiasa ngahasilkeun hasil anu saé. Ieu dipaké pikeun niiskeun pakét dina mesin jejaring Quake3.
  • zlib nyaéta algoritma komprési tujuan umum anu henteu pernah ningkatkeun jumlah data. Kumaha anjeun tiasa ningali di dieu, geus dipaké dina rupa-rupa aplikasi. Bisa jadi kaleuleuwihan pikeun ngamutahirkeun nagara bagian. Tapi tiasa mangpaat upami anjeun kedah ngirim aset, téks panjang atanapi rupa bumi ka klien tina server.
  • Niron panjang amprok - Ieu meureun algoritma komprési pangbasajanna, tapi pohara efektif pikeun jenis nu tangtu data, sarta bisa dipaké salaku hambalan pre-processing saméméh zlib. Ieu utamana cocog pikeun compressing rupa bumi diwangun ku ubin atawa voxels nu loba elemen padeukeut diulang.

Délta komprési

Téhnik komprési anu terakhir nyaéta komprési délta. Ieu diwangun dina kanyataan yén ngan béda antara kaayaan kaulinan ayeuna jeung kaayaan panungtungan ditampi ku klien nu dikirimkeun.

Ieu mimiti dipaké dina mesin jaringan Quake3. Ieu dua artikel anu ngajelaskeun kumaha cara ngagunakeunana:

Glenn Fiedler ogé dipaké dina bagian kadua artikel na Komprési Snapshot.

Énkripsi

Salaku tambahan, anjeun panginten kedah énkripsi transfer inpormasi antara klien sareng server. Aya sababaraha alesan pikeun ieu:

  • privasi / karusiahan: pesen ngan bisa dibaca ku panarima, tur euweuh jalma séjén sniffing jaringan bakal bisa maca aranjeunna.
  • auténtikasi: jalma anu hayang maénkeun peran pamaén kudu nyaho konci na.
  • Pencegahan curang: Ieu bakal leuwih hese pikeun pamaén jahat nyieun bungkusan curang sorangan, maranéhna kudu baranahan skéma enkripsi sarta manggihan konci (anu robah unggal sambungan).

Abdi nyarankeun pisan ngagunakeun perpustakaan pikeun ieu. Kuring nyarankeun ngagunakeun lisodium, sabab utamana basajan tur mibanda tutorials alus teuing. Utamana metot nyaéta tutorial on bursa konci, nu ngidinan Anjeun pikeun ngahasilkeun konci anyar kalawan unggal sambungan anyar.

Protokol Aplikasi: Kacindekan

Ieu nyimpulkeun protokol aplikasi urang. Kuring yakin yén komprési sagemblengna pilihan jeung kaputusan ngagunakeun éta ngan gumantung kana kaulinan jeung rubakpita diperlukeun. Énkripsi, dina pamanggih kuring, wajib, tapi dina prototipe munggaran anjeun tiasa ngalakukeun tanpa eta.

Logika aplikasi

Kami ayeuna tiasa ngapdet kaayaan dina klien, tapi tiasa janten masalah latency. pamuter nu, sanggeus completing input, perlu ngadagoan kaayaan kaulinan pikeun ngamutahirkeun ti server pikeun nempo naon dampak nya di dunya.

Leuwih ti éta, antara dua apdet kaayaan, dunya sagemblengna statik. Lamun laju update kaayaan low, lajeng gerakan bakal pisan jerky.

Aya sababaraha téhnik pikeun ngurangan dampak masalah ieu, sarta kuring bakal nutupan aranjeunna dina bagian salajengna.

Téhnik Smoothing Latency

Sadaya téknik anu dijelaskeun dina bagian ieu dibahas sacara rinci dina séri Gancang-Paced Multiplayer Jibril Gambetta. Abdi nyarankeun pisan maca séri tulisan anu saé ieu. Éta ogé kalebet demo interaktif anu ngamungkinkeun anjeun ningali kumaha téknik ieu dianggo dina prakték.

Téhnik munggaran nyaéta nerapkeun hasil input langsung tanpa ngantosan tanggapan ti server. Disebutna ramalan sisi klien. Nanging, nalika klien nampi apdet ti server, éta kedah pariksa yén prediksina leres. Upami ieu sanés masalahna, maka anjeunna ngan ukur kedah ngarobih kaayaanna dumasar kana anu ditampi ti server, sabab serverna otoriter. Téhnik ieu mimiti dianggo dina Gempa. Anjeun tiasa maca langkung seueur ngeunaan éta dina tulisan Gempa Engine review kode Fabien Sanglars [tarjamahan dina Habré].

Téhnik set kadua dianggo pikeun ngalancarkeun gerakan éntitas sanés antara dua pembaruan kaayaan. Aya dua cara pikeun ngajawab masalah ieu: interpolasi jeung extrapolation. Dina kasus interpolasi, dua nagara bagian anu terakhir dicandak sareng transisi tina hiji ka anu sanés ditampilkeun. disadvantage nya éta ngabalukarkeun jumlah leutik reureuh sabab klien salawasna ningali naon anu lumangsung dina mangsa katukang. Ekstrapolasi nyaéta ngeunaan ngaramal dimana éntitas ayeuna kedah dumasar kana kaayaan terakhir anu ditampi ku klien. Karugianna nyaéta upami éntitas lengkep ngarobih arah gerakan, maka bakal aya kasalahan anu ageung antara ramalan sareng posisi anu saleresna.

Panganyarna, téhnik paling canggih ngan mangpaat dina FPS nyaeta santunan lag. Nalika nganggo kompensasi lag, server nganggap telat klien nalika némbak dina udagan. Contona, upami pamaén ngalakukeun headshot dina layar maranéhanana, tapi kanyataanana target maranéhanana éta dina lokasi béda alatan reureuh, mangka bakal adil mun mungkir pamuter katuhu pikeun maéhan alatan reureuh. Ku alatan éta, server rewinds waktu deui ka momen pamaén dipecat pikeun simulate naon pamaén nempo dina layar maranéhanana sarta pariksa keur tabrakan antara shot maranéhanana jeung udagan.

Glenn Fiedler (sapertos biasa!) nyerat artikel dina 2004 Fisika Jaringan (2004), dimana anjeunna nempatkeun dasar pikeun nyinkronkeun simulasi fisika antara server sareng klien. Dina 2014 manéhna nulis runtuyan anyar artikel Fisika jaringan, nu ngajelaskeun téknik séjén pikeun nyingkronkeun simulasi fisika.

Aya ogé dua artikel dina wiki Valve, Jaringan Multiplayer Sumber и Métode Kompensasi Latency dina Desain Protokol sareng Optimasi Klién / Server In-game nu nganggap santunan pikeun reureuh.

Nyegah selingkuh

Aya dua téknik utama pikeun nyegah selingkuh.

Kahiji: nyieun leuwih hésé pikeun cheaters ngirim pakét jahat. Sakumaha didadarkeun di luhur, cara anu saé pikeun nerapkeun ieu nyaéta énkripsi.

Kadua: server otoriter ngan kedah nampi paréntah / input / tindakan. Klién teu kedah tiasa ngarobih kaayaan dina server sanés ku ngirim input. Teras, unggal waktos server nampi input, éta kedah pariksa naha éta sah sateuacan dianggo.

Logika aplikasi: kacindekan

Kuring nyarankeun yén anjeun nerapkeun cara pikeun simulate latency tinggi na ongkos Anyarkeun low ku kituna anjeun bisa nguji paripolah kaulinan anjeun dina kaayaan goréng, sanajan klien tur server ngajalankeun dina komputer anu sarua. Ieu bakal greatly simplify palaksanaan téknik smoothing reureuh.

Sumberdaya Mantuan séjén

Upami anjeun hoyong ngajalajah sumber daya sanés dina modél jaringan, anjeun tiasa mendakanana di dieu:

sumber: www.habr.com

Tambahkeun komentar