Задача о 17 серверах и сетевом архитекторе - Академия Selectel

Задача о 17 серверах и сетевом архитекторе

Тирекс
Тирекс Самый зубастый автор
15 июля 2026

Будет полезна сетевым инженерам, системным администраторам и всем, кто хочет размять мозг базовой дискретной математикой.

Изображение записи

Условие

В одной придуманной нами компании N сетевой архитектор получил задачу: развернуть изолированный контур из 17 серверов. Для обеспечения отказоустойчивости он решил соединить их напрямую патч-кордами так, чтобы от каждого сервера отходило ровно три кабеля к соседним машинам. Архитектор набросал схему и со спокойной душой ушел домой.

На следующее утро на смену заступил дежурный инженер. Взглянув на ТЗ и схему коллеги, он лишь покачал головой, налил кофе и заявил: «Сеть построить не получится, архитектор где-то просчитался».

Может, дежурный просто вредничает или не хочет обжимать лишние провода? 17 серверов — не так много, а три порта на каждом — стандартное требование для резервирования каналов. Или все-таки инженер прав, и законы математики выше в приоритете, чем фантазия архитектора?

Задача

Вы — старший системный архитектор. Помогите коллегам разобраться, кто прав: архитектор или дежурный инженер? Напишите небольшую программу на Python или другом языке, которая проверяет принципиальную возможность существования подобных сетей для любого количества серверов и соединений.

Решение

Сначала переведем задачу с языка сетевых инженеров на язык математики. Наш тестовый контур — это обычный граф. Серверы выступают в роли вершин, а сетевые кабели — это ребра, которые их соединяют. Количество связей, выходящих из одного сервера, в теории графов называется степенью вершины. Теперь по пунктам:

  • По условию задачи, у нас есть 17 вершин, и степень каждой из них должна быть равна строго 3. Такой граф (где степени всех вершин равны) называется регулярным.
  • Попробуем смоделировать ситуацию и посчитать общее количество портов, которые должны быть задействованы в нашей сети: 17 х 3 = 51.
  • Каждый сетевой кабель имеет два конца. Он втыкается в порт одного сервера и в порт другого. Если мы сложим степени всех вершин графа, мы получим удвоенное количество ребер (кабелей).
  • Фундаментальная теорема теории графов, также известная как лемма о рукопожатиях, утверждает: сумма степеней всех вершин любого графа всегда должна быть четной, так как она равна 2E, где E — количество ребер.
  • В нашем случае сумма степеней равна 51. Но 51 — число нечетное. Если мы попытаемся соединить серверы, у нас физически останется один свободный кабель, который просто некуда будет подключить вторым концом.

Получается, дежурный инженер абсолютно прав: архитектор допустил оплошность, и построить такую сеть физически невозможно.

Решение на Python

Чтобы автоматизировать подобные проверки для будущих проектов дата-центра (например, если серверов станет 100, а связей — 5), напишем лаконичный скрипт на Python.


      def check_network_topology(servers_count, links_per_server):
    total_ports = servers_count * links_per_server

    if total_ports % 2 != 0:
        return False, "Сумма портов нечетная, один кабель останется без пары!"

    if links_per_server >= servers_count:
        return False, (
            "У сервера не может быть соседей столько же или больше, "
            "чем серверов в сети."
        )

    return True, f"Топология возможна. Потребуется ровно {total_ports // 2} кабелей."


servers = 17
links = 3

is_valid, message = check_network_topology(servers, links)
print(f"Результат проверки: {is_valid} ({message})")

Или максимально упростим код.


      def check_network_topology(servers_count, links_per_server):
    total_ports = servers_count * links_per_server

    if total_ports % 2 != 0:
        return False, "Сумма портов нечетная, один кабель останется без пары!"

    if links_per_server >= servers_count:
        return False, (
            "У сервера не может быть соседей столько же или больше, "
            "чем серверов в сети."
        )

    return True, f"Топология возможна. Потребуется ровно {total_ports // 2} кабелей."


servers = 17
links = 3

is_valid, message = check_network_topology(servers, links)
print(f"Результат проверки: {is_valid} ({message})")

Работая со сложностью O(1), программа мгновенно выдает вердикт. Уровень сложности подходит, потому что нам не нужно перебирать варианты — достаточно знать свойства четности.

Заключение

Архитектор признал свою ошибку, извинился перед дежурным и перерисовал схему, добавив в контур 18-й резервный сервер (для четного количества вершин лемма о рукопожатиях отлично работает). Сеть была успешно поднята, а в качестве примирения инженеры заказали пиццу.

Чтобы больше не путаться в базовых алгоритмах и проектировать инфраструктуру без математических ляпов, архитектор сразу же подписался на рассылку Академии Selectel. В ней регулярно выходят полезные разборы задач, статьи про архитектуру сетей и актуальные тренды из мира IT, которые пригодятся специалисту любого уровня.