BAŞLAMADAN ÖNCE
Bu konuyu evvel eski başka bir forumda açmıştım ancak herşeyden daha çok görmesi gereken hak ettiği ilgiyi görmedi. Şimdi buraya tekrar açıyorum çünkü daha az önce (oyunda hile engelleme) ile ilgili birilerinin birilerine bir şey sorduğunu fakat bir türlü cevap alamadığını gördüm. Cevabı söylüyorum ve söylemek ile kalmayıp sunuyorum, sunduğum şeyin ne olduğunu anlamaya çalışın. Sorduğunuz sorunun tek cevabı, tam yerleşik sunucu hareketi gerektiğidir.
Aşağıda yer alan içeriği sağdan soldan toplayıp sadece makale olsun birileri okusun yeter diye yazmadım !
Bu konuyu evvel eski başka bir forumda açmıştım ancak herşeyden daha çok görmesi gereken hak ettiği ilgiyi görmedi. Şimdi buraya tekrar açıyorum çünkü daha az önce (oyunda hile engelleme) ile ilgili birilerinin birilerine bir şey sorduğunu fakat bir türlü cevap alamadığını gördüm. Cevabı söylüyorum ve söylemek ile kalmayıp sunuyorum, sunduğum şeyin ne olduğunu anlamaya çalışın. Sorduğunuz sorunun tek cevabı, tam yerleşik sunucu hareketi gerektiğidir.
Aşağıda yer alan içeriği sağdan soldan toplayıp sadece makale olsun birileri okusun yeter diye yazmadım !
INF: Bu başlık altında yer alan bilgiler, bir oyun geliştirme sunumu değildir!
Burada yer alan projeyi kullanabilmek, ve aynı zaman da ortamınıza göre geliştirmek için MMO Client/Server İlişkisini, TCP Soket Programlamayı, Asio kütüphane kullanımını, Ağ Topolojisini, ve (Network & Character Movement Replication & Çok parçacıklı nesne ve ağ) çoğaltma işlemlerini, Server & Client RPCs ve yanı sıra framework çerçeveleri hakkın da gelişmiş ve çok ileri düzey bir bilgiye ihtiyacınız olduğunu lütfen unutmayın!
FYI: Bu bilgiyi kullanmak için, Metin2 oyununun network sistemini, çok parçacıklı işlemleri ve replication mantığını baştan aşağı değiştirmeniz gerekecektir. Ancak bu işlevi sabırla ve azimle kullanmanız durumunda sahip olacağınız şey tam olarak;
• Yetkili sunucu sistemine, tam ölçeklenebilirliğe, esnek bir yapıya, tam TCP ve UDP desteğine ve son derece düşük yük'e sahip bir ağ mimarisi inşa edeceğinizi bilmeniz gerekir.
INF: Bu bölümden sonra yer alan paylaşılmış bilgiler, çok ileri düzey bir sunucu kurulumu/programlaması temelinde gerçekleşmektedir. Aşağıda roadmap içerisindeki örnekte yerleşik sunucu yetkilendirmesi bulunmaktadır, Bu nedenle incelemeniz gerekmektedir. İncelemeniz doğrultusunda sonuç alamazsanız, paylaştığımız bu RM'yi kullanarak kendi yerleşik sunucu hareketinizi kısmen yapabilirsiniz.
Yerleşik Sunucu Yetkilendirmesi (Server Auhoritative Movement) nedir ?
Yetkili bir sunucu, istemcinin sunucuya sunucunun belirlediği koşulda talimat/bilgi RPCs gönderdiği (sevdiğiniz o oyunda olmayan) bir tür kurulumdur.
Sunucu bu istekleri kendi koşullarına uygunsa doğrular ve proxy'leri ve/veya istemciyi buna göre günceller.
Örneğin, bir istemci (oyuncu) 10000m/s hareket etmeye çalışır; (Metin2 ,Knight Hız Hilesi) gibi düşünülebilir ancak sunucu, istemci için maksimum hızın yalnızca 10m/s olduğunu bilir. (Oyunlarda hile ve third party korsanlığının nedeni, ilgili oyunun sunucusunun çoğunlukla yetkili bir sunucu olmamasından kaynaklıdır)
İstemci bu durumda korsan bir yazılım kullanıyorsa, hareket hızını 10000m/s yükseltip bir an için çok uzağa hareket ediyor gibi görünse de, ya da makul amacını karşılayacak herhangi bir özelliği sunucu yetkisi dışında değiştirmek isterse sunucu tarafından söz konusu karakter (planlanan gecikme telafisi sonunda, eğer ince düşünülmüşse) doğru konuma/pose geri getirilecektir.
SAM (Server Authoritative Movement) = Oyun istemcileri üzerinde tam hakimiyet; Bir oyuncu, sunucunun onları doğru konuma geri taşımasına izin vermemek için korsanlığa uğramış bir istemci kullansa bile(Crack, sürümü eski, desteklenmeyen vb..), sunucunun mevcut durumu & konumu bunu istemciye yansıtmaz ve korsanlığa uğramış istemci RPC's talimatlarıyla sunucuyla senkronize olamayacak ve bu şekilde kullanmak için etkisiz olacaktır. Sunucunuzun ne kadar yetkili olduğu, mimariyi nasıl kurduğunuza, ağ hareketlerini nasıl çoğalttığınız ile doğrudan bağlantılıdır. Siz böyle yapmadığınız sürece doğal olarak bir koruma da oluşmaz, herhangi bir doğa üstü mucize olmadığı sürece..
Yerleşik Sunucu Yetkilendirmesi, oynatıcının diğer oynatıcılara karşı oynadığı (Player vs Player 'PVP') rekabetçi oyunlar için çok uygundur, ve hatta bir gereksinimdir..
Pozitif Yönleri;
- İstemci tarafınca korsanlık (Hile/Third Party) çok daha zordur (çoğu senaryoda neredeyse imkansızdır)
- Yetkinin kimde olduğu ve tüm oyun istemcileri kendi içinde haberleştirmek için kullanılan dünyanın tek bir 'hükümdarı' olduğu açık ve nettir.
- Anti-Cheat yazılımları istemci tarafında koruma sağlarken, yerleşik sunucu hareketi sunucu tarafında dolaylı yoldan bir anticheat görevi görür (daha fazlası hatta) İstemci tarafında anticheat yazılımlarına müdahale edilip, bypass edilebilirken sunucu yetkilisi erişilemez bir konumda olacağından erişim/değişim neredeyse imkansızdır.
- Yetkili bir sunucu kendisine gelen isteğin gerçek istemciden olup olmadığını sorgular, çünkü zaten bildiğiniz gibi oyunda yapılan tüm işlemler (giriş, karakter seçme, silme, hareket vb) bir paket isteğidir, ve sunucu bu paketleri kabul ederse işler, eğer etmezse zaten belirlenen koşulu yerine getirir. İşte böyle bir durumda, yetkili bir sunucu kendisine gelen istemci dışındaki paketleri otomatik bir şekilde, istenen veri sağlanmazsa reddedecektir. Örnek vermek gerekirse, bir DDoS atağı ardı sıra yüzlerce paketin sunucuya iletilmesi ile gerçekleşir, sunucu bu durumda ise paket isteklerini bir süre sonra cevap döndüremediğinden kanal düşmesi ile sonuçlanır. Fakat yetkili bir sunucu gelen isteği ne kadar olursa olsun işler ve geriye cevap döndürür. Bu da teorik olarak bir DDoS atağını engellemenin pozitif yönlerinden biridir.
Negatif Yönleri
- Giriş gecikmesini önlemek için istemci tarafı tahminine ihtiyacınız olacaktır. Bunu bazı senaryolarda ve belirli oyun mekaniklerinde uygulamak gerçekten bir hayli zor olabilir.
- Sunucunun daha fazla hesaplama/analiz yapması gerekecek (RPCs almak ve istemciye onaylamak için tüm verileri işlemesi gerekecek); bu, durumda sunucu donanımını daha masraflı hale getirebilir. Böyle bir durumda ise sunucu tüm otoriteyi sağlayacağından, donanımsal bir eksik bulunmamalıdır.
✓ Yetkili Yerleşik Sunucu kullanarak, herkes için oyun deneyimini mahveden wallhack, speedhack, flyhack, noclip, güvenlik açığı vb. gibi en korkunç saldırıları ve yazılımları önleyebilirsiniz. SAM'e ek olarak etkili ve sezgisel analize sahip bir istemci taraflı bir anticheat ile, imkansız hale de getirebilirsiniz.
Her zaman olduğu gibi, hile yapmayı zorlaştırmak için sunucu yetkilisi dışında elbette istemci taraflı Anti-Cheat yazılımlarını kullanabilirsiniz, ancak ne olursa olsun istemci tarafında bulunan bir Anti-Cheat ile hile yapmak her zaman mümkün olacaktır. Şifreleme ve algoritma oldukça güvenilir olsa da. Yapabileceğiniz tek şey, ne tür hilelerin mümkün olduğunu sezgilemek, analiz etmektir ve bu durum çoğunlukla, oyunun sunucu tarafı ile ilgili her şeyi (test, analiz tonla iş ve araştırma/deney) yaparak tespit edilir, ki bu gerçekten çok yorucu bir süreçtir. Bu forum 2010 yılından bu yana bunun derdiyle zaten uzun süre yandı..
Yetkili bir oyun oluşturmak basit değildir, bu nedenle, bir mimariyi oluştururken akılda tutulması gereken bazı notlar paylaşmak istedim:
- ✓ Tam yetkili bir oyun örneğinde istemci tarafı tahmini ve gecikme telafisi en küçük ayrıntısına kadar hesaplanmalıdır;
- ✓ İstemcilerin dahili ya da dahili olmayan alternatiflerini/ayarlarını kullanarak oyundaki varlıkları somutlaştıramadığından emin olun;
- ✓ Envanter, Hasar, NPC'ler, dünyadaki oyuncular tarafından oluşturulan (eşyalar) gibi oyuncuların yanı sıra oyunla ilgili her şey sunucu tarafında olmalıdır.
- ✓ (Sunucunun yapması gereken) hiçbir şey istemciye ait olmamalı, komutlar girdi dışında hiçbir şeyi dikte (write/yazma) edememeli, oyunu etkileyen RPCs istemciden kesinlikle asla gönderilemez/gönderilmemeli.
Fully Authoritative (Tamamen Yetkili) bir sunucu hareketi kullanan oyunlara göz atalım isterseniz biraz; |
---|
- Counter Strike (Pek şaşırttı sizi sanırım değil mi? Ancak üzücü ve doğru)
- Overwatch
- World of Tanks
- League of Legends
- Dota 2
- Lost ARK
Mostly Non-Authoritative (Çoğunlukla Yetkili Olmayan) sunucu kullanan oyunlara göz atalım isterseniz biraz; |
---|
- Rust
- The Division
- The Forest
- Metin2
Linkleri görebilmek için
giriş yap veya kayıt ol.
kullanan oyunlara da (alanımız olmamasına rağmen) göz atalım birde isterseniz; |
---|
- Starcraft 2
- Heroes of the Storm
- Halo Reach
MMO Client / Server Network Beh. Lifecycle (Laniatus Game Examples)
MMO Server / Client RPC Request Resp. Workflow; (Laniatus Game Examples)
NOT: Yukarıda paylaşılan ağ topolojisi ve roadmap,
Linkleri görebilmek için
giriş yap veya kayıt ol.
geliştirmiş olduğu ağ kütüphanesine (NetworkLibrary) özel tasarlanmıştır, referans olması maksadıyla paylaşıyorum. Bu RM'de yerleşik sunucu yetkilendirme örneği bulunmaktadır, incelemeniz gerekmektedir. Eğer uygulayacağınız oyunda SAM yoksa bu paylaştığımız RM'ye göre kendi (SAM) Server Authoritative Movement sisteminizi kısmen temel olarak yazabilirsiniz.Yerleşik Sunucu Yetkilendirmesi (Server Auhoritative M.) hakkında temel kaynaklar
C'de TCP İstemci Sunucu uygulama örneği;
Yetkili Sunucu Hareketi ile ilgili bir örnek;
(Bu örnek içerisinde bir istemcinin harici olarak nasıl yetkilendirilmeye çalıştığını ve hareket hızını yükseltip, sunucu tarafından tekrar nasıl normale çevrildiğini hem sahne, hem de oyun ekranı üzerinde görebilmeniz mümkündür)
Bir başka yetkili sunucu hareketine sahip ağ mimarisi olan Mirror ile örnekler;
Elimden geldiği kadarıyla bu konuyu aydınlatmaya devam edeceğim, şimdilik bu kadar keyifli forumlar esen kalın.
İyi çalışmalar ve Keyifli forumlar.The brain is a hardware, every human being has it! Mind is software, has not every human being..