Подтвердить что ты не робот

Как работает серверный сокет?

Как работает серверный сокет? Когда я создаю сокет Java-сервера и принимаю соединение на порту 1234. Действительно ли сервер использует порт 1234 для всех клиентов? Я прочитал, что когда вы пишете сетевой сервер, сокет фактически открывает другой порт после того, как соединение будет принято.

Это правда? Если да, то почему я не вижу его в netstat? Я вижу много соединений вроде этого

tcp        0      0 ::ffff:MY_IP:1234 ::ffff:97.37.134.95:39236   ESTABLISHED 
tcp        0      0 ::ffff:MY_IP:1234 ::ffff:89.204.153.101:26117 ESTABLISHED 
tcp        0      0 ::ffff:MY_IP:1234 ::ffff:195.240.16.70:26193  ESTABLISHED 
tcp        0      0 ::ffff:MY_IP:1234 ::ffff:80.187.98.116:15012  ESTABLISHED 
tcp        0      0 ::ffff:MY_IP:1234 ::ffff:218.78.248.190:30794 ESTABLISHED 

Так они действительно все подключены к моему серверу в 1234? Если это так, разве это не означает, что сервер сможет принимать бесконечное количество соединений?

4b9b3361

Ответ 1

Так они действительно все связаны с моим сервер на 1234?

Да

Если это так, разве это не значит, что вы сервер сможет принимать бесконечные количество соединений?

У вас могут быть 2 ^ 32-2-1 (IP4) адреса (оставьте один свободный, чтобы иметь другой хост в той же сети) и 2 ^ 16 удаленных портов сокетов. Это много, но не бесконечно. В любом случае у вас не хватит памяти раньше.

Ответ 2

Сокеты TCP/IP уникально идентифицируются кортежем (локальный адрес, локальный порт, удаленный адрес, удаленный порт).

Это обеспечит очень большое количество сокетов, но не бесконечно.

Ответ 3

Да, вы в основном правы.

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

Если вы не видите подключенные сокеты с помощью netstat, это, вероятно, потому, что вы не вызываете его с правильными параметрами. У вас должно быть одно соединение LISTEN на порте сервера и одно соединение ESTABLISHED с выделенным локальным портом для каждого активного удаленного соединения. Вы также можете иметь некоторые остатки завершенного соединения (плохо завершенного) с состоянием TIME WAIT.

Ниже приведена часть из моего текущего текущего состояния системы (полученная с netstat -anlp в Linux)

tcp        0      0 0.0.0.0:3389            0.0.0.0:*               LISTEN      27002/rdpproxy  
tcp        0      0 10.10.4.185:3389        10.10.4.13:36725        ESTABLISHED 27233/rdpproxy  

Сервер 10.10.4.185 и прослушивает порт 3389. Любой удаленный IP-адрес и удаленный порт могут подключаться.

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

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

Ответ 4

да, сервер может принимать любое количество подключений на одном порту. Это разница между сервером и клиентским сокетом, клиентский сокет может иметь только одно соединение на порт.

Ответ 5

Это не бесконечно. Существует предел. В операционных системах на базе Unix команда ulimit сообщит вам максимальное количество "открытых файлов", которые может иметь процесс, а также позволит вам изменить его. Если вы превысите этот предел, вы начнете видеть IOExceptions, относящиеся к "Слишком много открытых файлов".