Science Blog





Original article:

http://jenkinssoftware.com/raknet/manual/natpunchthrough.html

NAT Punchthrough преглед

Какво е NAT?

NAT е кратък за преобразуване на мрежови адреси. Той се използва от рутери да картографира адреси зад рутера на един-единствен адрес на целта, използвайки различни пристанища. Например, ако имате два компютъра зад рутер, но само един ISP, а след това и двата компютъра ще използват един и същ IP адрес, но с различни изходни портове, отколкото това, което заявлението действително възложени. Маршрутизаторът поддържа справка таблица на какво съпоставяния тя предоставя, така че когато отдалечен компютър отговаря, тя се пренасочва към правилното локалния компютър зад NAT.

Проблемът с NAT е, че отдалечени компютри не могат да инициират изпраща към местните компютри, защото никой не картографиране, все още съществува. Ето защо, ако два компютъра едновременно зад NAT опитват да се свържат, нито ще бъде в състояние да го направят. Това е проблем, с гласова комуникация, партньорска към партньорската игри или игри, където потребителите си домакин и домакин е зад NAT. В старите дни на потребителите си, ще трябва да отида да им рутер конфигурация екран и настройка на картографиране. Въпреки това, в съвременни приложения потребители не са обикновено се изисква да направите това, благодарение на NatPunchthrough.

NAT Punchthrough Преглед

The NatPunchthroughClient.cpp плъгин изисква потребителско хоства на сървъра, а не зад NAT, бягане NatPunchthroughServer.cpp, че и двете клиенти могат да се свързват. Сървърът ще намерите външното IP адреса на всеки клиент, и кажи на двете клиенти, за да се свържете с този адрес в същото време. Ако това не помогне, всеки клиент ще се опита да изчислите пристанища, използвани от другата. Ако това не помогне, процесът се повтаря отново, в случай, че по-късно пристанище оценка откри преди порт. Ако това не успее, плъгин връща ID_NAT_PUNCHTHROUGH_FAILED.

Бележка 1: Ако публикувате чрез Steam, ние също така предоставя SteamLobby, която използва сървъри, хоствани от Valve, като в този случай NATPunchthrough не е необходимо.
Бележка 2: NAT Punchthrough не е необходима, ако се използват изключително IPV6.
Бележка 3: Ако играта си е само клиент/сървър, можете просто да наложат, че сървъри трябва да подкрепят UPNP. Вижте DependentExtensions\miniupnpc-1.6.20120410. Повечето рутери поддържат тази тези дни, и ако приемем, UPNP минава, всеки може да се свърже с вас.

NAT Punchthrough Алгоритъм

  1. Peer P1 иска да се свърже към партньорската P2, и двамата от които са свързани с една трета Non-NAT система, F
  2. Peer P1 призовава OpenNAT () с RakNetGUID (уникален идентификатор) на P2 да F.
  3. F връща провал, ако P2 не е свързан, или вече се опитва punchthrough да P1.
  4. F спомня зает състояние на P1 и P2. Ако някоя P1 или P2 е зает, искането се избутва до опашката. В противен случай исканията F последно използвани външен порт от P1 и P2. P1 и P2 са сигнал, че е зает.
  5. Ако някоя P1 или P2 не реагират punchthrough не успее с ID_NAT_TARGET_UNRESPONSIVE и зает флаг е изключено. В противен случай, F изпраща timestamped връзка съобщение на P1 и P2 едновременно.
  6. P1 и P2 акт идентично и в този момент. Първо, те изпращат множество UDP дейтаграми до взаимно вътрешни LAN адреси. Те след това се опитайте външен IP/порт на другия, както се вижда от F. Ports се опитал последователно, до MAX_PREDICTIVE_PORT_RANGE.
  7. Ако в някакъв момент дейтаграмата пристигне от дистанционното връстници, ние влизаме държавна PUNCHING_FIXED_PORT. Дейтаграми се изпращат само за тази комбинация IP/порт останалата част от алгоритъма. Ако нашият отговор пристига на отдалечената система, на NAT се счита двупосочна и ID_NAT_PUNCHTHROUGH_SUCCEEDED се връща на потребителя.
  8. Когато NAT е отворен, или ако ние изчерпи всички пристанища, P1 и P2 изпрати на F, че те са готови за нов punchthrough опит.

Алгоритъм ефективността им зависи от вида на NAT, участващи. Тя ще работи с двете NAT е най-разрешителния.

Пълен конус NAT: Приема всички дейтаграми до порт, който е бил използван преди. Ще приеме първата дейтаграма от дистанционното партньорска проверка.

Адрес-Ограничен конус NAT: Приема дейтаграми до пристанище, докато IP адреса на източника дейтаграма е система, ние вече са изпратени до. Ще приеме първия дейтаграмата, ако двете системи изпращат едновременно. В противен случай, ще приемем първата дейтаграмата, след като са изпратили една дейтаграма.

