P2P VE CLIENT UNKNOWN HEADER SYSERRI ARKAPLANI

  • Konuyu açan Konuyu açan victory
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 4
  • Gösterim Gösterim 138

victory

Üye
Üye
Mesaj
5
Beğeni
1
Puan
405
Ticaret Puanı
0
Merhaba;

Bir süredir oyuncularımı rahatsız eden client kapanma sorunları hakkında çalışmalar yapıyorum.
Bu sorunların kökeni; herhangi bir client crashı değil, clientin server tarafından yollanan paketleri düzgün bir şekilde yakalayamamasında yatıyor.

Paket yapısında oynama yapılmamış server fileslerde ve daha fazlasında, bu başarısızlık sonrasında client çözümü, kendini
PostQuitMessage(0) kullanarak kapamakta buluyor:

1723129434023.webp


Çözüm her ne kadar ilk bakışta gereksiz görünse de, clientteki paket buffer yapısının bu noktadan sonra bozulduğu ve kendisini hali hazırda düzeltemeyecek yapıda olduğu için, bu çözümü şuanlık en iyi çözüm olarak yorumladım.

Bu çözüme benzer olarak, P2P yoluyla iletişim kuran gameler arasında da herhangi bir tanımlanamayan header bulunduğunda, yani game syserr lerimize UNKNOWN HEADER düştüğünde, gameler çözümü birbiri arasındaki soketlerini kapatmakta buluyor.
Fakat buradaki fark; P2P konusunda yaşanan header tanımsızlığı, en basitinde packet_info.cpp'de tanımlanmayan headerlar ya da büyük paketli buffered paketler sayesınde oluşuyor olmasıdır.

Zaman zaman yaşadığımız P2P kopmaları da tam olarak gamelerimize düşen UNKOWN HEADER syserrlerinden sonra yaşanıyor. Neyseki P2P kopmalarının analizi konusunda çözüm genelde basit. En son yollanan yüksek boyutlu paketleri loglamak ve boyutu indirgemek bu iş için yeterli bir çözüm.

Clientim için yaptığım çalışmalarda, kapanma sorunu yaşayan oyuncular için, serverden teslim aldıkları son paketleri loglayacak bir sistem yazdım.
Bu konuyu açmamdaki amaç, konuyla ilgilenenlerle analizlerimi paylaşıp çözüm için sizlerle bilgi paylaşımı yapmaktır.

Oluşturduğum log sistemindeki amaç, kapanmadan hemen önce servere bilgi gönderilip, oyuncunun soketine son yollanan 10 paketin server tarafında loglanmasındır:

1723129414421.webp

Server tarafında saklanan bazı logları paylaşıyorum:

1723129384196.webp

Sorunu yaşayan son oyuncuların aldığı headerler gösteriyorki, spesifk olarak son yollanan header bu soruna sebep olmuyor. Başka bir deyişle spesifik bir header bu soruna sebep olmuyor, ya da oluyor mu?

Bu gözlemlerden sonra, hatayı clientlere yollanan büyük boyutlu paketlerde aradım. Bu paketlerin en büyüğü 15814 byte ile offline shop sistemimdeki bir yapıydı.
Ve bu boyutun gerçekten sorun yaratacağını düşünmeyerek farklı bir yorum aramaya başladım. Bir şey veya bir şeyler, clientteki paket sequence yapısını sekteye uğratıyor olmalı diye düşündüm. Yani aslında sorun dolaylı olarak gerçekleşiyor gibi görünüyor.

Ekstra olarak, code base'mde herhangi spesifik bir paket yapısının yanlış tanımlandığını düşünmüyorum. Bu düşüncemin sebebi de bu sorunu yaşayan kitlenin tüm oyuncularım değil yaklaşık %15'lik bir dilimin olması. Client rapor loglarında ismi geçen birkaç oyuncuma ulaştım ve bu sorunu oyunda herhangi bir aksiyom yaşamadan yani ilk girişte login ekranında bile yaşadıklarını söylediler.

Bu biraz kafa karıştıcı. Hala sorunun kaynağını aramaktayım. Herhangi bir tecrübesi olan, bir şeyler paylaşmak isteyenleri konuya katkı yapmaya davet ediyorum.
 
