мај 24, 2016

Преглед на NAT Punchthrough

Source: http://www.raknet.net/raknet/manual/natpunchthrough.html

Што е NAT?

NAT е краток за мрежна адреса превод. Се користи од страна на рутери за да на сајтот адреси зад рутер на една одредишна адреса, со користење на различни пристаништа. На пример, ако имате два или повеќе компјутери зад рутер, но само еден интернет провајдер, а потоа и компјутери ќе се користи истата IP адреса, но со различни пристаништа извор од она што всушност се доделени од апликацијата. Рутерот чува lookup табелата на она што мапирање тоа обезбедува, па кога му одговара на оддалечен компјутер што се насочени кон точниот локална компјутер зад NAT.

Проблемот со NAT е дека далечински компјутери не можат да отпочнат испраќа на локалните компјутери, бидејќи не мапирање сè уште не постои. Затоа, ако два или повеќе компјутери и зад NAT обидете да се поврзете, ниту ќе биде во можност да го стори тоа. Ова е проблем со говорна комуникација, пер да пир игри или игри, каде што вашите корисници домаќин и земјата-домаќин е зад NAT. Во старите денови на вашите корисници ќе мора да одат на нивните рутер конфигурација на екранот и подесување на мапирање. Меѓутоа, во модерни апликации кои не се обично се бара да го направите ова, благодарение на NatPunchthrough.

NAT Punchthrough Преглед

Приклучокот NatPunchthroughClient.cpp бара корисничко домаќин на серверот, а не зад NAT, трчање NatPunchthroughServer.cpp дека и клиенти да се поврзете. Серверот ќе се најде IP адресата на секој клиент, како и да се каже клиенти за да се поврзете на таа адреса во исто време. Ако тоа не успее, секој клиент ќе се обиде да се процени пристаништа се користи од страна на другите. Ако тоа не успее, процесот се повторува уште еднаш, во случај подоцна проценка порта се отвори пред порта. Ако тоа не успее, се враќа на приклучокот ID_NAT_PUNCHTHROUGH_FAILED.

Забелешка 1: Ако објавуваат преку пареа, ние исто така нудиме SteamLobby, кој се користи сервери домаќин на вентил, во кој случај NATPunchthrough не е потребно.
Забелешка 2: NAT Punchthrough не е потребно ако исклучиво со користење на IPV6.
Забелешка 3: Ако играта е само клиент / сервер, можете едноставно да се спроведе дека серверите мора да ја поддржува UPnP. Види DependentExtensions \ miniupnpc-1.6.20120410. Повеќето рутери поддршка на ова, овие денови, и под претпоставка UPnP поминува, секој може да се поврзе со вас.

NAT Punchthrough Алгоритам

1.Peer P1 сака да се воспостави врска П2, и двете од кои се поврзани со една третина Не-NAT систем, F
2.Peer P1 повикува OpenNAT () со RakNetGUID (единствен идентификатор) на P2 за да Ф.
3.F враќа неуспех ако P2 не е поврзан, или веќе се обидува да punchthrough П1.
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 / порта како што се гледа од Ф. пристаништа се обидел секвенцијално, до MAX_PREDICTIVE_PORT_RANGE.
7.Ако во било која точка на datagram пристигнува од далечинскиот управувач од колега, влегуваме во состојба PUNCHING_FIXED_PORT. Датаграми ќе ги добиете само дека IP / порта комбинација на остатокот од алгоритам. Ако нашиот одговор ќе пристигне на оддалечен систем на NAT се смета за двонасочна и ID_NAT_PUNCHTHROUGH_SUCCEEDED се враќа на корисникот.
8.Кога NAT е отворена, или, ако ние ги искористи сите пристаништа, P1 и P2 испрати до F дека тие се подготвени за нов punchthrough обид.

Алгоритам effectivness зависи од видовите NAT вклучени. Тој ќе работи со кое NAT е најстариот попустлив.

Комплетна Cone NAT: прифаќа било датаграми на порта кој се користи претходно. Ќе ги прифати првите datagram од далечинскиот управувач од колега.

Адреса ограничена Cone NAT: прифаќа датаграми до порта додека IP адреса на datagram извор е систем што веќе се испратени до. Ќе ги прифати првите datagram ако двата системи ги истовремено. Во спротивно, ќе ги прифати првите datagram откако ќе го испрати еден датаграм.

Порт-Ограничени Cone NAT: Исто како адреса ограничена Cone NAT, но мораше да се испрати на двете правилен далечински IP адреса и точни оддалечени порта. Истиот извор адреса и порта на различни дестинација користи истиот мапирање.

Симетричен NAT: различна порта е избран за секој далечински дестинација. Истиот извор адреса и порта на различни дестинација користи различни мапи. Од пристаништето ќе бидат различни, првите надворешни обид punchthrough ќе пропадне. За тоа да го работат бара порта-предвидување (MAX_PREDICTIVE_PORT_RANGE> 1) и на тој рутер избира пристаништа и решително.

Графикон успех

