Задать вопрос
Ответы пользователя по тегу Компьютерные сети
  • Как назначить айпи адрес для докер контейнера?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    В настройках сети надо использовать ipvlan драйвер
    Ответ написан
    2 комментария
  • Как открывать много TCP соединений и поддерживать их?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Порт задается 16-битным числом, значит максимальное кол-во портов - 65535.
    Но нужно помнить, что некоторые порты зарезервированы (первые 1023), другие уже могут использоваться.

    Обойти ограничение на кол-во портов ты никак не сможешь, т.к. это потребует изменение ядра ОС и TCP протокола.

    Тут есть несколько возможных решений:
    - Создать древовидную структуру сети, т.е. есть узлы, которые объединяют в себе несколько других (группу) и для отправки ты используешь не порт, а ID узла. Т.е. маршрутизация на стороне приложения
    - Если нужно отправлять пакет всем, то задумайся над броадкастом.
    - Задать предел для размера кластера, либо кол-ва клиентов

    UPD:
    1. Асинхронность из rust тут вообще ни о чем - это фича языка. Главное здесь - возможности ОС
    2. Такое большое кол-во соединений приведет не только к большому потреблению ресурсов, но и большому кол-ву прерываний. Производительность снизится. Рекомендую пересмотреть архитектуру огромного кластера с полносвязной топологией.
    Ответ написан
    1 комментарий
  • Как настроить caprover и docker?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Но, теперь он ругается что у меня закрыт 80 порт, хотя это не так, порты открыл.

    Попробуй убрать пробрасывание портов у nginx.
    Судя по всему Caprover подключается к 80 и 443 портам, которые заняты
    Ответ написан
  • Почему система падает при большом трафике?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Описание проблемы проще чем кажется: чем больше трафика - тем больше работы.
    Это влечет за собой:
    - Больший нагрев процессора и других комплектующих + повышение их износа -> могут отвалиться
    - В каждом софте (даже стабильной ОС) есть ошибки, которые точно возникнут согласно ЗБЧ
    - Появляется слишком много прерываний, которые тормозят систему -> большие операционные издержки (переключение контекста, переход в режим ядра и т.д.)
    - Рано или поздно доступные ресурсы закончатся (ОЗУ, Диск, буфер сетевой карты), а не многие приложения могут такое обработать и упадут

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

    Сколько ресурсов должно быть для корректной работы при определенной нагрузке надо искать самим - тестировать систему (стресс/нагрузочное/объемное и т.д.).
    Создавать математические формулы - такое себе, т.к. слишком много важных параметров не будет учтено:
    - Топология сети
    - Используемые комплектующие
    - Охлаждение
    - Расположение серверов
    - Версия ОС + гипервизор

    UPD: + конечно же когда много трафика, то какие-то пакеты отбрасываются/теряются и необходимо слать их повторно, что увеличивает нагрузку на сеть + задержку запроса
    Ответ написан
    1 комментарий
  • Как исправить ошибку ложного подключения на стороне TcpClient?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Для взаимодействия ты используешь TCP.
    Connect() возвращается, когда установлено соединение, но само соединение все еще может находиться в очереди - то, что здесь и происходит.
    Поэтому, лучше такое решение:

    const int maxPartySize = 2;
    var party = new List<TcpClient>();
    var locker = new object();
    
    var ip = IPAddress.Loopback;
    var port = 50000;
    var server = new TcpListener(ip, port);
    
    server.Start(128);
    Console.WriteLine("Сервер запущен..");
    
    while (true)
    {
        var client = await server.AcceptTcpClientAsync();
        _ = ProcessClientAsync(client);
        Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} подключен. Текущий размер группы: {party.Count}");
    }
    
    async Task ProcessClientAsync(TcpClient client)
    {
        await Task.Yield();
        bool added;
        lock (locker)
        {
            if (added = party.Count < maxPartySize)
            {
                party.Add(client);
            }
        }
    
        if (added)
        {
            Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} добавлен в группу");
        }
        else
        {
            Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} НЕ добавлен в группу");
        }
        
        client.Close();
    }


    P.S. когда принимаешь клиента не нужно писать using TcpClient client = ... иначе клиент закроется до начала его обработки
    Ответ написан
    Комментировать
  • Какие есть программы анализатор скорости интернета?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    У Speedtest есть свое консольное приложение - https://www.speedtest.net/apps/cli
    Сам не пользовался, но есть возможность просмотра результатов в JSON, CSV и других форматах.

    UPD: либо можешь сам замерить с помощью ping - https://stackoverflow.com/a/13043166
    Ответ написан
    Комментировать