Güzel bir konu. Tartışma ve bilgi alışverişi için çok iyi.
Benim bu konudaki düşüncelerim şu şekilde olacaktır:
Hiçbir aksiyon yaşanmadan loginde crash yemek bana pek olası gelmiyor açıkçası. Ben metin2 tr nin ilk yıllarında bile oynamış biri olarak hiç böyle bir sorun yaşadığımı hatırlamıyorum. Bu konuyla ilgili olarak en net hatırladığım crash sorunu şuydu:

O yıllarda malum, güçlü bilgisayarlar yoktu ve metin2 yapısı gereği CPU ve RAM düşmanı bir oyun. O yıllardaki bilgisayarlarla metin2 birçok bilgisayarda bir noktadan sonra rami tamamen doldurup ya çöküyor ve kapanıyordu, ya da .exe donup kilitleniyordu ve görev yöneticisinden kapatmama zorluyordu. Bunun dışında ne oyunculuk yıllarımda, ne de geliştiricilik yıllarımda bu şekilde bir çökme sorunu yaşamadım.

Ancak bu konuyu en geniş yelpazeden ele alırsak birçok ihtimal çıkıyor:

1-) Client-DB İlişkisi
Çoğu zaman
game->client arasındaki sorunlar clientin çökmesine pek sebep olmaz. Core verir, syserr verir, logine atar vb. ancak tamamen çökme gibi bir sonuç yaratması çok nadirdir(çok kronik bir sorun olmadığı sürece).
Ancak db de öyle değildir. db->client arası ilişki biraz daha farklıdır ve bu ikili arasındaki bir kopukluk/sorun, .exe nin tamamen kapanmasına sebep olabiliyor. Bunu bizzat yaşadığım için net bir şekilde söyleyebilirim.

2-) Sequence
Bu zaten sağlıklı çalışan bir sistem sayılmaz. Ancak yine de tamamen çöküşe neden olmaz ve genellikle syserr verir ve en fazla logine atar. Fakat bununla doğrudan olmasa da, dolaylı yoldan bir bağlantısı olabilir. Eğer sequence varsa, bunu tamamen kaldırmayı deneyebilirsin. Forumda bunun için bir rehber paylaşmıştım.

3-) Visual Studio yapılandırma ayarları.
Bu konu da bir ihtimal olabilir. Visual Studio üzerinde yapılan her yapılandırma ayarı, her işletim sisteminde sorunsuz çalışacak diye bir kaide yok. Özellikle iyileştirme ve cpu alanında yapılan ayarlar gözden geçirilebilir ve bu da olası bir ihtimaldir.

4-) Kullanıcı Bilgisayarı
Metin2 çok eski bir yapıya sahip, özellikle de grafik alanında varsayılan olarak kullandığı directx8 artık fosil oldu. Directx9 da aynı şekilde. Ve günümüzdeki modern ekran kartları bu kadar eski sürümdeki grafik kütüphanelerini her ne kadar destekleyip çalıştırsa da, tamamen besleyici ve destekleyici bir şekilde çalıştırdıklarını söylemek zor. Çünkü birçoğu yenilikçi teknolojiyi ön planda tutuyor ve eski sürümlere sunulan destekleri ve iyileştirmeleri artık hiçbir firma pek önemsemiyor. Ve burada asıl fark edilmesi gereken nokta, metin2'nin bir grafik motoruna sahip olmaması. Bu, Metin2'nin ekran kartlarına karşı olan tanınabilirliğini bir hayli düşürüyor.

Daha iyi açıklamak için küçük bir kıyaslama yapayım: Görselde directx9 kütüphanesini kullanan Crysis oyununu görüyoruz.
111-jpg.14128

Ve bilindiği üzere bu oyun her ne kadar metin2 ile aynı grafik kütüphanesini kullansa da, (zamanına göre)modern bir grafik motoruna sahipti ve birçok besleyici özellik barındırmaktaydı. Metin2'de maalesef böyle bir durum söz konusu değil. Sadece grafik kütüphanesi ve ne kadar iyi olduğu tartışılan bazı c++ kodlarından ibaret. Bu da bu maddede bahsettiğim ihtimali akla getirebiliyor. Ve bu madde, dolaylı yoldan bir önceki madde ile bağlantılı olabilir.
Metin2'nin belkide bu konuda denk düştüğü en popüler oyun CS 1.5 veya CS 1.6 olur sanırım. Onlar da aynı kaderi paylaşan oyunlardan...

