Понимание портов: как одновременно взаимодействуют несколько вкладок браузера? [закрыто]

18

Сегодня я понял, что я принципиально не понимаю, как работает связь через порт.

Если я запускаю экземпляр веб-сервера, прослушивающего порт 80, он может отвечать на многие запросы из разных вкладок браузера, все из которых связываются через порт 80.

Однако я не могу запустить два экземпляра сервера, оба прослушивают порт 80, так как это приводит к конфликту портов.

Я всегда воспринимал это как данность (только один процесс может связываться с конкретным портом в любой момент времени), даже не задумываясь об этом - не существует ли нескольких процессов, взаимодействующих через порт 80? (т.е. каждая из вкладок работает в браузере?)

Марти Питт
источник

Ответы:

24

По сути, только один процесс может СЛУШАТЬ на порту одновременно (технически, один сокет выделен для прослушивания). Но порт может обрабатывать множество сокетов, передающих данные, сокет представляет собой комбинацию локального IP / порта и удаленного IP-адреса / удаленного порта. Таким образом, как только сервер принимает входящее соединение во время LISTENing, он открывает новый сокет, выделенный для этого диалога, и передает обработку чему-то другому, а затем возвращается к LISTENing.

Более подробно здесь .

EightBitTony
источник
На самом деле вы можете иметь несколько процессов, прослушивающих один и тот же порт. Например, если вы сделаете это с несколькими читателями udp, вы получите балансировку нагрузки на уровне ядра. Сначала откройте сокет для прослушивания, затем форк и попробуйте recv()в каждом процессе.
viraptor
5
@viraptor: Да, но поскольку UDP не использует соединения, на самом деле нет различия между «прослушиванием» и «получением».
Адам Робинсон
Та же идея работает с TCP, разветвляя процесс с прослушивающим сокетом и acceptp () на обоих.
Вираптор
На самом деле, сокет является только одной «конечной точкой» для связи. Я предполагаю, что вы хотели сказать, что подключенный сокет представляет собой комбинацию локального IP / порта и удаленного IP / адреса / удаленного порта. Слово сокет используется так часто, что мне было трудно понять, каково его настоящее описание
westoque
14

Браузер подключается от случайного порта высокого (т.е.> 1024) на вашем компьютере к порту 80 удаленного сервера. Таким образом, на вашем компьютере нет конфликта портов.

Если вы используете много вкладок для подключения к одному и тому же удаленному серверу (или к серверу подключено много пользователей), они все переходят на один и тот же порт и обслуживаются одним и тем же процессом (т. Е. Веб-сервером сайта).

Павел Бродацкий
источник
2
Это правильный ответ. TCP-соединения имеют номер порта на обоих концах. Оба подключенных компьютера могут различать веб-сайт соединения: браузер 80 <->: 12397 и веб-сайт соединения: браузер 80 <->: 22958.
pjc50
7

Сервер, прослушивающий порт 80, НЕ ДОЛЖЕН обрабатывать несколько процессов. Простые демоны TCP старших лет могли обрабатывать только одно соединение за раз. Вы можете эмулировать это поведение, имея такую ​​программу, как netcatпрослушивание определенного порта и попытка подключить к нему две машины. Один войдет, другой отскочит без связи. Эти демоны в основном бесполезны, поэтому вы их больше не видите.

Для чего-то вроде веб-сервера это прослушивание непосредственно через порт. Следует иметь в виду, что он находится поверх библиотеки сокетов операционной системы. Когда новое соединение установлено, библиотека сокетов передает совершенно новый сокет программному обеспечению веб-сервера. На этом этапе программное обеспечение веб-сервера имеет несколько опций.

Одна возможность состоит в том, что он передает объект-сокет новому потоку в том же процессе. Всякий раз, когда связь происходит через этот сокет, этот поток будет обрабатывать его. Родительский процесс опосредует, какие потоки активны в любой момент времени, что может быть много.

Другая возможность состоит в том, что он запускает новый процесс и передает объект сокета процессу. Насколько я понимаю, теперь дело за системой сокетов операционной системы, обеспечивающей связь между этими дочерними процессами и их целями. Родительский процесс все еще имеет некоторый контроль над процессами, такими как уничтожение зависших и других межпроцессных взаимодействий.

Какой из этих подходов более эффективен, зависит от операционной системы. IIRC, Apache может работать в любом режиме.

По сути, библиотека сокетов обеспечивает уровень параллельной обработки веб-серверу. Он может обрабатывать несколько одновременных подключений, активно передавая данные, одновременно принимая новые подключения.

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

sysadmin1138
источник
+1 за то, что был прав во многих отношениях :)
Майкл Лоуман
2

Существует два типа потоковых сокетов. У одного есть подстановочный знак «другой конец», у другого есть определенный хост: порт для другого конца.

Никакие два сокета не могут (или, скорее, должны когда-либо) иметь одинаковые идентификаторы «этот конец» и «другой конец». Сокет, который «прослушивается» (принимает входящие соединения), - это сокет с подстановочным знаком «другой конец», поэтому может существовать только один сокет за раз. Когда соединения приходят, acceptвыполняется соединение, возвращая сокет с кортежем host: port для другого конца.

Vatine
источник
1

Ваш вопрос напоминает мне о себе несколько лет назад до Cisco CCNA - были те же сомнения :)

Во-первых, установка нескольких HTTP-соединений не обязательно связана с количеством вкладок, которые вы открыли в своем браузере. Например, при посещении сайта с рекламным кодом или кодом Google Analytics вы будете подключаться к нескольким сайтам, несмотря на то, что находитесь только на одной вкладке.

В любом случае, когда ваш браузер обменивается данными с веб-сервером, порт назначения трафика, отправляемого веб-серверу, - это порт 80, а исходный порт - случайное число. Исходный порт должен сообщить веб-серверу, через какой порт он должен с вами связаться. Каждое установленное http соединение будет иметь собственный порт на вашем компьютере. Попробуйте запустить netstat с несколькими открытыми сайтами, и вы сразу поймете, что я имею в виду.

Вы можете смеяться, но эта книга - отличный и быстрый способ познакомиться с основами TCP / IP. Это мне очень помогло.

Amivit
источник