Один и тот же порт используется и как клиент, и как сервер?

Один и тот же порт используется и как клиент, и как сервер?

Я нахожу что-то странное в этом выводе netstat. Вывод получен с помощью netstat -a -n -o -p TCPкоманды на win 7.

 Proto  Local Address          Foreign Address        State           PID
 TCP    127.0.0.1:55486        127.0.0.1:55487        ESTABLISHED     5808
 TCP    127.0.0.1:55487        127.0.0.1:55486        ESTABLISHED     5808

55486Обратите внимание на эти две строки. И локальный, и внешний адрес — localhost. Но как получается , что порты парные? 55487Какой из двух портов является портом сервера, а какой — портом клиента?

Насколько я понимаю, local-addressстолбец обозначает клиентскую сторону TCP-соединения, а foreign-adressстолбец обозначает серверную сторону. Из этого вывода следует, что один и тот же порт ведет себя как клиентисервер.

Я не понимаю, как это возможно с TCP?

netstat с парными портами

решение1

Линия:TCP 127.0.0.1:55486 127.0.0.1:55487 ESTABLISHED 5808

Сообщает, что клиент подключается к порту 55487 для сервера, в то время как клиент использует порт 55486.

Линия: TCP 127.0.0.1:55487 127.0.0.1:55486 ESTABLISHED 5808

сообщает, что сервер подключается к клиенту через порт 55486 с порта 55487.

Для установления соединения между клиентом и сервером TCP требуется «трехстороннее рукопожатие».

Клиент подключается к серверу (часть 1 трехстороннего рукопожатия). Сервер отвечает подтверждением соединения (часть 2). Клиент отвечает на подтверждение своим собственным подтверждением (часть 3).

TL;DR - Клиент обычно использует случайный порт для подключения к серверу с определенным портом. Сервер отвечает этой машине, используя случайный порт. Клиент и серверНЕТна том же порту.

решение2

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

Вы, очевидно, понимаете концепцию клиента и сервера, поэтому меня удивляет, что вы пишете: «столбец Local Addressобозначает клиентскую сторону TCP-соединения, а Foreign Addressстолбец обозначает серверную сторону». Это неверно; столбец Local Addressобозначаетместныйсторона TCP-соединения, а Foreign Addressстолбец обозначаетиностранный(илиудаленный) сторона. Другими словами, Local Addressстолбец обозначает (TCP) сокет, который процессна твоем компьютереиспользует (т.е. сокет, который ваш компьютервладеет), а Foreign Addressстолбец обозначает сокет, к которому подключен локальный сокет. Как вы, кажется, понимаете, процессы на вашем компьютере могут функционировать как серверы, поэтому локальные сокеты могут быть серверными сокетами — и тогда соответствующий клиентский сокет будет указан как «внешний».

Все начинает путаться, когда клиентский процесс на вашем компьютере подключается к серверному процессу на вашем компьютере. Теперь это одно соединение представляет два локальных сокета — и netstatсообщает одну строку для каждого; один показывает клиента как локальный, а сервер как внешний (хотя на самом деле это локальный сокет), а другой — наоборот.

Ваша ситуация немного более запутанна. Ваш сервер jetty (процесс 5808), конечно, создает сокеты и принимает соединения на них — это то, что делают серверы. Но он создает много сокетов одновременно. (По необходимости они находятся на разных номерах портов; ОС не позволит нескольким сокетам с одинаковым протоколом и номером порта сосуществовать.) И, похоже, он использует случайные (назначенные ОС) номера портов. Например, как вы указали, он прослушивает порт 55484. Я не знаком с jetty, поэтому не знаю, нормально ли это.

Если внимательно изучить netstatвывод, то можно увидеть, что локальный процесс 184, использующий сокет на порту 8081, имеет соединение с процессом 5808 / портом 55482.

Что мне кажется действительно странным, так это то, что процесс 5808 подключилсясебена нескольких из этих сокетов. Таким образом, у вас есть несколько TCP-соединений, где оба сокета удерживаются не просто на одном хосте, нов том же процессе. Я не думаю, что мы можем точно сказать, какой конец является клиентом, а какой сервером. Я бы предположил, что порт с меньшим номером, скорее всего, принадлежит серверу, но это всего лишь догадка.

решение3

Это не необычная ситуация. 127.0.0.1— это действительный IP-адрес, который слушает ваша программа. Программа может прослушивать этот адрес. Программа также может подключаться к этому адресу. Это соответствует архитектуре клиент-сервер. У вас есть клиент и сервер. Они могут находиться на разных компьютерах, но в то же время они оба могут находиться на одном компьютере.

Например, когда вы используете веб-сайт Google, ваш компьютер является клиентом, а веб-сервер Google — сервером. Между вашим компьютером и сервером Google существует соединение.

Вы можете иметь свой собственный веб-сервер, работающий на вашем компьютере и прослушивающий интерфейс 127.0.0.1. Откройте браузер и введите 127.0.0.1- в результате вы увидите веб-страницу с вашего веб-сервера. В этой ситуации netstatбудет показано то же самое.

Чтобы ответить на ваш вопрос:

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

Нет. Один порт клиентский, другой серверный. Обратите внимание - оннесказать

 TCP    127.0.0.1:55486        127.0.0.1:55486        ESTABLISHED     5808

Там говорится:

 TCP    127.0.0.1:55486        127.0.0.1:55487        ESTABLISHED     5808
 TCP    127.0.0.1:55487        127.0.0.1:55486        ESTABLISHED     5808

Что имеет смысл.

Связанный контент