Как за кулисами выполняется распределение портов в zmq?

Я некоторое время изучал zmq и реализовал упрощенный poc, чтобы имитировать дизайн моей инфраструктуры, используя его (в частности, используя оболочку NetMQ), с отличными результатами.

Моя ситуация такова:

В будущем я планирую запустить несколько клиентов на одном компьютере, где каждый клиент должен взаимодействовать с «сервером» (расположенным на другом компьютере) через несколько сокетов.

Я заметил, что для каждого сокета, который я объявляю и открываю явно, многие другие открываются внутри zmq и управляются им.

Изменить

сокеты привязки получают новый порт, выделенный в динамическом диапазоне, и это нормально,

но хотя мой клиент явно подключается только к 2 портам, zmq автоматически выделяет для него 15 портов.

я боюсь, что это может в конечном итоге привести к нехватке портов, ситуации, которую я очень хочу избежать.

Вопросы:

  1. Как zmq распределяет порты внутри и каково соотношение между явно объявленными сокетами и портами, которые zmq открывает автоматически?

  2. Есть ли способ управлять распределением портов программно, через конфигурацию или любым другим способом?

  3. Как использование опроса влияет на использование портов?

Tnx,


person barakcaf    schedule 10.08.2015    source источник
comment
Это звучит немного так, как если бы это не сломалось, не исправить ситуацию. Если вы тестируете свое приложение на большом количестве клиентов, столкнетесь ли вы с проблемой? Если настроить макс. количество открытых файлов, доступных в системе и в вашем приложении, исчезла ли проблема?   -  person larsks    schedule 10.08.2015
comment
я отредактировал вопрос - в настоящее время у меня есть poc, прежде чем двигаться дальше, я хочу поймать возможные препятствия. это потенциально может быть большим, я хотел бы избежать заранее, если это возможно   -  person barakcaf    schedule 10.08.2015


Ответы (1)


Когда вы создаете сокет на zeromq/netmq в Windows, выделенный сокет используется для передачи сигналов между потоком ввода-вывода и пользовательским потоком, этот сокет занимает два порта. если вы вызываете bind, вы связываете другой порт с выбранным портом.

Выделенный сокет использует динамический диапазон портов (netmq), поэтому, если вы будете держаться подальше от этого диапазона, у вас не возникнет никаких проблем.

Динамический диапазон портов для Windows Vista и выше: от 49152 до 65535.

код подсчета портов:

static void Main(string[] args)
{
    var id = Process.GetCurrentProcess().Id;

    using (var context = NetMQContext.Create())
    {
        List<NetMQSocket> sockets = new List<NetMQSocket>();

        NetMQSocket server = context.CreateDealerSocket();
        server.Bind("tcp://localhost:6666");

        int i= 0;
        while (true)
        {
            var client = context.CreateDealerSocket();
            client.Connect("tcp://localhost:6666");

            sockets.Add(client);

            Thread.Sleep(1000);                                       

            ProcessStartInfo startInfo = new ProcessStartInfo("NETSTAT.EXE", "-a -o");
            startInfo.RedirectStandardOutput = true;
            startInfo.UseShellExecute = false;
            startInfo.CreateNoWindow = true;

            Console.WriteLine("Calculating taken ports...");

            Process process  = Process.Start(startInfo);                    
            int portCounter = -7; // start with minus 4 for framework and server socket

            while (!process.StandardOutput.EndOfStream)
            {
                if (process.StandardOutput.ReadLine().Contains(id.ToString()))
                {
                    portCounter ++;
                }
            }

            Console.Clear();
            Console.WriteLine("{0} sockets takes {1} ports, avg of {2} ports per socket", sockets.Count, portCounter, portCounter / sockets.Count);
            Console.WriteLine("Press enter to create another socket");

            Console.ReadLine();
        }
    }
}
person somdoron    schedule 10.08.2015
comment
я заметил, что когда я подключаюсь к сокету (а не только к привязке), также открываются дополнительные порты (в диапазоне динамических портов) - если у меня много долго работающих клиентов, и каждый открывает много портов, нет ли опасности исчерпания портов? - person barakcaf; 10.08.2015
comment
так что да, каждый сокет занимает 2 порта из динамического диапазона. У вас возникнут проблемы только в том случае, если вы откроете более 8191 сокетов. - person somdoron; 10.08.2015
comment
я читал ваш блог и многому научился из него (вы автор NetMQ?), я отредактировал свой вопрос, чтобы он был более конкретным, пожалуйста, ответьте, если можете - person barakcaf; 11.08.2015
comment
спасибо, я основатель. Я не думаю, что 15 портов заняты. Когда вы выделяете сокет, вы берете 2, а инфраструктура netmq берет еще 4, но только для первого сокета. поэтому, если вы создаете больше сокетов, каждый из них должен иметь 2 дополнительных порта. при подключении нужен еще один порт по схеме tcp (тоже из динамического диапазона) и серверу тоже нужен еще один. Таким образом, в нижней строке 3 порта для каждого подключаемого сокета и еще 1 на стороне сервера для каждого подключенного сокета. - person somdoron; 11.08.2015
comment
Я не уверен, что понял, опросы по использованию портов? - person somdoron; 12.08.2015
comment
да, они влияют на использование порта? требует ли использование пула в сокете дополнительного выделения портов? - person barakcaf; 12.08.2015