Yani demek istediğim; yıllar önce birçoğumuzun kullandığı eski ATI ekran kartları bile dx8-dx9 konusunda günümüzdeki birçok modern ekran kartlarından daha fazla destekleyici bir yapıya sahipti. (Performanstan bahsetmiyorum, mimari yönden bahsediyorum.)
Sonuç olarak; kullanıcı bilgisayarına bağlı olarak bu da bir ihtimal olabilir ve bu çerçevede birden fazla tester ile detaylı test gerçekleştirilebilir.
 
Güzel bir konu. Tartışma ve bilgi alışverişi için çok iyi.
Benim bu konudaki düşüncelerim şu şekilde olacaktır:
Hiçbir aksiyon yaşanmadan loginde crash yemek bana pek olası gelmiyor açıkçası. Ben metin2 tr nin ilk yıllarında bile oynamış biri olarak hiç böyle bir sorun yaşadığımı hatırlamıyorum. Bu konuyla ilgili olarak en net hatırladığım crash sorunu şuydu:

O yıllarda malum, güçlü bilgisayarlar yoktu ve metin2 yapısı gereği CPU ve RAM düşmanı bir oyun. O yıllardaki bilgisayarlarla metin2 birçok bilgisayarda bir noktadan sonra rami tamamen doldurup ya çöküyor ve kapanıyordu, ya da .exe donup kilitleniyordu ve görev yöneticisinden kapatmama zorluyordu. Bunun dışında ne oyunculuk yıllarımda, ne de geliştiricilik yıllarımda bu şekilde bir çökme sorunu yaşamadım.

Ancak bu konuyu en geniş yelpazeden ele alırsak birçok ihtimal çıkıyor:

1-) Client-DB İlişkisi
Çoğu zaman
game->client arasındaki sorunlar clientin çökmesine pek sebep olmaz. Core verir, syserr verir, logine atar vb. ancak tamamen çökme gibi bir sonuç yaratması çok nadirdir(çok kronik bir sorun olmadığı sürece).
Ancak db de öyle değildir. db->client arası ilişki biraz daha farklıdır ve bu ikili arasındaki bir kopukluk/sorun, .exe nin tamamen kapanmasına sebep olabiliyor. Bunu bizzat yaşadığım için net bir şekilde söyleyebilirim.

2-) Sequence
Bu zaten sağlıklı çalışan bir sistem sayılmaz. Ancak yine de tamamen çöküşe neden olmaz ve genellikle syserr verir ve en fazla logine atar. Fakat bununla doğrudan olmasa da, dolaylı yoldan bir bağlantısı olabilir. Eğer sequence varsa, bunu tamamen kaldırmayı deneyebilirsin. Forumda bunun için bir rehber paylaşmıştım.

3-) Visual Studio yapılandırma ayarları.
Bu konu da bir ihtimal olabilir. Visual Studio üzerinde yapılan her yapılandırma ayarı, her işletim sisteminde sorunsuz çalışacak diye bir kaide yok. Özellikle iyileştirme ve cpu alanında yapılan ayarlar gözden geçirilebilir ve bu da olası bir ihtimaldir.

4-) Kullanıcı Bilgisayarı
Metin2 çok eski bir yapıya sahip, özellikle de grafik alanında varsayılan olarak kullandığı directx8 artık fosil oldu. Directx9 da aynı şekilde. Ve günümüzdeki modern ekran kartları bu kadar eski sürümdeki grafik kütüphanelerini her ne kadar destekleyip çalıştırsa da, tamamen besleyici ve destekleyici bir şekilde çalıştırdıklarını söylemek zor. Çünkü birçoğu yenilikçi teknolojiyi ön planda tutuyor ve eski sürümlere sunulan destekleri ve iyileştirmeleri artık hiçbir firma pek önemsemiyor. Ve burada asıl fark edilmesi gereken nokta, metin2'nin bir grafik motoruna sahip olmaması. Bu, Metin2'nin ekran kartlarına karşı olan tanınabilirliğini bir hayli düşürüyor.

