2

я нахожу что-то странное в этом выводе 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

Пожалуйста, обратите внимание на эти две строки. как локальный, так и внешний адрес является localhost. но почему порты связаны? из двух портов 55486 и 55487 какой является портом сервера, а какой - клиентским?

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

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

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

3 ответа3

3

Строка: 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.  Я не знаком с причалом, поэтому я не знаю, нормально ли это.

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

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

0

Это не необычная ситуация. 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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .