Для начинающих варкрафтеров может стать сюрпризом такая ситуация:
создаёшь хост, а на него никто не может зайти. Ко мне уже несколько раз
обращались с этим вопросом. Ходят даже мифы, что «ему дали хост —
может, и мне когда-нибудь дадут». Нет, проблема в другом. А в чём — это
я и хочу поведать вам.
Теория
Под хайдом большой и интересный текст. Кто не любит читать, вкратце:
1. Игроки подключаются к хосту, а не к Battle.net.
2. Поэтому хост должен иметь или реальный IP, или открытый порт на NAT'е.
3. А если есть брандмауэр — war3.exe или соответствующий порт должен быть открыт.
Представим себе: несколько компьютеров ведут многопользовательскую игру. Попробуем ответить на два вопроса:
1) Что знает каждый из компьютеров о том, что творится в игровом мире?
В частности: хранится ли на нашем компьютере положение невидимых
юнитов? Вражеских героев?
и 2) Что компьютеры передают друг другу по сети?
В гонках, например, компьютеры могут просто передавать друг другу
положение машин. В стратегии реального времени такого уже не сделаешь:
юнитов на карте на несколько порядков больше, чем машин в гонке. Но
ведь передают что-то и как-то?
А в стратегиях используют фундаментальное свойство цифровой ЭВМ: когда одной и той же программе «скармливают» одни и те же данные, получается один и тот же результат. Вуаля! 1) На каждом из компьютеров хранится весь игровой мир —
всё, включая невидимок, противников в «тумане войны» и т.д. 2)
Передаются команды управления наподобие «Пометить группу», «Двигаться»
или «Использовать еул». Каждый из компьютеров, получив эту команду,
выполняет её — и результаты будут идентичными.
Не так всё просто. Есть много вещей,
которые могут привести к рассинхронизации. На разных моделях
процессоров матсопроцессор может выдавать числа, чуть-чуть
различающиеся в последнем знаке. Есть прерывания, которые проскакивают
в неконтролируемые моменты. А есть просто баги. Так что написание
«повторяемого» движка — дело непростое. Но принцип поняли...
Кстати, на этой же «повторяемости» основана запись реплеев.
В такой модели выделенному серверу просто нет места. Передавать
короткие сообщения с машины на машину, служить посредником? Это вполне
может взять на себя один из игроков. Так что вот вам ещё одна чеканная
фраза: игроки налаживают соединение с хостом, а не с Battle.net.
А что же делает Battle.net? А он служит исключительно рекламой. Он
объявляет игрокам хосты. И больше ничего. Варкрафтеры со стажем не раз
встречали сообщение: «Через 20 минут сервер будет перезапущен». Сервер
давно перезапустили, а игра идёт как ни в чём не бывало. Как раз по
этой причине.
Сколько раз я уже слышал от людей с пингом под 200: «Я не лаггер»... Причина та же самая. Пинг проверяется от клиентов до хоста, а не от клиентов до сервера. Разумеется, на одном хосту будут лаги, в то время как на другом всё пройдёт гладко.
NAT'ы, брандмауэры и иже с ними
Таким образом, игроки налаживают соединение с хостом (обычно по
порту 6112, хотя этот порт можно задать в настройках игры). Что нужно
знать, чтобы наладить соединение? IP-адрес и порт.
IP-адрес — это четыре числа от 0 до 255. Например, 101.102.103.104.
Всего IP-адресов 256^4 = 4 млрд. То есть, два IP-адреса на трёх жителей
Земли. Уже во время конверсии Арпанета в Интернет выяснилось, что долго
такая адресация не протянет. Так что сделали обходной путь — NAT (Network Address Translation). Как он действует, покажу на примере.
Без NAT'а всё просто. Маршрутизаторы передают TCP-пакет по эстафете без всяких изменений.
А как же с NAT'ом? Начнём с того, что адреса вида 10.x.x.x и
192.168.x.x считаются внутрисетевыми, и пакеты, предназначенные им,
маршрутизаторы не пропускают. А как же мы с такими адресами ухитряемся
качать порнуху? А вот так.
Мы — компьютер 10.0.0.5. Мы передаём пакет на шлюз, имеющий
внутрисетевой IP 10.0.0.1 и внешний IP 25.26.27.28. А теперь самое
интересное: маршрутизатор корректирует адрес отправителя, и в интернет
идёт пакет с реквизитами «25.26.27.28 -> 31.32.33.34». Сервер
возвращает ответ маршрутизатору (25.26.27.28). Тот вспоминает, что этот
ответ предназначается 10.0.0.5, и ретранслирует его в сеть (попутно
заменив 25.26.27.28 на 10.0.0.5)
А теперь вопрос: как связаться с 10.0.0.5 извне?
Так, чтобы не наш 10.0.0.5 наладил соединение, а 31.32.33.34? Пакет с
получателем 10.0.0.5 не дойдёт, его никакой маршрутизатор не пропустит.
А если писать на 25.26.27.28, пакет дойдёт до маршрутизатора, но в
таблице открытых соединений ничего по этому поводу нет — а значит,
пакет снова не дойдёт!
Чтобы разрешить эту проблему, в NAT'е есть ещё одна таблица — так
называемая таблица перенаправления портов. Но, к сожалению, её
приходится заполнять вручную (на админском языке это называется
«пробросить порт»). А если доступа к ней нет (например, NAT
провайдерский) — только облизываться.
Получается, что находящиеся в локальной сети компьютеры для внешнего
мира «не существуют», от их имени действует NAT-шлюз. Мы можем ходить
на веб-сервер 25.26.27.28:80, а можем — играть в Dot'у с
25.26.27.28:6112, даже не подозревая, что это разные машины. NAT
используется повсеместно: когда за ним квартира, когда компьютерный
клуб, когда целая страна. Да, бывает и такое: в некоторых мусульманских
странах один IP-адрес на всех. И нам, украинцам, в этом плане ещё везёт.
Межсетевой экран, или брандмауэр —
аппаратно-программный комплекс, не пропускающий «вредного» трафика.
Если брандмауэр есть, в нём надо сделать дырочку: указать, что
Warcraft — программа полезная и её резать не надо.
NAT-маршрутизатор сам по себе выполняет часть функций брандмауэра,
пропуская входящие соединения только по разрешённым портам. Впрочем,
настоящие брандмауэры блокируют и другие виды атак — вредоносный
исходящий трафик, сканирование портов или DoS.
Что делать?
Проще говоря, нужно выполнить три шага.
1) Убедиться, что нет NAT'а, неподконтрольного нам (у провайдера, на фирме, в клубе...).
2) Если есть подконтрольный нам NAT, открыть соответствующий порт.
3) Сделать «дырочку» в локальном брандмауэре.
Как проверить наличие NAT'а
Технически подкованные должны знать, имеют они внешний IP или
внутренний через NAT. В частности, это можно найти на сайте провайдера.
Но в том-то и дело, что я пишу для новичков.
На компьютере даём команду «Пуск-Выполнить». Введите cmd. В открывшемся окне введите ipconfig /all.
Пользователи Windows 9x вместо cmd набирают command.
Если IP-адрес внутрисетевой (192.168.x.x или 10.x.x.x), NAT есть.
Если же NAT есть и у вас в квартире маршрутизатор — может, NAT на маршрутизаторе?
В
кабельные и DSL-модемы часто встраивают маршрутизатор. Поэтому если у
вас модем и вы подключены к интернету постоянно (никакое соединение
запускать не надо) — у вас роутер (и, скорее всего, на нём NAT). За
модемом несколько машин на свитче — та же самая история.
Заходим браузером на IP-адрес маршрутизатора. Например:
Введя логин и пароль, находим пункт меню Connection Status, Device Status
или подобный. Там можно найти текущий IP-адрес. Если адрес
внутрисетевой (192.168.x.x или 10.x.x.x), NAT есть. Если нет — значит,
NAT на маршрутизаторе и всё нормально.
Если судить по картинкам, у меня внутрисетевой адрес на компьютере и
обычный — на маршрутизаторе. То есть, у меня именно этот вариант — NAT
на личном маршрутизаторе.
Как избавиться от неподконтрольного NAT'а
Если выяснилось, что NAT у провайдера, следует купить реальный (внешний) IP-адрес
(статический или динамический — не важно). Эта услуга есть почти у всех
Ethernet- и DSL-провайдеров за небольшую плату. Несколько провайдеров
наобум:
IPNet: реальный статический IP 5 грн. за подключение + 5 грн/месяц.
Аванет: реальный статический IP 5 грн/мес.
Воля: реальный динамический IP изначально.
Киевнет: реальный статический изначально.
Ланет: на тарифах 110 грн. и выше реальный статический IP изначально, на более дешёвых 15 грн/мес.
Укртелеком/ОГО: реальный динамический IP изначально.
(данные на июль 2008 г.)
А если NAT в клубе, на работе, дома и т.д. — попробуйте сделать его
подконтрольным! Договоритесь с админом, чтобы он открыл вам порт. И не
злите его, чтобы не закрыл.
Как открыть порт на NAT-маршрутизаторе
Много текста, а нужно не всем. Поэтому эту часть гайда прикрою.
Предполагается, что у нас не менее двух компьютеров и простой домашний
роутер, настроенный и работающий. Для примера возьмём стоящий у меня
под столом Edimax BR-6104KP. На других моделях пункты меню будут
другие.
Большинство домашних роутеров способно открывать порты только по
IP-адресу. Так что первое, что вам придётся сделать — это отключить
динамическую раздачу IP-адресов (DHCP — Dynamic Host Configuration
Protocol).
Было бы отлично, если бы на устройствах такого класса был статический DHCP. Но его нет — что ж, не судьба...
Вводим на компьютере Пуск-Выполнить-cmd, затем ipconfig /all. Этим мы узнаём, есть ли DHCP.
Если его нет, это хорошо. Если есть — выключим.
Отключение DHCP
Снова заходим в настройки маршрутизатора и находим настройку DHCP — она должна быть в пункте «LAN» или «DHCP». В моём маршрутизаторе всё это находится в пункте «General setup / LAN». Делаем, чтобы роутер мог раздавать не все
возможные сетевые адреса (в данном случае «все» — это
192.168.2.2—192.168.2.255; цифры могут меняться в зависимости от модели
маршрутизатора и ваших настроек), а некоторую их часть. Например, от
100 до 200.
А на компьютере выставляем IP-адрес за пределами
этого диапазона (и, конечно же, не совпадающий с IP-адресом
маршрутизатора). «Пуск — Панель управления — Сетевые подключения —
Подключение по локальной сети — (правая кнопка) — Свойства — Протокол
интернета (TCP/IP) — Свойства». Откуда брать остальные поля (маска
подсети, шлюз, DNS) — думаю, понятно.
Внимание! Провайдеры любят
менять адреса DNS-серверов без предупреждения, а большинство роутеров
способны ретранслировать провайдерские DNS-сервера по DHCP. Так что
появляется побочный эффект: если провайдер сменит DNS, у вас интернет
пропадает, а у напарников, у которых DHCP не отключили — нет. В такой
ситуации вам придётся вводить новые адреса DNS-серверов.
Как открыть порт
Теперь в настройках маршрутизатора находим пункт NAT/Virtual Servers или NAT/Port Forwarding. Открываем порт 6112 на протоколы TCP и UDP. Например, так...
На некоторых роутерах можно увидеть два пункта: Local Port и Network Port. В обоих полях ставится 6112.
Этот же порт прописываем в Warcraft. Из главного меню вызываем «Настройки — Игра».
Если нас много?
Если за роутером целая компания дотеров, придётся настроить каждого из них.
Всем компьютерам устанавливаются фиксированные IP-адреса. Первому открывается порт 6112, второму — 6113, и т.д.
Соответствующие порты прописываются и в Warcraft'е.
И наконец...
По открытию портов на маршрутизаторах есть отличный сайт: http://portforward.com. Заходите, скорее всего, вы найдёте там гайд именно по вашей модели роутера (правда, по-английски).
Настройка локального брандмауэра
Если NAT'а нет, крайне опасно
заходить в интернет без брандмауэра (ну или соответствующей настройки
служб Windows — настройка по умолчанию рассчитана на локальную сеть,
когда «все друг другу доверяют»). Поэтому стоит прикрыться, а для
Warcraft'а сделать «люк».
Пуск — Панель управления — Брандмауэр Windows — Исключения. Нажимаем
«Добавить программу» и находим war3.exe. Получается примерно так...
Именно war3.exe — а не «Warcraft III.exe», «Frozen Throne.exe» или запускалка пиратского Battle.net.
Вот и всё. Муторная, но важная работа проделана. Наслаждайтесь!