Yardım Client/Server Handshake - Unknown Packet Header / Sequence Mismatch / Bağlantı Kopması

  • Konuyu açan Konuyu açan igul97
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 2
  • Gösterim Gösterim 119
Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

igul97

Üye
Üye
Mesaj
157
Çözümler
1
Beğeni
35
Puan
494
Ticaret Puanı
0
Merhaba arkadaşlar,

Sunucumuzda bazı oyuncularda zaman zaman bağlantı problemi yaşıyoruz. Her bağlantıda olmuyor.

Oyuncuların client syserr'lerinde genel olarak “Unknown packet header” hataları görülüyor. Bunun yanında oyuncularda şu belirtiler de yaşanıyor:

- “Sunucuya bağlanıyorsun” ekranında uzun süre bekleme
- Karakter ekranında takılma
- Bazı durumlarda karakter oyuna girmiş görünüyor fakat client-server iletişimi çalışmıyor
- Chat mesajları gitmiyor
- Diğer oyuncular hareket etmiyor
- Space ile saldırı yaptığında saldırı servera ulaşmıyor
- Client bazen kapanabiliyor
- Karakter server tarafında online kaldığı için ikinci client ile giriş yapılınca “hesap zaten bağlı” uyarısı alınabiliyor

Yani “hesap zaten bağlı” asıl problem değil; ilk bağlantının sağlıklı şekilde iletişim kuramaması/kapanmaması sonrasında ortaya çıkan sonuç gibi görünüyor.

Server loglarında ayrıca şu hataları yakaladık:

CH1:
Handshake phase does not handle packet 3
SEQUENCE mismatch 0xaf != 0x2f header 3
SEQUENCE_LOG [UNKNOWN]
closing socket

AUTH:
Handshake phase does not handle packet 71
SEQUENCE mismatch 0xaf != 0x20 header 71

Kontrol ettiğimiz packet.h dosyasında:
3 = HEADER_CG_CHAT
71 = HEADER_CG_SAFEBOX_CHECKOUT

Client tarafında SendChatPacket() fonksiyonunun sonunda açıkça SendSequence() çağrılıyor. Client ve server sequence tablolarının aynı olduğunu gördük. Server yeni connection için 0xaf beklerken bazı durumlarda clienttan ilerlemiş sequence değerleri geliyor.

Şu anda NetStream.cpp tarafında reconnect sırasında m_sendBuf ve m_iSequence state'inin temizlenmemesi ihtimalini araştırıyoruz. Özellikle Clear() fonksiyonunun socket INVALID_SOCKET olduğunda erken return etmesi dikkat çekti. Bunun eski buffer/sequence state bırakıp yeni bağlantıya taşınması mümkün mü diye inceliyoruz.

Daha önce sequence sistemini tamamen kaldırmayı da denedim fakat bu sefer giriş/handshake tarafında problemler oluştu ve sunucuya bağlanma sorunları başladı. Bu nedenle sequence'ı körlemesine kaldırmak istemiyorum.

Asıl merak ettiğim noktalar:

1. Oyuncuların aldığı “Unknown packet header” hataları ile serverdaki handshake/sequence mismatch hataları aynı problemin belirtisi olabilir mi?
2. Bu belirtiler client-side sequence/reconnect state problemine uyuyor mu?
3. Handshake aşamasında CHAT/SAFEBOX gibi packetlerin görülmesi neden olabilir?
4. 0xaf beklenirken 0x2f / 0x20 gelmesi client sequence state'inin eski bağlantıdan kalmasına işaret edebilir mi?
5. Dışarıdan gönderilen bozuk/uygunsuz packet veya bir bağlantı saldırısı bu tabloyu oluşturabilir mi? Loglardan saldırı ihtimalini nasıl ayırabiliriz?
6. NetStream.cpp üzerinde özellikle hangi noktaları kontrol etmeliyiz?

Server tarafında sequence değerlerini değiştirerek hatayı bastırmak istemiyorum. Amacım client-server bağlantısının hangi noktada senkron dışına çıktığını ve “Unknown packet header” hatasının gerçek sebebini bulmak.

Kaynak kodundan ilgili bölümleri paylaşabilirim.
 
Sorunun kaynağı okuduklarımdan anladığım kadarıyla bencede bu ekstra olarak Send kontrollerini de gözden geçir derim
Şu anda NetStream.cpp tarafında reconnect sırasında m_sendBuf ve m_iSequence state'inin temizlenmemesi ihtimalini araştırıyoruz. Özellikle Clear() fonksiyonunun socket INVALID_SOCKET olduğunda erken return etmesi dikkat çekti. Bunun eski buffer/sequence state bırakıp yeni bağlantıya taşınması mümkün mü diye inceliyoruz.
 
Oyuncuların aldığı “Unknown packet header” hataları ile serverdaki handshake/sequence mismatch hataları aynı problemin belirtisi olabilir mi? Evet
2. Bu belirtiler client-side sequence/reconnect state problemine uyuyor mu? Evet
3. Handshake aşamasında CHAT/SAFEBOX gibi packetlerin görülmesi neden olabilir? Buffer corrupt olduktan sonra orda gördüğün header numaraları hatalı olabilir.
4. 0xaf beklenirken 0x2f / 0x20 gelmesi client sequence state'inin eski bağlantıdan kalmasına işaret edebilir mi? Sequence neden kullanıyorsunuz gerek yok
5. Dışarıdan gönderilen bozuk/uygunsuz packet veya bir bağlantı saldırısı bu tabloyu oluşturabilir mi? Loglardan saldırı ihtimalini nasıl ayırabiliriz? Farklı desc için oluşturamaz ama oluşturabilir
6. NetStream.cpp üzerinde özellikle hangi noktaları kontrol etmeliyiz? Komple baştan aşağı
 
Geri
Üst