Я нахожу что-то странное в этом выводе 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?
решение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
Что имеет смысл.