Мой веб-сервер и веб-браузер используют порт 80 одновременно

997
David Winiecki

Если я, на 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 использует этот порт?

1
Как вы пришли к выводу, что перечисленные порцессы действительно _listen_ на вашем _local_ порту 80? Run CMD 8 лет назад 1
Я знаю, что Rails прослушивает (через WEBrick), потому что это веб-сервер, и я могу отправлять запросы из веб-браузера на сервер Rails через порт 80, используя, например, URL http: // localhost / David Winiecki 8 лет назад 0
Тем не менее, я думаю, что был неправ, что Firefox и Chrome вообще используют порт 80 _local_. David Winiecki 8 лет назад 0

3 ответа на вопрос

1
David Winiecki

После изучения и попытки sudo lsof -iи sudo lsof -iTCP, и чтения «веб - браузеры используют различные исходящие порты для различных вкладок делать?» Я думаю, что я просто читаю вывод 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 для подключения к чему-либо. Странно, что нет возможности просто указать, какие локальные порты используются.

Для одного порта в одном экземпляре операционной системы может существовать только один дескриптор сокета. Однако использование понятия «процессы» здесь неточно, поскольку этот дескриптор можно использовать совместно с дочерними процессами. Очевидно, что основная идея заключается в том, что не требуется никакой дополнительной дискриминации над транспортным уровнем, что имеет смысл, поскольку оно неэффективно. Операционная система не будет ассоциировать более одного дескриптора сокета с локальным портом (см. «Man 3posix connect»). Кроме того, номера портов на стороне клиента обычно начинаются с 1000 уже по соглашению, чтобы отличать их от портов на стороне сервера. Run CMD 8 лет назад 1
Кроме того, случайный порт, который использует приложение (браузер запрашивает порт у ОС), будет иметь высокий диапазон, безусловно, выше 1024. Arjan 8 лет назад 0
0
vembutech

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

-1
sysfiend

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

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

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

Это не очень хороший способ выразить это. Строго говоря, кортеж (локальный IP-адрес, локальный порт TCP, удаленный IP-адрес, удаленный порт TCP) должен быть уникальным. Конечно, некоторые реализации могут накладывать больше ограничений для простоты. Daniel B 8 лет назад 0