Когда клиент подключается к серверу с помощью TCP, для потока TCP создается новый сокет. Остается ли соединение на том же порте, на котором было установлено соединение, или оно изменится на какой-то другой порт?
Меняется ли порт, когда сервер принимает TCP-соединение?
Ответы:
Новый сокет представляет собой концепцию уровня приложения, введенную потому, что для каждого установленного соединения требуется уникальный файловый дескриптор (также отличный от дескриптора прослушиваемого файла), который сопоставляется, но не совпадает с сеансом TCP. Сам сеанс идентифицируется комбинацией адреса источника и пункта назначения и порта. Порт источника (клиента) обычно выбирается случайным образом, а порт назначения (сервер) является портом прослушивания. Дополнительный порт не выделяется.
Сервер использует тот же порт для прослушивания и приема нового соединения и связи с удаленным клиентом.
Приведу пример (в системе 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
, чтобы увидеть состояние порта 500:
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–8_ для клиента, после того, как новый клиент подключился к серверу, он по-прежнему использует порт 500 для связи с клиентом, но с новым дескриптором файла.
Сокет, связанный с новым дескриптором, возвращенным accept
на сервере, будет использовать тот же порт на стороне сервера соединения, что и исходный сокет (при "нормальных" определениях, когда клиент инициирует соединение). Новый сокет будет иметь другой номер клиентского порта (удаленный порт с точки зрения сервера).
<ip1, port1, ip2, port2, tcp>
или<ip1, port1, ip2, port2, http>
? 11.11.2015