Script: http://www.raknet.net/raknet/manual/natpunchthrough.html
Mi a NAT?
NAT rövid hálózati címfordítás. Arra használják az útválasztók feltérképezésére címek router mögött egyetlen cél címét, különböző kikötőkben. Például ha van két számítógép egy router mögött, de csak egy ISP, akkor mindkét számítógépnek akkor használja ugyanazt az IP címet, de különböző forrásból port, mint amit a kérelem valójában szánták. A router tartja egy táblázat, amit portleképezéseinek nyújt, így amikor egy távoli számítógép válaszol, akkor ezt úgy irányítja a megfelelő helyi számítógép mögött NAT.
A probléma az, hogy a NAT távoli számítógépek nem kezdeményezhet küld a helyi számítógépen, mert nincs feltérképezése még létezik. Ezért, ha a két számítógép mindkét NAT mögött megpróbál csatlakozni, nem lesz képes erre. Ez a probléma a hang kommunikáció, peer to peer játékok vagy játékok, ahol a felhasználók és a gazdagéppel egy NAT. A régi időkben a felhasználóknak kellene menni a router konfigurációs képernyő és beállít egy leképezés. Azonban a modern alkalmazások a felhasználók általában nem szükséges, hogy ezt, hála NatPunchthrough.
NAT Punchthrough áttekintése
A NatPunchthroughClient.cpp bővítmény megköveteli a felhasználó szerveren tárolt, nem NAT mögött, futás NatPunchthroughServer.cpp hogy mindkét kliens is csatlakozhat. A szerver található a külső IP-címet minden ügyfél, és mondd mindkét ügyfél kapcsolódni a megadott címre egy időben. Ha ez nem sikerül, minden ügyfél megkísérli megbecsülni a portok által használt más. Ha ez nem sikerül, az egész folyamat ismétlődik újra, abban az esetben később port becslés nyitott előzetes port. Ha ez is sikertelen, akkor a bővítmény visszatér ID_NAT_PUNCHTHROUGH_FAILED.
1. megjegyzés: Ha közzéteszi a Steamen keresztül is nyújtunk SteamLobby, amely felhasználja által hosztolt szerverek Valve, amely esetben NATPunchthrough nem szükséges.
2. megjegyzés: A NAT Punchthrough nincs szükség, ha kizárólag IPv6 használatával.
3. megjegyzés: Ha a játék kliens / szerver csak, egyszerűen érvényesíteni, hogy a szerverek támogatnia kell UPNP. Lásd DependentExtensions \ miniupnpc-1.6.20120410. A legtöbb router támogatja ezt ezekben a napokban, és feltételezve, hogy UPNP halad, bárki csatlakozhat hozzád.
NAT Punchthrough algoritmus
*Peer P1 akar csatlakozni peer P2, akik mindketten csatlakoznak a harmadik nem NAT rendszer F
*Peer P1 kéri OpenNAT () a RakNetGUID (egyedi azonosító) P2 F.
*F vissza hiba esetén P2 nincs csatlakoztatva, vagy a már próbál punchthrough a P1.
*F emlékszik elfoglalt állapotát P1 és P2. Ha bármelyik P1 vagy P2 foglalt, a kérelem tolják a sorba. Egyébként F kéri a legutóbb használt külső port P1 és P2. P1 és P2 megjelölve elfoglalt.
*Ha bármelyik P1 vagy P2 nem reagálnak punchthrough sikertelen ID_NAT_TARGET_UNRESPONSIVE és a forgalmas zászló hatástalanítva van. Egyébként F küld időpecsételt kapcsolat üzenetet P1 és P2 egyszerre.
*P1 és P2 Act azonosan ezen a ponton. Először is küldjön több UDP adatcsomagok egymás belső LAN címét. Akkor megpróbálják egymás külső IP / port ahogy F. portok megpróbálta egymás, akár MAX_PREDICTIVE_PORT_RANGE.
*Ha bármely ponton egy adatcsomag érkezik a távoli szakértői, belépünk állami PUNCHING_FIXED_PORT. Datagrams csak akkor küldi el, hogy az IP / port kombinációja a fennmaradó algoritmus. Ha a válasz érkezik a távoli rendszer, a NAT tartják kétirányú és ID_NAT_PUNCHTHROUGH_SUCCEEDED visszakerül a felhasználóhoz.
*Ha NAT nyitva, vagy ha kimeríteni az összes port, P1 és P2 elküldi F, hogy készen állnak egy új punchthrough kísérlet.
Algoritmus effectivness függ NAT típusok részt. Működni fog, amelyik NAT a leginkább megengedő.
Teljes kúp NAT: Elfogadja bármilyen datagrammokat kikötőbe, hogy már korábban használt. Elfogadja az első adatcsomag a távoli szakértői.
Cím-Korlátozott kúp NAT: Elfogadja datagrammokat kikötőben, amíg az adatcsomag forrás IP cím egy olyan rendszer már küldött. Elfogadja az első adatcsomag ha mindkét rendszer küld egyszerre. Ellenkező esetben, akkor fogadja el az első adatcsomag után küldtünk egy adatcsomag.
Port-Restricted Cone NAT: Ugyanaz, mint a cím korlátozott kúp NAT, de meg kellett küldeni mind a megfelelő távoli IP-címet és megfelelő távoli port. Ugyanez a forrás címet és portot egy másik cél ugyanazt a leképezést.
Szimmetrikus NAT: A másik portot választja minden távoli helyre. Ugyanez a forrás címet és portot egy másik cél egy eltérő feltérképezése. Mivel a port más lesz, az első külső punchthrough kísérlet sikertelen lesz. Ehhez a munkához van szükség port-előrejelzése (MAX_PREDICTIVE_PORT_RANGE> 1), és a router választja portok sorozatban.
Siker grafikon
* NO még csatlakozni, ha a port becslés működik, de nem lehet hivatkozni.
Kliens implementáció
Egy példányának létrehozása a plugin: NatPunchthroughClient natPunchthroughClient;
Csatolja a plugin egy példány az RakPeerInterface: rakPeer-> AttachPlugin (& natPunchthroughClient);
Kapcsolódni a szerverhez, és várjon ID_CONNECTION_REQUEST_ACCEPTED. Használja a következő sort kell használni az ingyenes szerver által biztosított RakNet: rakPeer-> Connect ( “natpunch.jenkinssoftware.com”, 61111, 0, 0);
Hívja OpenNAT a RakNetGUID (globálisan egyedi azonosító) a távoli rendszer kívánt csatlakozni. Annak érdekében, hogy a RakNetGUID, akkor sem kell továbbítani, hogy a saját kódját a szerveren, töltsd fel az PHPDirectoryServer, vagy egy plugin, amely tárolja azt, mint például LightweightDatabase: natPunchthroughClient.OpenNAT (remoteGuid, serverSystemAddress) ;. Annak érdekében, hogy olvasd el a saját RakNetGUID használja RakPeerInterface :: GetGuidFromSystemAddress (UNASSIGNED_SYSTEM_ADDRESS);
Várj egy kicsit. Ez eltarthat 10 másodperc alatt, hogy megpróbálja minden lehetséges port kétszer, bár gyakran dolgozik egy pár másodpercig. Ha azt szeretnénk, hogy szöveges üzeneteket, hogy mi történik, akkor NatPunchthroughClient :: SetDebugInterface ()
ID_NAT_PUNCHTHROUGH_SUCCEEDED jelenti punchthrough sikerült, és képesnek kell lennie arra, hogy csatlakozni, vagy küldjön más üzeneteket a távoli rendszert. Packet :: SystemAddress a címe a rendszer akkor most csatlakozni. Minden más ID_NAT_ * jelenti punchthrough sikerült. Lásd MessageIdentifiers.h a kódok listája és megjegyzések minden.
Szerver végrehajtása
Host egy szerveren, és nem használ NAT / pl tűzfal mögött. (RakNet biztosít ingyenes egyet 8.17.250.34:60481, azonban érdemes lehet a fogadó saját következetes üzemidő).
Egy példányának létrehozása a plugin: NatPunchthroughServer natPunchthroughServer;
Csatolja a plugin: rakPeer-> AttachPlugin (& natPunchthroughServer);
Ne felejtsük el, hogy hívja RakPeerInterface :: Indítás () és RakPeerInterface :: SetMaximumIncomingConnections (MAX_CONNECTIONS);
A NatPunchthrough osztály
Lásd a mintát \ Samples \ NATCompleteClient és \ Samples \ NATCompleteServer
UDP Proxy
Néhány gyenge minőségű vagy házi útválasztók, akkor lehetséges, hogy a NAT punchthrough nem fog működni. Például egy router, amely felveszi az új random portot minden kimenő kapcsolatot, és csak akkor engedi a bejövő kapcsolatokat a port, nem fog működni. Ez akkor történik, mintegy 5% -át az időt. Kezelni az esetben RakNet biztosítja a UDPProxy rendszer. Lényegében ez használ egy szerver, amit futtatni az üzenetek között a forrás és a cél ügyfél átlátható. Ez még akkor is működik, hogy az útvonalat datagramokat játékok nem használ RakNet (bár meg kell RakNet beállítani a továbbítás). A kombináció NATPunchthrough és UDPProxy lehetővé kell tennie minden rendszer kapcsolódni bármely más rendszer 100% -os sikerességi arány, feltéve, ha hajlandó, hogy a fogadó elég proxy szervereket, hogy továbbítsa a forgalmat.
Az UDP Proxy rendszer 3 fő csoportba:
UDPProxyClient: teszi kérései UDPProxyCoordinator beállításához továbbítása. Ez az osztály a kliens fut.
UDPProxyCoordinator: Fut a szerver, hogy lesz minden kérést UDPProxyClient. Emellett lesz minden bejelentkezést UDPProxyServer
UDPProxyServer: Valójában nem az UDP datagram továbbítás útján kompozit példánya UDPForwarder.cpp
Kliens implementáció:
Egy példányának létrehozása a plugin: UDPProxyClient udpProxyClient;
Vezess egy osztályt RakNet :: UDPProxyClientResultHandler kap eseményértesítéseket a rendszer.
Csatolja a plugin egy példány az RakPeerInterface: rakPeer-> AttachPlugin (& udpProxyClient);
Hívjon UDPProxyClient :: SetResultHandler (), hogy az osztály a 2. lépésben létrehozott.
Próbálja NATPunchthrough először. Ha kap ID_NAT_PUNCHTHROUGH_FAILED a kezdeményező rendszer NATPunchthrough, folytassa a 6. lépéssel Mindkét rendszer visszatér ID_NAT_PUNCHTHROUGH_FAILED azonban csak egy rendszert kell kezdeni a proxy rendszert.
Hívjon UDPProxyClient :: RequestForwarding a címet a koordinátor, a kívánt címet továbbított (UNASSIGNED_SYSTEM_ADDRESS saját), a kívánt címet elé, és hogy mennyi ideig kell tartani a továbbítás aktív nincs adat. Például:
SystemAddress coordinatorAddress;
coordinatorAddress.SetBinaryAddress ( “8.17.250.34”);
coordinatorAddress.port = 60481;
udpProxyClient.RequestForwarding (coordinatorAddress, UNASSIGNED_SYSTEM_ADDRESS, p-> systemAddress, 7000);
Feltételezve, hogy csatlakozik-e a koordinátor, a koordinátor fut a plugin, az eseménykezelő osztály 2. lépésben létrehozott kéne egy visszahívási belül egy-két másodpercig. UDPProxyClientResultHandler :: OnForwardingSuccess fog visszaküldeni, ha a UDPProxyServer lett hozzárendelve, hogy továbbítsa datagramok a forrás rendszer 6. lépésben megadott, hogy a célrendszer meghatározott 6. lépésben például kapcsolódni a távoli rendszer használatát: rakPeer-> Connect ( proxyIPAddress, proxyPort, 0, 0);
Ha egynél több szerver is elérhető, és a forrás és a cél relé rendszerek futnak RakNet, majd forrás és a cél automatikusan ping az összes rendelkezésre álló szerverek. A szerverek megkísérelhető sorrendben legalacsonyabb ping összeg legmagasabb. Ennek alapja az a feltételezés, hogy a legalacsonyabb ping összeg adja a szerver, amely a legrövidebb út a két rendszer között, és ezért a legkisebb lag.
Koordinátor Megvalósítás:
Egy példányának létrehozása a plugin: UDPProxyCoordinator udpProxyCoordinator;
Csatolja a plugin egy példány az RakPeerInterface: rakPeer-> AttachPlugin (& udpProxyCoordinator);
Állítsa be a jelszót a koordinátor a szerverek használata udpProxyCoordinator.SetRemoteLoginPassword (COORDINATOR_PASSWORD);
Ne felejtsük el, hogy hívja RakPeerInterface :: Indítás () és RakPeerInterface :: SetMaximumIncomingConnections (MAX_CONNECTIONS);
Szerver Megvalósítás:
Egy példányának létrehozása a plugin: UDPProxyServer udpProxyServer;
Csatolja a plugin egy példány az RakPeerInterface: rakPeer-> AttachPlugin (& udpProxyServer);
Csatlakozás a koordinátor
Belépés a koordinátor. Ezt meg lehet tenni a futás, így dinamikusan hozzá több átirányítási szerverek, mint a játék egyre népszerűbb.
udpProxyServer.LoginToCoordinator (COORDINATOR_PASSWORD, coordinatorSystemAddress);
Ha a koordinátor plugin ugyanazon a rendszeren, mint a szerver plugin használja:
udpProxyServer.LoginToCoordinator (COORDINATOR_PASSWORD, rakPeer-> GetInternalID (UNASSIGNED_SYSTEM_ADDRESS));
Ha azt szeretnénk, hogy visszahívókat események következnek be (különösen a bejelentkezést hiba) származó RakNet :: UDPProxyServerResultHandler és regisztrálja származtatott osztály UDPProxyServer :: SetResultHandler ()
Állami diagram UDP Proxy
Szerver hosting
szerver követelmények
Nincs hálózati címfordítás.
Nem tűzfal, vagy tűzfal megnyílt a megfelelő portokat.
Statikus IP-címet. A dinamikus DNS egyik módja, hogy kb ennek a követelménynek.
Fordításhoz __GET_TIME_64BIT, ha szeretné futtatni a szerver egy hónapnál hosszabb ideig újraindítás nélkül
Elég sávszélesség kezelni az összes kapcsolat
Kereskedelmi hosting megoldások
Hypernia
Világ több pontjáról. Szerverek egyedi gépek. Starting at $ 150 havonta
Ha úgy találja, több hosting megoldások, lépjen kapcsolatba velünk, és ez lesz erre a listára.