Порт-Ограничен конус NAT: Същото като адрес-ограничено конус NAT, но ние трябваше да изпрати на двете правилното дистанционно IP адреса и правилното дистанционно пристанището. Същият източник адреса и порта към различна дестинация използва същата картографиране.

Symmetric NAT: друг порт е избран за всяко дистанционно дестинация. Същият източник адреса и порта към различна дестинация използва различен картографиране. От пристанището ще бъде различен, първият опит външна punchthrough ще се провали. За да работи изисква порт-прогнози (MAX_PREDICTIVE_PORT_RANGE> 1) и, че на рутера избира пристанища последователно.

Успехът Graph
Router Type Пълен конус NAT Адрес-Ограничен конус NAT Порт-Ограничен конус NAT Симетричен NAT
Пълен конус NAT ДА ДА ДА ДА
Адрес-Ограничен конус NAT ДА ДА ДА ДА
Порт-Ограничен конус NAT ДА ДА ДА НЕ
симетричен NAT ДА ДА НЕ НЕ

 

*Не е все още може да се свърже, ако пристанището оценка работи, но не може да се разчита.

Клиент �?зпълнение

  1. Създаване на копие на плъгина: NatPunchthroughClient natPunchthroughClient;
  2. Прикрепете приставката за една инстанция на RakPeerInterface: rakPeer-> AttachPlugin (& natPunchthroughClient);
  3. Свържете се със сървъра, и да чакаме ID_CONNECTION_REQUEST_ACCEPTED. �?зползвайте следния ред за използване на безплатен сървър, предоставена от RakNet: rakPeer-> Connect (“natpunch.jenkinssoftware.com”, 61 111, 0, 0);
  4. Обадете OpenNAT с RakNetGUID (глобално уникален идентификатор) на отдалечената система, която искате да се свържете. За да получите най-RakNetGUID, ще трябва или да го предава със свой собствен код на сървъра, да го качите на PHPDirectoryServer, или да използвате плъгин, който го съхранява, като LightweightDatabase: natPunchthroughClient.OpenNAT (remoteGuid, serverSystemAddress) ;. За да четете собствените си RakNetGUID, използвайте RakPeerInterface :: GetGuidFromSystemAddress (UNASSIGNED_SYSTEM_ADDRESS);
  5. �?зчакайте известно време. Това може да отнеме повече от 10 секунди, за да се опита всичко възможно порт два пъти, въпреки че често се работи в рамките на няколко секунди. Ако искате да получавате текстови съобщения относно това, което се случва, можете да използвате NatPunchthroughClient :: SetDebugInterface ()
  6. ID_NAT_PUNCHTHROUGH_SUCCEEDED означава punchthrough успя, и би трябвало да можете да се свържете или изпратите други съобщения до отдалечената система. Packet :: SystemAddress е адресът на системата сега можете да се свържете. Всяка друга ID_NAT_ * означава punchthrough провали. Вижте MessageIdentifiers.h за списъка с кодове и коментари за всяка.

�?зпълнение Сървър

  1. Водещ на сървъра някъде, не се използва NAT/напр зад защитна стена. (RakNet осигурява безплатен едно по 8.17.250.34:60481 обаче може да искате да бъде домакин на собствения си за последователна непрекъсната работа).
  2. Създаване на копие на плъгина: NatPunchthroughServer natPunchthroughServer;
  3. Прикрепете приставката: rakPeer-> AttachPlugin (& natPunchthroughServer);
  4. Не забравяйте да се обадите RakPeerInterface :: Startup () и RakPeerInterface :: SetMaximumIncomingConnections (MAX_CONNECTIONS);

�?зползване на класа NatPunchthrough

Вижте примерни \Samples\NATCompleteClient и \Samples\NATCompleteServer

UDP Proxy

С някои лошо качество или домашно приготвени рутери, че е възможно, че NAT punchthrough няма да работи. Например, един рутер, който улавя нов случаен порт за всяка изходяща връзка, и ще позволи само входящи връзки към този порт, никога няма да работи. Това се случва около 5% от времето. За да се справят с този случай, RakNet предвижда системата UDPProxy. По същество, той използва на сървър, който ви свършат на маршрутните съобщения между източника и кацане клиента прозрачно. Това работи дори и да маршрут дейтаграми от игри, които не използват RakNet (макар и имате нужда RakNet да настроите препращане). Комбинацията от NATPunchthrough и UDPProxy трябва да се даде възможност на всяка система за свързване към друга мрежа, с успеваемост 100%, при условие, че са готови за домакин достатъчно прокси сървъри, за да предадат целия трафик.

Системата UDP Proxy използва три основни класа:

  • UDPProxyClient: Прави искания на UDPProxyCoordinator до пренасочване настройка. Това е клас на клиента изтече.
  • UDPProxyCoordinator: работи на сървъра, който ще получите всички искания от UDPProxyClient. Също така, получава всички данни за вход от UDPProxyServer
  • UDPProxyServer: Всъщност върши дейтаграма изпращане UDP, чрез композитен съд от UDPForwarder.cpp

