Как работает серверный сокет?
Как работает серверный сокет? Когда я создаю сокет 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? Если это так, разве это не означает, что сервер сможет принимать бесконечное количество соединений?
Ответы
Ответ 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, относящиеся к "Слишком много открытых файлов".