1

Если я, на OS X,

  1. Запустите Firefox.
  2. Запустите Google Chrome.
  3. Запустите сервер Ruby on Rails на порту 80 (используя RVM)

    rvmsudo rails -p 80
    
  4. Используйте lsof, чтобы посмотреть, что работает на порте 80

    sudo lsof -i:80
    

Затем я вижу "ruby", "firefox" и "Google" в выводе.

Я все время слышу, что только один процесс может прослушивать порт. Как все они могут использовать порт 80 одновременно? Чем Firefox и Chrome используют порт в отличие от того, как Rails использует этот порт?

3 ответа3

1

Изучив и попробовав sudo lsof -i и sudo lsof -iTCP и прочитав:«Используют ли веб-браузеры разные исходящие порты для разных вкладок?Msgstr ", я думаю, что я неправильно читаю вывод из lsof .

Вот пример:

$ sudo lsof -iTCP:80
COMMAND  PID  USER      FD  TYPE     DEVICE  SIZE/OFF  NODE NAME
...
firefox xxxx  user  xxxxxx  IPv4  xxxxxxxxx    xxxxxx   TCP 192.168.0.100:12345->stackoverflow.com:http (ESTABLISHED)

Глядя на этот пример и другие выходные данные sudo lsof -i я думаю, что довольно ясно, что эта строка из Firefox появляется в выходных данных, потому что Firefox подключается к порту 80 на удаленном сервере, с локального порта 12345. Firefox не подключается к удаленному серверу с локального порта 80.

Я не знаю, возможно ли для клиента, как Firefox, подключиться с порта 80, в то время как локальный сервер прослушивает порт 80, но то, что здесь происходит, по крайней мере, не оспаривает эту идею, потому что это не то, что Firefox делает.

sudo lsof -i:80 -s TCP:^LISTEN показывает подключения к порту 80 на удаленных компьютерах, если только локальный клиент не использует локальный порт 80 для подключения к чему-либо. Странно, что нет возможности просто указать, какие локальные порты используются.

0

Обычно все браузеры (на стороне клиента) подключаются к порту 80 на веб-сервере (на стороне сервера). Таким образом, на стороне сервера только порт 80 находится в состоянии прослушивания. Браузеры используют любое TCP-соединение с портом 80 на веб-сервере.

-1

Краткий ответ: a port cannot be shared

Поскольку у вас есть только один IP-адрес, и вы можете получать большое количество данных, приходящих к вам в одно и то же время, порты используются для отправки данных в процесс, предназначенный для их получения. Это приводит нас к первой строке: ports cannot be shared .

Процессы на стороне сервера имеют определенный порт, и они никогда не изменят его, если вы не сделаете этого, но, с другой стороны, клиент просто открывает случайный высокий порт и подключается к серверу. Этот порт может быть использован снова, но тот же процесс снова или нет, но вы никогда не знаете, и это не имеет значения.

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