Клиент на изпълнение:

  1. Създаване на копие на плъгина: UDPProxyClient udpProxyClient;
  2. �?звлече клас от RakNet :: UDPProxyClientResultHandler да получавате известия за събития на системата.
  3. Прикрепете приставката за една инстанция на RakPeerInterface: rakPeer-> AttachPlugin (& udpProxyClient);
  4. Обадете UDPProxyClient :: SetResultHandler () от класа създали в стъпка 2.
  5. Опитайте NATPunchthrough първия. Ако се ID_NAT_PUNCHTHROUGH_FAILED за системата, която инициира NATPunchthrough, преминете към стъпка 6. �? двете системи ще се върне ID_NAT_PUNCHTHROUGH_FAILED, обаче, само с една система трябва да започне на прокси системата.
  6. Обадете UDPProxyClient :: RequestForwarding с адреса на координатора, на адреса, който искате да предаде от (UNASSIGNED_SYSTEM_ADDRESS за собствения си), на адреса, който искате да изпраща и колко дълго да се запази препращането активни на Липсват данни. Например:
    SystemAddress coordinatorAddress;
    coordinatorAddress.SetBinaryAddress (“8.17.250.34″);
    coordinatorAddress.port = 60481;
    udpProxyClient.RequestForwarding (coordinatorAddress, UNASSIGNED_SYSTEM_ADDRESS, р> systemAddress, 7000);
  7. Ако приемем, че сте свързани с координатора, и координатора се изпълнява плъгин, вашето събитие манипулатор клас създали в стъпка 2, следва да получите обаждане в рамките на една-две секунди. UDPProxyClientResultHandler :: OnForwardingSuccess ще бъде върнат, ако един UDPProxyServer е възложено да предаде дейтаграми от системата за източник е посочено в стъпка 6, за да целевата система, посочена в стъпка 6. Например, за да се свържете с използването на система за дистанционно: rakPeer-> Свързване ( proxyIPAddress, proxyPort, 0, 0);

Ако повече от един сървър е на разположение, и двете системи за разпространяване на източника и целевите вървят RakNet, тогава източника и целта автоматично ще пинг всички налични сървъри. Сървърите ще се опитали по ред на най-ниската до най-високата сума, пинг. Това се основава на предположението, че най-ниската пинг сумата дава сървъра, който има най-краткия път между двете системи, поради което малко закъснение.

Координатор на изпълнение:

  1. Създаване на копие на плъгина: UDPProxyCoordinator udpProxyCoordinator;
  2. Прикрепете приставката за една инстанция на RakPeerInterface: rakPeer-> AttachPlugin (& udpProxyCoordinator);
  3. Задайте парола на координатора за сървърите да използват udpProxyCoordinator.SetRemoteLoginPassword (COORDINATOR_PASSWORD);
  4. Не забравяйте да се обадите RakPeerInterface :: Startup () и RakPeerInterface :: SetMaximumIncomingConnections (MAX_CONNECTIONS);

Сървър �?зпълнение:

  1. Създаване на копие на плъгина: UDPProxyServer udpProxyServer;
  2. Прикрепете приставката за една инстанция на RakPeerInterface: rakPeer-> AttachPlugin (& udpProxyServer);
    Свържете се с координатора
  3. Влез на координатора. Това може да стане по време на изпълнение, така че можете да добавите още динамично спедиторски сървъри като играта си е по-популярна.
  4. udpProxyServer.LoginToCoordinator (COORDINATOR_PASSWORD, coordinatorSystemAddress);
    Ако координаторът плъгина е на същата система като сървър плъгин, използвайте:
    udpProxyServer.LoginToCoordinator (COORDINATOR_PASSWORD, rakPeer-> GetInternalID (UNASSIGNED_SYSTEM_ADDRESS));
  5. Ако искате да получите извика като случват събития (особено в акаунта недостатъчност) произтичат от RakNet :: UDPProxyServerResultHandler и да регистрирате получен клас с UDPProxyServer :: SetResultHandler ()

Диаграма на състоянието с UDP Proxy

Хостинг сървър

�?зисквания за сървъри

  1. Не Network Address Translation.
  2. Не защитна стена, или защитна стена, открита на съответните пристанища.
  3. Static IP адрес. Dynamic DNS е един от начините да се получи около това изискване.
  4. Обединете с __GET_TIME_64BIT ако искате да пуснете сървъра по-дълъг от един месец без рестартиране
  5. Достатъчно честотна лента, за да се справят с всички връзки

Търговски хостинг решения

  1. Hypernia
    По целия свят. Сървърите са отделни машини. Започва от $ 150 на месец

Ако намерите по-хостинг решения, свържете се с нас и това ще бъде добавен към този списък.

 

 

  • Cars World
  • Cliparts for all
  • GALLERY-545645
  • GALLERY-656693
  • GALLERY-555993
  • GALLERY-858451
  • GALLERY-850488
  • GALLERY-895425
  • GALLERY-654461