Metin2 Kanal ve Port Yapısı: auth, ch1, ch99 ve P2P
Hazırlayan: Metin2VIP Editörleri Yayın: 9 dk okuma
İçindekiler
- Metin2 sunucusu hangi çekirdeklerden oluşur?
- PORT, P2P_PORT ve DB_PORT ne işe yarar?
- Örnek pakette kanal ve port planı
- Kanal nedir, haritalar çekirdeklere nasıl dağıtılır?
- ch99 neden ayrı bir kanal?
- Kanal durumu ve oyuncu sınırı kanal başına mı?
- Yeni kanal nasıl eklenir?
- Hangi portlar dışarıya açık olmalı?
- Sık görülen sorunlar
Bir Metin2 sunucusu tek bir program değil, birlikte çalışan çekirdeklerden oluşur: MySQL ile oyun arasında duran db çekirdeği, hesapları doğrulayan auth çekirdeği ve haritaları taşıyan oyun çekirdekleri. Her oyun çekirdeği oyuncuları kendi PORT'undan kabul eder, öteki çekirdeklerle P2P_PORT üzerinden konuşur ve db'ye DB_PORT ile bağlanır. CHANNEL değeri aynı olan çekirdekler birlikte bir kanalı oluşturur; 99 numaralı kanal ise bütün kanalların ortak kullandığı haritalar içindir.
Aşağıdaki kurallar oyun ve db çekirdeklerinin kaynak kodundan, örnekler kanal yapısını gen.py ile üreten yaygın sunucu paketinden alındı. Port numaraları bu pakete aittir; kendi düzeninde başka numaralar seçebilirsin, çekirdekler arasındaki ilişki değişmez.
Metin2 sunucusu hangi çekirdeklerden oluşur?
| Çekirdek | Görevi | Portları | Dışarıya açık mı? |
|---|---|---|---|
| db | Verileri önbellekte tutar, tabloları ve çekirdeklerin adreslerini dağıtır | conf.txt'deki BIND_PORT | Hayır |
| auth | Hesap adı ve parolayı doğrular, oyuncuyu kanala geçirir | PORT; P2P_PORT yalnız birden fazla auth varsa kullanılır | Yalnız PORT |
| Kanal çekirdekleri | Haritaları, canavarları ve oyuncuları çalıştırır | PORT ve P2P_PORT | Yalnız PORT |
| ch99 çekirdeği | Bütün kanalların ortak haritalarını çalıştırır | PORT ve P2P_PORT | Yalnız PORT |
Auth çekirdeği de kanal çekirdekleri de aynı game programıdır; hangisinin auth olacağını CONFIG'teki AUTH_SERVER satırı belirler. Auth çekirdeği harita açmaz ve MAP_ALLOW satırını yok sayar. Klasör düzeni sunucu dosyaları yazısında, CONFIG satırlarının tamamı CONFIG ayarları yazısında anlatılıyor.
PORT, P2P_PORT ve DB_PORT ne işe yarar?
PORT: oyuncunun bağlandığı kapı
PORT, oyuncu istemcisinin bağlandığı TCP portudur. Auth çekirdeğinde bu giriş portudur ve istemcinin serverinfo dosyasına auth portu olarak yazılır. Kanal çekirdeklerinde PORT iki iş görür: kanal listesindeki port oyuncunun girişte bağlandığı kapıdır; karakter seçildikten ya da başka çekirdekteki bir haritaya ışınlandıktan sonra istemci doğrudan o haritayı çalıştıran çekirdeğin PORT'una bağlanır.
Bu yüzden serverinfo'da yazmayan çekirdeklerin portları da oyunculara açık olmalıdır. Örnek pakette istemci girişte yalnız 30003'e bağlanır, ama Ateş Diyarı'na giden oyuncu 30005'e, Ejderha Ateşi Burnu'na giden 30007'ye, OX yarışmasına giden 30009'a bağlanır.
Çekirdek soketlerini makinede bulduğu genel adrese ya da CONFIG'teki BIND_IP adresine bağlar ve oyunculara da bu adresi bildirir. Sunucu NAT arkasındaysa oyunculara bildirilen adres PROXY_IP ile değiştirilir; karakter seçince kopan bağlantının ayrıntısı serverinfo yazısında.
P2P_PORT: çekirdeklerin kendi arasındaki bağlantı
Çekirdekler birbiriyle P2P_PORT üzerinden konuşur. Fısıltı, bağırma, grup ve lonca bilgisi, arkadaş listesi ve bir oyuncunun hangi çekirdekte olduğu bu bağlantılardan geçer. Bağlantıları elle tanımlamazsın: yeni bir oyun çekirdeği açıldığında db onun adresini ve P2P_PORT'unu çalışan bütün oyun çekirdeklerine bildirir, onlar da yeni çekirdeğe bağlanır. Sonuçta bütün kanalların bütün çekirdekleri birbirine bağlanır.
Auth bu ağa girmez. Auth'un P2P_PORT'una yalnız AUTH_SERVER: <adres> <port> satırıyla kurulan yardımcı auth bağlanır; tek auth kullanan sunucuda bu port boşta durur.
DB_PORT: db çekirdeğine bağlantı
DB_PORT, db çekirdeğinin conf.txt'deki BIND_PORT değeridir ve bütün auth ve oyun çekirdeklerinde aynı yazılır. Çekirdekler db'ye DB_ADDR adresinden bağlanır; db henüz açılmamışsa 3 saniyede bir yeniden dener. Başlatma betiği önce db'yi açar, ama sıra kaçarsa çekirdek kapanmaz, db gelince bağlanır. db tarafının satırları db conf.txt yazısında.
Örnek pakette kanal ve port planı
| Çekirdek | HOSTNAME | CHANNEL | MAP_ALLOW | PORT | P2P_PORT |
|---|---|---|---|---|---|
| db | 30000 (BIND_PORT) | ||||
| auth | srv1-auth | 1 | 30001 | 30002 | |
| Kanal 1, çekirdek 1 | srv1-ch1-core1 | 1 | 1 3 4 21 23 24 41 43 44 | 30003 | 30004 |
| Kanal 1, çekirdek 2 | srv1-ch1-core2 | 1 | 61-73, 104, 208, 216, 217, 351, 352 | 30005 | 30006 |
| Kanal 1, çekirdek 3 | srv1-ch1-core3 | 1 | 301 302 303 304 | 30007 | 30008 |
| Kanal 99 | srv1-ch99-core99 | 99 | 81 110 113 | 30009 | 30010 |
Bütün CONFIG'lerde DB_PORT 30000'dir. Birinci çekirdek krallıkların birinci ve ikinci köylerini ve Jungrang, Waryong, Imha haritalarını; ikinci çekirdek kasma haritalarının çoğunu ve zindanları; üçüncü çekirdek Ejderha Ateşi Burnu, Gautama Uçurumu, Nefrit Körfezi ve Yıldırım Dağları'nı; ch99 düğün, lonca savaşı ve OX haritalarını taşır. Numaraların hangi haritaya karşılık geldiği haritalar sayfasında.
gen.py portları elle değil sırayla dağıtır: db 30000'i alır, ardından her çekirdeğe önce PORT, sonra P2P_PORT için sıradaki boş numara verilir. Bu yüzden kanal sayısı değişince sonraki çekirdeklerin portları kayar. gen_settings.py'de yoruma alınmış ch2, ch3 ve ch4 blokları açılırsa kanal 2'nin ilk çekirdeği 30009'u, kanal 3'ünkü 30015'i, kanal 4'ünkü 30021'i alır ve ch99 30027'ye kayar. Kaynakla gelen istemcinin serverinfo dosyasındaki 30003, 30009, 30015 ve 30021 değerleri bu dört kanallı düzene karşılık gelir; tek kanallı pakette istemcinin "CH2" düğmesi ch99 çekirdeğine bağlanır. Kanal düzenini değiştirdikten sonra istemcideki portları da yeniden kontrol et.
Kanal nedir, haritalar çekirdeklere nasıl dağıtılır?
Kanal, CHANNEL değeri aynı olan çekirdeklerin toplamıdır. Bir kanalın haritaları MAP_ALLOW satırlarıyla çekirdeklere bölünür; numaralar locale/turkey/map/index dosyasındaki harita numaralarıdır. Oyuncu aynı kanalın bir çekirdeğinden diğerine geçtiğinde bunu yalnız bir yükleme ekranı olarak görür.
- Bir çekirdeğe en fazla 32 harita verilebilir. 33. harita db'ye giden kurulum bilgisine sığmaz ve onu bozar.
- Aynı numara bir çekirdeğin MAP_ALLOW listesinde iki kez geçerse çekirdek "multiple MAP_ALLOW setting" hatasıyla kapanır.
- MAP_ALLOW'a yazılan numara map/index dosyasında da bulunmalıdır; index'te olmayan numara hiçbir harita açmaz. Örnek paketteki ikinci çekirdeğin listesinin sonundaki 352 index dosyasında yoktur.
- Zindanların ve savaş alanlarının kopyaları, ana haritayı açan çekirdekte kurulur.
Yeni bir haritanın dosyalarını hazırlama adımları harita ekleme yazısında.
Çekirdekler birbirinin haritasını nereden bilir?
Çekirdek açılınca db'ye kanalını, portlarını ve harita listesini bildirir; db de ona hangi çekirdeğin hangi haritaları açtığını gönderir. Kimin kimi tanıyacağı kanala göre değişir:
| Yeni açılan çekirdek | Öğrendiği çekirdekler | Kendini tanıttığı çekirdekler |
|---|---|---|
| Kanal 1 | Kanal 1 ve kanal 99 | Kanal 1 ve kanal 99 |
| Kanal 99 | Kanal 1 ve kanal 99 | Bütün kanallar |
| Kanal 2, 3 ve sonrası | Kendi kanalı ve kanal 99 | Yalnız kendi kanalı |
Bu tablonun üç pratik sonucu var:
- Her kanal, ch99'dakiler dışındaki bütün haritaları kendi çekirdeklerinde açmalıdır. Kanal 2'nin çekirdekleri kanal 1'in haritalarını tanımaz; kanal 2'de açık olmayan bir haritaya ışınlanma yapılamaz.
- ch99'daki bir harita başka hiçbir kanalda açılmamalıdır. Aynı harita birbirini tanıyan iki çekirdekte açıksa çekirdek ilk öğrendiği adresi kullanır ve oyuncular aynı haritanın iki ayrı kopyasına dağılır.
- ch99'dan çıkan oyuncu kanal 1'e gider. ch99 çekirdeği yalnız kanal 1'in haritalarını tanıdığı için, kanal 3'ten OX yarışmasına giren oyuncu yarışma bitince köyüne kanal 1'de döner.
Oyuna girişte karakter listesinde her karakterin yanında, o karakterin haritasını açan çekirdeğin adresi ve portu gelir. Haritayı açan çekirdek bulunamazsa karakter krallığının başlangıç noktasına alınır. Bir çekirdek, kendisinde açık olmayan bir haritadaki karakteri yüklemeye kalkarsa onu başlangıç noktasına yazıp bağlantıyı kapatır; oyuncu yeniden girdiğinde köyünde başlar.
ch99 neden ayrı bir kanal?
Bazı haritalar sunucuda tek bir yerde açık olmalıdır. Kaynak kodda lonca savaşı haritaları sabittir: normal savaş 110 numaralı Lonca Savaşı Bölgesi'nde, bayrak savaşı 111 numaralı haritada kurulur. Savaş başladığında bu haritayı MAP_ALLOW listesinde bulunduran çekirdek savaş alanını açar ve alanın numarasını öteki çekirdeklere duyurur. Harita iki kanalda birden açık olsaydı aynı savaş için iki ayrı alan kurulurdu. Düğünler 81 numaralı Düğün Köyü'nde, OX yarışması 113 numaralı haritada yapılır.
ch99'a konan haritaları bütün kanalların çekirdekleri tanıdığı için her kanaldan oyuncu aynı düğüne, aynı lonca savaşına ve aynı OX yarışmasına katılır. Örnek pakette ch99 81, 110 ve 113'ü açıyor. Bayrak savaşının 111 numaralı haritası ise hiçbir çekirdekte açık değil, bu yüzden bayrak türündeki lonca savaşı için savaş alanı kurulamaz; bu türü kullanacaksan 111'i ch99'un MAP_ALLOW satırına ekle. Savaşın oyuncu tarafı lonca savaşı yazısında.
Tek kanallı bir sunucuda bu haritalar kanal 1'in bir çekirdeğinde de açılabilir; ch99'a asıl birden fazla kanal olduğunda ihtiyaç duyulur. Kanal değiştirme komutu eklenmiş sunucularda bu komut ch99'dayken çalışmaz.
Kanal durumu ve oyuncu sınırı kanal başına mı?
Evet. Giriş ekranındaki "Tavsiye edilen, Kalabalık, Dolu" durumu da CONFIG'teki USER_LIMIT sınırı da o kanalın bütün çekirdeklerindeki oyuncuların toplamına bakar. Çekirdek, P2P üzerinden gördüğü oyunculardan yalnız kendi kanalındakileri sayar; ch99'daki oyuncular ch99'un sayısına girer.
Durum eşikleri çekirdek klasöründeki state_user_count dosyasından okunur: ilk sayı "dolu", ikinci sayı "kalabalık" eşiğidir. Dosya boşsa kodun varsayılanları, 500 ve 10 geçerlidir; yani 10 kişiyi geçen her kanal "Kalabalık" görünür. Her çekirdek durumunu 5 dakikada bir kendi PORT'uyla bildirir ve istemci bir kanalın durumunu serverinfo'da yazan porttaki çekirdekten okur. /reload u dosyayı yalnız komutun yazıldığı çekirdekte yeniden okuduğu için, komutu o kanalın giriş çekirdeğindeki bir haritadayken yazmak gerekir.
Bir çekirdek kodda sabit olarak en fazla 4.096 bağlantı kabul eder; ADMINPAGE_IP listesindeki adresler bu sayıya takılmaz. Kaynakla gelen istemcinin giriş ekranında dört kanal düğmesi bulunur, beşinci bir kanal için istemcinin arayüzü de değişmelidir.
Yeni kanal nasıl eklenir?
- gen.py kullanıyorsan gen_settings.py'de yoruma alınmış ch2 bloğunu aç. Blok kanal 1 ile aynı üç çekirdek tanımını kullanır, yani yeni kanal da bütün haritaları açar. Elle kuruyorsan kanal 1'in çekirdek klasörlerini kopyala ve her CONFIG'te HOSTNAME, CHANNEL, PORT ve P2P_PORT satırlarını değiştir. HOSTNAME her çekirdekte farklı olmalı; çekirdeğe özel GENERAL_CONFIG dosyası ve log kayıtları bu adla ayrılır.
- Yapıyı
sh admin_panel.sh 666ile yeniden üret, ardındansh admin_panel.sh 999ile bütün CONFIG'lerin HOSTNAME ve PORT satırlarını listeleyip çakışma olmadığını kontrol et. - İstemcinin serverinfo dosyasına yeni kanalın ilk çekirdeğinin PORT'unu yaz ve root paketini yeniden oluştur.
- Güvenlik duvarında yeni çekirdeklerin PORT'larını aç, P2P_PORT'larını kapalı tut. gen.py'nin ürettiği ipfw.rules bu ayrımı kendisi yapar.
- gen.py mevcut çekirdeklerin portlarını da değiştirmiş olabileceği için sunucunun tamamını db'den başlayarak yeniden başlat.
Elle kurulan ikinci kanalın birinci çekirdeğinde CONFIG'in değişen satırları şöyle olur; DB_ADDR, DB_PORT ve SQL satırları kanal 1'dekiyle aynıdır:
HOSTNAME: srv1-ch2-core1
CHANNEL: 2
MAP_ALLOW: 1 3 4 21 23 24 41 43 44
PORT: 30011
P2P_PORT: 30012
Mevcut portlara dokunmadan elle eklenen bir kanalda eski çekirdekleri yeniden başlatmak gerekmez. db yeni çekirdeği öteki çekirdeklere kendisi tanıtır, P2P bağlantıları da kendiliğinden kurulur.
Hangi portlar dışarıya açık olmalı?
| Port | Kim bağlanır | Güvenlik duvarında |
|---|---|---|
| auth PORT | Oyuncular | Açık |
| Bütün oyun çekirdeklerinin PORT'u, ch99 dahil | Oyuncular | Açık |
| Bütün P2P_PORT'lar | Yalnız çekirdekler | Kapalı |
| db BIND_PORT | Yalnız çekirdekler | Kapalı |
| MySQL (3306) | Çekirdekler, aynı makineden | Kapalı |
Bütün çekirdekler aynı makinedeyse conf.txt'ye BIND_IP = 127.0.0.1 eklemek db portunu dış ağ arayüzlerinden tamamen çeker. Paketin güvenlik duvarı şablonundaki 3306 sorunu ve kurulumun öteki güvenlik adımları server kurulumu yazısında.
Sık görülen sorunlar
| Belirti | Olası sebep |
|---|---|
Çekirdek açılmıyor, ekranda socket_tcp_bind hatası |
PORT ya da P2P_PORT başka bir çekirdekte kullanılıyor ya da BIND_IP bu makineye ait değil |
| Giriş tamam, karakter seçince bağlantı kopuyor | Çekirdek oyunculara ulaşamayacakları bir adres bildiriyor (BIND_IP, PROXY_IP) ya da karakterin haritasını açan çekirdek kapalı |
| Belirli bir haritaya geçerken bağlantı kopuyor | O haritayı açan çekirdeğin PORT'u güvenlik duvarında kapalı ya da çekirdek çalışmıyor |
| Işınlanma hiç gerçekleşmiyor, syserr'de "cannot find map location" | Bu kanalda o haritayı açan çekirdek yok ya da harita map/index'te tanımlı değil |
| Fısıltı, lonca ve grup bilgisi başka çekirdeğe ulaşmıyor | P2P bağlantısı kurulamıyor: çekirdekler farklı makinelerde (port güvenliği) ya da iki çekirdeğe aynı P2P_PORT verilmiş |
| Çekirdek db'ye bağlanamıyor, db'nin syslog'unda "BLOCK CONNECTION FROM" | DB_ADDR'a makinenin genel IP'si yazılmış; 127.0.0.1 yaz |
| 2. ve 3. kanal oyuncuları OX'ten sonra kanal 1'de | ch99 yalnız kanal 1'in haritalarını tanır |
| Bütün kanallar 10 kişiden sonra "Kalabalık" görünüyor | state_user_count boş, varsayılan kalabalık eşiği 10 |
Sık sorulan sorular
- Metin2 server için hangi portlar dışarıya açılmalı?
- Auth çekirdeğinin PORT'u ve ch99 dahil bütün oyun çekirdeklerinin PORT'ları. Oyuncu başka çekirdekteki bir haritaya geçerken doğrudan o çekirdeğin portuna bağlanır. P2P_PORT'lar, db portu ve MySQL portu dışarıya kapalı kalmalıdır.
- ch99 nedir, neden ayrı bir kanal?
- 99 numaralı kanal, bütün kanallardan oyuncuların aynı yerde buluşması gereken haritalar içindir: düğün, lonca savaşı ve OX yarışması. db, ch99'daki haritaları bütün kanalların çekirdeklerine tanıtır; bu haritalar bir kanala konsaydı öteki kanallar onlara ulaşamazdı.
- OX yarışmasından sonra neden kanal 1'e düşüyorum?
- ch99 çekirdeği yalnız kanal 1'in haritalarını tanır. ch99'daki bir haritadan çıkan oyuncu, hangi kanaldan gelmiş olursa olsun kanal 1'deki haritaya gönderilir. Bu, kanal yapısının doğal sonucudur.
- Bir çekirdeğe kaç harita verilebilir?
- En fazla 32. Daha fazlası db'ye giden kurulum bilgisine sığmaz. Aynı harita numarası bir çekirdeğin MAP_ALLOW satırında iki kez geçerse çekirdek hiç açılmaz.
İlgili sayfalar
- Metin2 CONFIG Ayarları: Game Çekirdeği Seçenekleri ve Anlamları (Server kurma)
- Metin2 db conf.txt Ayarları: SQL Satırları, BIND_PORT ve ITEM_ID_RANGE (Server kurma)
- Metin2 Harita Ekleme: Sunucu ve Client Tarafı Adım Adım (Server kurma)
- Metin2 Lonca Savaşı: Savaş Türleri, Puanlama ve Kurallar (Wiki)
- Metin2 Server Dosyaları: Klasör Yapısı ve Her Dosyanın Görevi (Server kurma)
Kategori: Server Kurma Yapılandırma yapılandırma server kurulumu kanal port p2p
Bu sayfadaki bilgiler Metin2'nin sunucu yazılımındaki hesaplamalara ve standart oyun dosyalarına dayanır. Oyun dosyalarını değiştiren sunucularda değerler farklı olabilir. İçerikleri nasıl hazırlıyoruz?