Тип на рутер целосни  Kонус NAT Aдреса ограничена Cone NAT  Порт-Ограничени Cone NAT  Cиметричен NAT
Комплетна Cone NAT                   ДА                    ДА                                                         ДА                                               ДА
Адреса ограничена Cone NAT   ДА                    ДА                                                         ДА                                                ДА
Порт-Ограничени Cone NAT     ДА                    ДА                                                         ДА                                                НЕ
Симетричен NAT                          ДА                    ДА                                                         НЕ                                                 НЕ

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

Kлиент за имплементација

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

Cпроведување на серверот

1.Домаќин на сервер некаде, не се користи NAT / на пример, зад огнен ѕид. (RakNet обезбедува бесплатен едно по 8.17.250.34:60481, сепак можеби ќе сакате да биде домаќин на свој за доследно uptime).
2.Создаде еден пример на приклучокот: NatPunchthroughServer natPunchthroughServer;
3.Прикачи на приклучокот: rakPeer-> AttachPlugin (& natPunchthroughServer);
4.Не заборавајте да го повикате RakPeerInterface :: стартување () и RakPeerInterface :: SetMaximumIncomingConnections (max_connections);

Користење на класа NatPunchthrough

Види примерок \ Примероците \ NATCompleteClient и \ Примероци \ NATCompleteServer

UDP прокси

Со некои лош квалитет или домашна рутери, можно е дека NAT punchthrough нема да работи. На пример, рутер кој зема нов случајна порта за секое заминување конекција, и ќе ви овозможи дојдовни врски со оваа порта, никогаш нема да успее. Ова се случува околу 5% од времето. Да се справи со овој случај, RakNet обезбедува системот UDPProxy. Во суштина, тоа го користи сервер кој ќе се кандидира на пораките пат помеѓу изворот и дестинацијата клиент транспарентно. Ова функционира дури и да рута датаграми од игри кои не користат RakNet (иако треба RakNet за подесување на товар). Комбинацијата на NATPunchthrough и UDPProxy треба да им овозможи на секој систем да се поврзе со било кој друг систем со 100% стапка на успех, под услов да се спремни да угостат доволно прокси сервери за да ги пренасочите сите сообраќајот.

Системот користи UDP Меѓу 3 главни класи:

UDPProxyClient: Прави барањата на UDPProxyCoordinator на товар поставување. Оваа класа на клиентот работи.
UDPProxyCoordinator: Работи на серверот на кој ќе ги добиете сите барања од UDPProxyClient. Исто така, ги добива сите најавувања од UDPProxyServer
UDPProxyServer: Всушност не на datagram препраќање на 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 = 60.481;
udpProxyClient.RequestForwarding (coordinatorAddress, UNASSIGNED_SYSTEM_ADDRESS, p-> systemAddress, 7000);
7.Под претпоставка дека се поврзани со координаторот, и координаторот е водење на приклучок, вашиот настан управувачот класа создадени во чекор 2 треба да добие повратен повик во рок од една секунда или две. UDPProxyClientResultHandler :: OnForwardingSuccess ќе бидат вратени ако UDPProxyServer е доделен да го проследи датаграми од системот за извор наведени во чекор 6, на целниот систем наведени во чекор 6. На пример, да се поврзете со користење на далечинскиот управувач систем: rakPeer-> Connect ( proxyIPAddress, proxyPort, 0, 0);
Ако повеќе од еден сервер е на располагање, и двете изворот и целните релејни системи се извршува RakNet, тогаш изворот и целните автоматски ќе пинг сите достапни сервери. Серверите ќе се обиде со цел на најниската пинг сума на највисоко ниво. Ова се базира на претпоставката дека најниската сума пинг ви дава сервер кој има најкратката патека помеѓу два системи, а со тоа најмалку заостануваат.

Координатор на имплементација:

1.Создаде еден пример на приклучокот: UDPProxyCoordinator udpProxyCoordinator;
2.Закачете го додатокот на пример на RakPeerInterface: rakPeer-> AttachPlugin (& udpProxyCoordinator);
3.Поставете лозинка на координатор за сервери за користење udpProxyCoordinator.SetRemoteLoginPassword (COORDINATOR_PASSWORD);
4.Не заборавајте да го повикате RakPeerInterface :: стартување () и 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 прокси

natpunchpanel1smallnatpunchpanel2smallnatpunchpanel3smallnatpunchpanel4small

natpunchpanel5smallnatpunchpanel6smallnatpunchpanel7small
Cервер хостинг
барањата на серверот

1.Нема мрежна адреса превод.
2.Не заштитен ѕид, или огнен ѕид отворени на соодветни пристаништа.
3.Статичка IP адреса. Dynamic DNS е еден од начините да се добие околу ова барање.
4.Компајлира со __GET_TIME_64BIT ако сакате да се кандидира на серверот подолго од еден месец без рестартирање
5.Доволно пропусен опсег да се справи со сите врски

Комерцијални хостинг решенија

1.Hypernia
Низ светот. Серверите се поединечни машини. Со почеток во $ 150 месечно
Ако можете да најдете повеќе хостинг решенија, контактирајте со нас и тоа ќе се додадат на оваа листа