Как Minecraft находит LAN-серверы?

Вопрос или проблема

Клиент Minecraft (когда вы входите в режим “multiplayer”) сообщает “Scanning LAN for Local Servers…”

Что он делает?

Вот моя проблема: если компьютер A и компьютер B подключены друг к другу через Switch1, то компьютер A может запустить клиент Minecraft и найти сервер Minecraft на компьютере B. Но если компьютер C подключен через Switch2, C не может видеть сервер на B. Однако C может пинговать B и подключаться к серверу по адресу 10.1.10.143:64134, если напрямую ввести этот IP/порт.

Так что механизм, с помощью которого клиент ищет серверы, как-то блокируется Switch2. Это UPnP? Или что-то подобное?

Это огромная проблема отслеживать изменяющиеся IP-адреса и номера портов каждый раз при запуске сервера Minecraft.

Я сделал несколько захватов пакетов с помощью Wireshark, и насколько я могу судить, он использует пакет IGMPv2, отправленный на редко используемый мультикаст-адрес (224.0.2.60), запрашивая всех, кто запускает сервер Minecraft, ответить. Для этого используется “Membership report”.

Для заинтересованных, вот полная информация о дампе пакета:

Фрейм 10: 46 байт в проводе (368 бит), 46 байт захвачено (368 бит) на интерфейсе 0
    Идентификатор интерфейса: 0 (\Device\NPF_{F0A28F43-6094-447F-A150-434AFC4BB19B})
    Тип инкапсуляции: Ethernet (1)
    Время прибытия: 25 августа 2016 года 22:25:55.171363000 US Mountain Standard Time
    [Смещение времени для этого пакета: 0.000000000 секунд]
    Время эпохи: 1472189155.171363000 секунд
    [Разница времени от предыдущего захваченного фрейма: 0.235431000 секунд]
    [Разница времени от предыдущего отображенного фрейма: 0.235431000 секунд]
    [Время с момента ссылки или первого кадра: 1.234950000 секунд]
    Номер кадра: 10
    Длина кадра: 46 байт (368 бит)
    Захваченная длина: 46 байт (368 бит)
    [Кадр помечен: Ложь]
    [Кадр проигнорирован: Ложь]
    [Протоколы в кадре: eth:ethertype:ip:igmp:igmp]
    [Цветовое правило: Маршрутизация]
    [Строка правила цвета: hsrp || eigrp || ospf || bgp || cdp || vrrp || carp || gvrp || igmp || ismp]
Ethernet II, Src: Giga-Byt_91:9c:dc (fc:aa:14:91:9c:dc), Dst: IPv4mcast_02:3c (01:00:5e:00:02:3c)
    Получатель: IPv4mcast_02:3c (01:00:5e:00:02:3c)
        Адрес: IPv4mcast_02:3c (01:00:5e:00:02:3c)
        .... ..0. .... .... .... .... = бит LG: Глобально уникальный адрес (заводской по умолчанию)
        .... ...1 .... .... .... .... = бит IG: Групповой адрес (мультикаст/широковещательный)
    Источник: Giga-Byt_91:9c:dc (fc:aa:14:91:9c:dc)
        Адрес: Giga-Byt_91:9c:dc (fc:aa:14:91:9c:dc)
        .... ..0. .... .... .... .... = бит LG: Глобально уникальный адрес (заводской по умолчанию)
        .... ...0 .... .... .... .... = бит IG: Индивидуальный адрес (юникаст)
    Тип: IPv4 (0x0800)