Daha iyi açıklamak için küçük bir kıyaslama yapayım: Görselde directx9 kütüphanesini kullanan Crysis oyununu görüyoruz.
111-jpg.14128

Ve bilindiği üzere bu oyun her ne kadar metin2 ile aynı grafik kütüphanesini kullansa da, (zamanına göre)modern bir grafik motoruna sahipti ve birçok besleyici özellik barındırmaktaydı. Metin2'de maalesef böyle bir durum söz konusu değil. Sadece grafik kütüphanesi ve ne kadar iyi olduğu tartışılan bazı c++ kodlarından ibaret. Bu da bu maddede bahsettiğim ihtimali akla getirebiliyor. Ve bu madde, dolaylı yoldan bir önceki madde ile bağlantılı olabilir.
Metin2'nin belkide bu konuda denk düştüğü en popüler oyun CS 1.5 veya CS 1.6 olur sanırım. Onlar da aynı kaderi paylaşan oyunlardan...

Yani demek istediğim; yıllar önce birçoğumuzun kullandığı eski ATI ekran kartları bile dx8-dx9 konusunda günümüzdeki birçok modern ekran kartlarından daha fazla destekleyici bir yapıya sahipti. (Performanstan bahsetmiyorum, mimari yönden bahsediyorum.)
Sonuç olarak; kullanıcı bilgisayarına bağlı olarak bu da bir ihtimal olabilir ve bu çerçevede birden fazla tester ile detaylı test gerçekleştirilebilir.

Öncelikle açıklayıcı eklemeleriniz için teşekkür ederim.

DB->Client arası iletişimden bahsettiniz, bu noktayı tam anlayamadım. Bildiğim kadarıyla db'den oyuncu clientlerine açık bir soket iletişimi bulunmuyor ve game bu iş için aracılık yapıyor. Bahsettiğiniz kopukluluklar hangi durumlarda meydana gelir ve anlamı nedir?

Kodların kalitesi ve çağımıza uygunluğu tabiki de tartışılabilir bir konu. Sadece metin2 için değil, bir çok bilgisayar programı hedeflediği işletim sisteminde bile çok doğal çökmeler yaşayabilir. Bu çökmelerin biz geliştiricilere kullanılan derleyiciler, derleyici ayarları ve kullanılan kütüphaneler konusunda bize hassasiyet katması gerektiğini düşünüyorum.

Fakat konuda asıl dikkat çekmek istediğim program çökmeleri değil, metin2'nin paket mimarisinde kullanmış olduğu 'kendini yok etme' stratejisi.
Soruna tamamen çözüm sağlayabileceğimiz konusunda da emin değilim fakat zannımca bu sorun bariz bir sebepten kaynaklanıyor. Bu düşüncemin arkasında her seferinde hiç ayırt etmeden 'UNKNOWN HEADER' syserr'ini alıyor olmamız yatıyor.

Çözümün kolaylığı konusunda da yanlış düşünüyor olabilirim fakat bazı server fileslere göz gezdirdiğimde bu yapıdan az/çok sıyrıldığını görüyorum. Belki de sorun tespiti yapmak yerine bu doğrultuda biraz düzenleme yapmamız gerekiyor olabilir.
 
Geçtiğimiz günlerde db src içinde ufak bir hata sebebiyle mysql dan bir adet veri çekilemediği ve pythona iletilmediği için loadingten sonra crash sorunu yaşamıştım. Hatta bunu teyit etmek için sorunu düzelttikten sonra tekrar eski haline getirdim ve aynı şey olmuştu. O yüzden bunu da eklemek istedim.

Paket konusuna gelince; bu konuda birçok kişinin farkında olduğu ve yaşadığı birçok sorun var. Siz tam olarak hangi senaryodan bahsediyorsunuz? Yanlışlık olmaması adına sormak istedim. Biraz daha detay verebilir misiniz? Konuyu yanlış bir şekilde yorumlamak istemem.
 
