Pordikontroll ütleb avatud? Miks Minecrafti mängijad ikkagi ei saa liituda
Õnnestunud TCP-ühendus tõestab ainult, et üks socket võeti vastu ühest kohast. Sisselogimine, maailma lubamine ja tee seest välja on eraldi testid.
Keegi käivitab pordikontrolli, näeb sõna avatud ja peab serverit lahendatuks. Mida see tulemus tegelikult tähendab, on kitsas: kontrollija asukohast, sel hetkel võeti vastu TCP-ühendus sellele aadressile ja pordile. See ei ütle midagi Minecrafti protokolli käepigistuse, konto autentimise ega selle kohta, kas server lubas mängija maailma.
Need on neli erinevat kihti ja ebaõnnestumine ükskõik millises neist annab mängijalt sama lause: see ei töötanud.
Sond testib ainult seda, mida ta näeb
TCP-ühendus lõpeb, kui mõlemad pooled lõpetavad kolmesuunalise käepigistuse, mis asub kõigest, mida mäng teab, allpool. Sond teatab, et kuulaja oli olemas ja vastas oma võrguasukohast. Ta ei saa öelda, et kuulaja on mäng, sest iga protsess saab pordi hõivata ja ühendusi vastu võtta.
Asukoht loeb sama palju kui tulemus. Avalikus internetis olev kontrollija testib ühte teed ühest võrgust. Kontrollija, mille operaator käivitab sama võrgu seest, testib hoopis teist teed, ja positiivne tulemus seal ei ütle peaaegu midagi selle kohta, mida kogeb kaugemal olev mängija. Kaks erinevat kontrollijat kahe erineva teenusepakkuja juures võivad isegi mitte nõustuda põhjustel, millel pole sinu serveriga mingit pistmist.
Ka aeg loeb. Sondi tulemus kirjeldab hetke, mil see jooksis, ja dünaamilise aadressi või muudetud edastusreegliga kodune ühendus võib tegelikku vastust paar minutit hiljem nihutada. Kirjuta üles avalik aadress, port, aadressipere ja kellaaeg koos otsusega, muidu ei ole tähelepanek korratav. Korda kontrolli tõeliselt teisest võrgust, mitte samas ühenduses olevast telefonist.
Neli kihti socketi ja mängija vahel
Kujuta ette järjestust, mida liituv klient tegelikult sooritab. Kõigepealt lahendab ta aadressi, seejärel avab TCP-ühenduse avaldatud pordile, seejärel räägib mängu enda protokolli läbirääkimiseks ja autentimiseks ning lõpuks otsustab server, kas see identiteet lastakse maailma. Igal kihil on oma tõrkeallkiri ja ainult esimene on pordikontrollile nähtav.
Java Editioni vaikimisi port on 25565, kuid operaator võib avaldada teistsuguse välise pordi ja edastada selle sissepoole, nii et number, mille mängija sisestab, ei pruugi olla number, mida server näeb. Valele välisele pordile suunatud kontrollija teatab suletud, samal ajal kui server on täiesti terve, ja see on kõige levinum valealarm kogu selles valdkonnas.
Nimed lisavad pordi kohale veel ühe sammu. Kui mängija sisestab hostinime, peab lahendamine tagastama avaldatud aadressi, ja võrgu sees oleval masinal võib see tagastada hoopis privaatse. See ei ole tulemüüri tõrge ja ükski pordiedastuse kogus ei muuda seda.
Miks seespool olev mängija valib teise tee
Mängija samas LAN-is või VPN-is, mis sellesse LAN-i jõuab, üritab jõuda avaliku aadressini seestpoolt. Päring läheb ruuteri välisele aadressile ja ruuter peab selle tagasi sissepoole tõlkima, mis on lahendus, mida tavaliselt nimetatakse hairpinninguks ehk NAT-peegelduseks. Et see töötaks, peavad klappima nii edasi- kui ka tagasitee, ja paljud koduruuterid ei rakenda seda üldse.
Sellepärast liitub külaline väljast, aga serveri kõrval istuv inimene ei saa. Väline tee on tõesti korras; ebaõnnestub sisemine ümbersõit ja see ebaõnnestub nii, et mängija ekraanilt näeb see välja nagu serveri probleem. Serveri enda logi otsustab, kumb juhtus, sest ühendus, mida kunagi ei tõlgitud, ei jõua kunagi kohale.
On kaks ausat parandust ja üks halb harjumus. Head valikud on lasta sisemistel mängijatel kasutada privaatset aadressi või split-DNS-i nime, mis laheneb seesmiselt privaatsele aadressile, või lubada ruuteril peegeldus, kui see funktsioon on olemas ja käitub korralikult. Halb harjumus on avada rohkem porte või lülitada välja hosti tulemüür, mis ei saa mõjutada tõlget, mida ruuter kunagi ei teinud.
Netgate’i NAT-peegelduse dokumentatsioon kirjeldab üksikasjalikumalt välise ja seesmise erinevust ning split-DNS-i alternatiivi. Loe seda mehhanismi kirjeldusena, mitte lubadusena, et mõni konkreetne VPN-teenusepakkuja või ruuter toetab iga loopbacki varianti.
Kogu tõendeid igast vaatepunktist
Iga testi kohta kirjuta üles, kes selle käivitas, kust, mis kellaajal, millise aadressi ja pordi vastu, ja mida server logis. Mängu keeldumine selge põhjendusega serveri konsoolis on teistsugune leid kui ühendus, mis kunagi kohale ei jõudnud, ja need kaks viivad vastassuundades.
Kui lubatud kaugmängijad liituvad ja üks kohalik mängija ei saa, on kohalik tee järelejäänud küsimus ja see väärib omaette uurimist: millist aadressi klient kasutas, mida tegi ruuter tõlkega ja kas server üldse mingit ühendusekatset registreeris. Anna need kolm fakti sellele, kellele võrk kuulub, selle asemel et porte huupi uuesti avada.