Интернет-протокол версии 4, Src: 192.168.1.46, Dst: 224.0.2.60
    0100 .... = Версия: 4
    .... 0110 = Длина заголовка: 24 байта
    Дифференцированное порционное поле: 0x00 (DSCP: CS0, ECN: Not-ECT)
    Общая длина: 32
    Идентификация: 0x4347 (17223)
    Флаги: 0x00
        0... .... = резервный бит: не установлен
        .0.. .... = не фрагментировать: не установлен
        ..0. .... = больше фрагментов: не установлен
    Смещение фрагмента: 0
    Время жизни: 1
    Протокол: IGMP (2)
    Контрольная сумма заголовка: 0x0000 [проверка отключена]
        [Хорошо: Ложь]
        [Плохо: Ложь]
    Источник: 192.168.1.46
    Получатель: 224.0.2.60
    [ГеоIP источника: Неизвестно]
    [ГеоIP получателя: Неизвестно]
    Опции: (4 байта), уведомление маршрутизатора
        Уведомление маршрутизатора (4 байта): маршрутизатор анализирует пакет (0)
            Тип: 148
                1... .... = копировать при фрагментации: Да
                .00. .... = класс: управление (0)
                ...1 0100 = номер: уведомление маршрутизатора (20)
            Длина: 4
            Уведомление маршрутизатора: маршрутизатор анализирует пакет (0)
Протокол управления интернет-группами
    [Версия IGMP: 2]
    Тип: отчет о членстве (0x16)
    Макс. время ответа: 0.0 сек (0x00)
    Контрольная сумма заголовка: 0x07c3 [правильная]
    Мультикаст-адрес: 224.0.2.60

Вот сырой дамп пакета:

0000 01 00 5e 00 02 3c fc aa 14 91 9c dc 08 00 46 00 ..^..<........F.
0010 00 20 43 47 00 00 01 02 00 00 c0 a8 01 2e e0 00 . CG............
0020 02 3c 94 04 00 00 16 00 07 c3 e0 00 02 3c .<...........<

Так что ответ на вашу проблему может быть в том, что мультикасты отключены на вашем маршрутизаторе, или IGMP отключен. Я не до конца знаком с флагами, но похоже, что в поле Options/Router Alert может быть что-то, что говорит маршрутизатору не передавать мультикаст за пределы подсети, но это только предположение.

Я вполне уверен, что принятый ответ неверен. (См. тестированные версии в конце). То, что Minecraft действительно отправляет в режиме "Open to LAN" и слушает, когда говорит "Scanning for games on your local network," это мультикаст UDP-пакет, отправляемый примерно раз в секунду на 224.0.2.60:4445 с сообщением, таким как [MOTD]HostingUserName - WorldName[/MOTD][AD]12435[/AD], где 12345 — это номер порта хоста.

Методология: SysInternals Process Monitor, фильтрация по имени процесса javaw.exe и использование кнопок на панели инструментов для фильтрации только сетевой активности, плюс Wireshark для изучения пакетов. Похоже, что Minecraft не отправляет пакеты IGMP, но этот UDP-пакет отправляется. Я также отправил UDP-пакет вручную в качестве теста, и он был автоматически обнаружен Minecraft.

Проверенные версии Minecraft: 1.21.4, 1.9, 1.7.10, 1.4.7, 1.3.1 (самая ранняя версия с опцией Open to LAN).

Чтобы ответить на вопрос "почему это не работает," Minecraft, похоже, отправляет только на первый активный сетевой интерфейс. Такое поведение вы получаете, когда не привязываете сокет к конкретному сетевому интерфейсу. В моем случае, мой первый активный сетевой интерфейс, перечисленный в ipconfig, был интерфейсом Hyper-V vEthernet, а моя локальная сеть была второй.

PowerShell для отправки сообщения автоматического обнаружения на все сетевые интерфейсы
$payload = '[MOTD]Ваше сообщение здесь[/MOTD][AD]12345[/AD]'

$bytes = [System.Text.Encoding]::UTF8.GetBytes($payload)

foreach ($address in [System.Net.Dns]::GetHostEntry([System.Net.Dns]::GetHostName()).AddressList) {
    if ($address.AddressFamily -ne [System.Net.Sockets.AddressFamily]::InterNetwork) {
        continue
    }

    $udpClient = [System.Net.Sockets.UdpClient]::new()
    $udpClient.Client.Bind(([IPEndPoint]::new($address, 0)))
    [void] $udpClient.Send($bytes, $bytes.Length, '224.0.2.60', 4445)
    $udpClient.Dispose()
}

