Как именно работает серверный сокет? - PullRequest
12 голосов
/ 07 сентября 2010

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

Ответы [ 5 ]

3 голосов
/ 07 сентября 2010

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

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

3 голосов
/ 07 сентября 2010

Значит, все они действительно подключены к моему серверу в 1234?

Да

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

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

2 голосов
/ 07 сентября 2010

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

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

Если вы не видите подключенные сокеты с помощью netstat, возможно, это потому, что вы не вызываете его с правильными опциями. У вас должно быть одно соединение LISTEN на порту сервера и одно УСТАНОВЛЕННОЕ соединение с выделенным локальным портом для каждого активного удаленного соединения. Вы также можете иметь некоторые остатки разорванного соединения (плохо разорванного) с состоянием ВРЕМЕНИ ОЖИДАНИЯ.

Ниже приведена выдержка из текущего состояния моей системы (получено с 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 (десятая часть тысяч) и даже больше из других систем.

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

1 голос
/ 07 сентября 2010

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

0 голосов
/ 07 сентября 2010

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

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