Меняется ли порт, когда сервер принимает TCP-соединение? - PullRequest
21 голосов
/ 08 июня 2010

Когда клиент подключается к серверу по протоколу TCP, для потока TCP создается новый сокет. Соединение остается на том же порту, на котором было установлено соединение, или оно было изменено на другой порт?

Ответы [ 3 ]

20 голосов
/ 08 июня 2010

Новый сокет представляет собой концепцию прикладного уровня, представленную потому, что каждому установленному соединению необходим уникальный файловый дескриптор (также отличный от дескриптора прослушивающего файла), который сопоставляется, но не совпадает с сеансом TCP. Сам сеанс идентифицируется комбинацией адреса источника и получателя и порта. Порт источника (клиента) обычно выбирается случайным образом, а порт назначения (сервера) является портом прослушивания. Дополнительный порт не выделен.

6 голосов
/ 08 июня 2010

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

4 голосов
/ 25 октября 2018

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

Позвольте мне привести пример (в системе Linux):

Сначала начните http server с python:

xiongyu@ubuntu:~$ sudo python -m SimpleHTTPServer 500
Serving HTTP on 0.0.0.0 port 500 ...

Повторное использование команды nc для подключения к http server, здесь мы запускаем два клиента:

xiongyu@ubuntu:~$ nc 0.0.0.0 500

Используйте netstat, чтобы увидеть состояние порта 5000:

xiongyu@ubuntu:~$ netstat -natp |grep ':500'
tcp    0      0 0.0.0.0:500         0.0.0.0:*          LISTEN      54661/python
tcp    0      0 127.0.0.1:51586     127.0.0.1:500      ESTABLISHED 57078/nc
tcp    0      0 127.0.0.1:51584     127.0.0.1:500      ESTABLISHED 54542/nc
tcp    0      0 127.0.0.1:500       127.0.0.1:51586    ESTABLISHED -
tcp    0      0 127.0.0.1:500       127.0.0.1:51584    ESTABLISHED 54661/python

Как видите, http-сервер использует для клиента порт от 500 до LISTEN, после подключения нового клиента к серверу он все еще использует порт 500 для связи с клиентом, но с новым дескриптором файла. 1019 *

...