.

Ответ или решение

Для того чтобы разобраться, как игра Minecraft ищет серверы в локальной сети (LAN), необходимо рассмотреть механизмы сетевого взаимодействия и детали, обеспечивающие её работу. Вопрос на форуме содержит развернутые детали, которые помогут ответить на этот вопрос с точки зрения профессионала в IT.

Теория:

Minecraft, при выборе режима "мультиплеер" и активации опции "Открыть для локальной сети", пользуется механизмом мультикасной рассылки (multicast) для обнаружения серверов в своей локальной сети. В этом процессе важен протокол UDP, который направляет специальные мультикасные пакеты на адрес 224.0.2.60:4445. Эти пакеты содержат метаданные о сервере, такие как имя пользователя-хоста и имя игрового мира, что позволяет клиентам автоматически находить и подключаться к серверам без необходимости вручную вводить IP-адреса и порты.

Механизм мультикасной рассылки используется для широковещательной передачи сообщений в пределах одной локальной сети. IP-адрес 224.0.2.60 принадлежит к диапазону мультикасных адресов IP, который специально зарезервирован для такой цели. В данном конкретном случае Minecraft использует этот механизм для передачи информации о доступных серверах всем устройствам, подключённым к той же сети.

Пример:

Рассмотрим конкретный случай, описанный в вопросе. Когда пользователи жалуются на невозможность обнаружения серверов, первое, что приходит на ум, это проблемы с передачей мультикасных пакетов через сетевые устройства (такие как коммутаторы и маршрутизаторы). Как правило, мультикаст требует поддержания определённых настроек на сетевых устройствах. Например, если коммутатор Switch2 не поддерживает мультикаст или если на нём отключены соответствующие функции, устройства, подключённые через него, не смогут получить мультикасные пакеты от других участников в сети.

В представленном сетевом дампе Wireshark видно, что происходит отправка пакетов IGMPv2, хотя из последующих комментариев становится ясно, что использование IGMP для этой цели может быть неправильным трактованием. Вместо этого Minecraft отправляет UDP-пакеты на указанный мультикасный адрес и порт. Таким образом, если устройство C, подключённое через Switch2, не видит сервера, проблема, вероятно, кроется в неправильной конфигурации сетевого оборудования, мешающей прохождению мультикасных сообщений.

Применение:

Чтобы обеспечить корректную работу детекции серверов в Minecraft, необходимо убедиться, что все компоненты сетевой инфраструктуры правильно настроены для поддержки мультикаста. Проверьте настройки коммутаторов и маршрутизаторов, чтобы подтвердить, что мультикаст разрешён и активирован. Определённые сетевые устройства требуют дополнительных настроек для IGMP Snooping либо для обработки мультикасных сообщений.

Если в сети используется несколько подсетей, убедитесь, что маршрутизаторы поддерживают пересылку мультикасных пакетов между ними, или же убедитесь, что все клиенты и серверы находятся в одной подсети, способной на полную поддержку мультикасной рассылки. Таким образом, клиенты смогут автоматически обнаруживать Minecraft-серверы на локальном уровне без необходимости ручного поиска или ввода IP-адресов.

Также уникальной особенностью Minecraft является то, что он может использовать первое доступное сетевое подключение. Если конфигурация вашей локальной сети предусматривает порядок подключения (например, виртуальные адаптеры стоят выше физически используемых соединений), это также могу привести к затруднениям в обнаружении серверов. Убедитесь, что активное подключение, через которое передаются мультикасные пакеты, действительно доступно всем участникам сети.

Таким образом, подходя к вопросу комплексно – с теоретической точки зрения, экспериментируя и применяя практические решения, можно устранить проблемы с обнаружением серверов Minecraft в LAN и улучшить общий опыт взаимодействия с игрой в локальной сети.

Оцените материал
Добавить комментарий

Капча загружается...