Merhaba, öncelikle bu baş belası sorunla uğraşırken sabır diliyorum, bu oyunun kaynağında açık ara en nefret ettiğim yer Ymir'in el yapımı network paket sistemi. Oyunun geliştirildiği yılları baz alınca henüz ortada tcp paket alışverişi, socket yapısı ve buffer ayarlamalarıyla alakalı yardımcı kütüphaneler yoktu, veya yoktu demeyelim de çok az sayıda vardı, bu yüzden bunu kendileri yapmış, takdir etmekle birlikte çok kötü bir sistem olduğunu, paket alışverişinde bir sorun yaşanma ihtimalinin de pamuk ipliğine bağlı olduğunu unutmamak gerekiyor. Her şey sorunsuz, client ve server arasında alışverişi bozabilecek bir kod hatası yok diyelim, sadece oyun serverinin internet bağlantısındaki bir sıkıntı, oyuncuların bilgisayarlarındaki herhangi bir anlık problem bile bu hatayı tetikleyebilir çünkü paketlerin sağlıklı şekilde iletimi ve dahası bu iletimi denetlemek için yeterli kontrol mekanizması mevcut değil, bu durumu kökten çözmek için yapılabilecek en mantıklı hareket Aeldra'nın da yaptığı gibi tüm paket sistemini Google'ın protobuf kütüphanesini kullanarak yenilemek, iletim kalitesinde, sorunların ele alınmasında ve hata analizinde inanılmaz kolaylık sağlayacağına eminim fakat çok büyük bir işlem ve çok fazla değişiklik gerekiyor, Aeldra'nın warez olan dosyalarında yapıyı inceleyebilirsiniz.

Anlattığınız problem için pansuman olacak çözüm zaten yıllar önce Ymir tarafından yapılmış, çünkü kolaya kaçarak yapılabilecek en iyi yöntem buydu, neydi bu yöntem; paketleri hem iletim olarak hem boyut olarak kısıtlamak, böylece ele almak gereken paket sayısı daha az olacak ve karışıklık veya başarısız iletim yaşama şansını azaltacaklardı ayrıca oyuncu kaynaklı veya sunucu kaynaklı internet problemleri ve hız sorunları baş gösterdiğinde sorun yaşama şansları minimuma inecekti. Bahsettiğim şey client kaynak kodlarındaki şu bölüm, burada kendi kullandığım versiyonunu ve düştüğüm yorumu da paylaşmış olayım;

C++:
Genişlet Daralt Kopyala
    // INFO: Explanation is needed for MAX_RECV_COUNT and SAFE_RECV_BUFSIZE..
    //       Ymir set it to 4 and set bufsize 8KB but it was 2004 when they were doing it,
    //       We need keep this low still but 4 is too low for nowadays. (Because internet speeds are much higher now)
    //       But it doesn't make sense to make it something like 32 or 64, we have some players still play this game in old computers and bad internet speeds.
    //       And also thats still too much for live server in some cases (Ex: 5.000 online players and 1Gbit internet speed, it's still too much)
    //       This feature should definitely NOT be removed!
    //       If the restriction is removed on a server with very high player counts, players may be kicked out of the game due to packet problems %100.
    //       In my opinion, 8 Recv and 8KB Buf would be the ideal setting for this one. - [MT2Dev Note] - 21/02/2024
    const DWORD MAX_RECV_COUNT        = 8;
    const DWORD SAFE_RECV_BUFSIZE    = 8192;
    DWORD dwRecvCount                = 0;

Tahminime göre siz bu değerleri (en azından recv countu) arttırdınız, eğer arttırmadıysanız söylediklerimi önemsemeyebilirsiniz ama eğer arttırdıysanız tavsiyem ayarlarınızı maksimum bu şekilde ayarlamanız ve tek seferde 8KB fazlası paket gönderen fonksiyonlarınızı kısıtlamanız (Örnek; 15KB'lık offline shop paketiniz), bu oyunun paket sistemi değişmediği sürece Ymir'in zamanında pansuman olarak yaptığı şeyleri değiştirmemek gerek, bunu belirli bir sebeple yaptıkları aşikar, sevgiler.
 
Üst