Сегодня я понял, что принципиально не понимаю, как работает портовая связь.
Если я запускаю экземпляр веб-сервера, прослушивающего порт 80, он может отвечать на множество запросов из разных вкладок браузера, все из которых взаимодействуют через порт 80.
Однако я не могу запустить два экземпляра сервера, оба прослушивают порт 80, так как это приводит к конфликту портов.
Я всегда воспринимал это как данность (только один процесс может связываться с определенным портом в любой момент времени), даже не задумываясь об этом - разве несколько процессов не взаимодействуют через порт 80? (то есть, каждая из вкладок работает в браузере?)
По сути, только один процесс может СЛУШАТЬ порт за раз (технически один сокет предназначен для прослушивания). Но порт может обрабатывать множество сокетов, передающих данные, сокет - это комбинация локального IP / порта и удаленного IP-адреса / удаленного порта. Таким образом, как только сервер принимает входящее соединение во время СЛУШАНИЯ, он открывает новый сокет, выделенный для этого разговора, и передает обработку чему-то другому, а затем возвращается к СЛУШАНИЮ.
Браузер соединяется со случайным высоким (например,> 1024) портом на вашем компьютере с портом 80 удаленного сервера. Следовательно, на вашем компьютере нет конфликта портов.
Если вы используете много вкладок для подключения к одному и тому же удаленному серверу (или к серверу подключается много пользователей), все они переходят на один и тот же порт и обслуживаются одним и тем же процессом (то есть веб-сервером сайта).
Сервер, прослушивающий порт 80, НЕ ДОЛЖЕН обрабатывать несколько процессов. Простые TCP-демоны старых лет могли обрабатывать только одно соединение за раз. Вы можете имитировать это поведение, имея такую программу, как netcat
прослушайте определенный порт и попробуйте подключить к нему две машины. Один войдет, другой отскочит без связи. Эти демоны в основном бесполезны, поэтому вы их больше никогда не увидите.
Для чего-то вроде веб-сервера он прослушивает порт напрямую. Следует иметь в виду, что он находится поверх библиотеки сокетов операционной системы. Когда устанавливается новое соединение, библиотека сокетов передает новый сокет программному обеспечению веб-сервера. На этом этапе у программного обеспечения веб-сервера есть несколько опций.
Одна из возможностей состоит в том, что он передает объект-сокет новому потоку в том же процессе. Всякий раз, когда происходит обмен данными через этот сокет, этот поток будет обрабатывать его. Родительский процесс определяет, какие потоки активны в любой момент времени, чего может быть много.
Другая возможность состоит в том, что он запускает новый процесс и передает ему объект сокета. Насколько я понимаю, теперь дело за системой сокетов операционной системы, которая будет обеспечивать связь между этими дочерними процессами и их целями. Родительский процесс по-прежнему имеет некоторый контроль над процессами, например, устранение зависших и других межпроцессных коммуникаций.
Какой из этих подходов более эффективен, зависит от операционной системы. IIRC, Apache может работать в любом режиме.
По сути, библиотека сокетов обеспечивает уровень параллельной обработки для веб-сервера. Он может обрабатывать несколько одновременных подключений, активно передавая данные, одновременно принимая новые подключения.
Для браузера, который может активировать несколько попыток подключения к веб-серверу, чтобы улучшить время загрузки, параллелизм применяется также и на стороне браузера, это хорошо и замечательно. Браузер отслеживает состояние страницы во время ее загрузки, и многочисленные попытки подключения, которые он запускает, являются частью процесса.
Фактически существует два «типа» потоковых сокетов. У одного есть подстановочный знак «другой конец», у другого есть конкретный хост: порт для другого конца.
Никакие два сокета не могут (или, скорее, никогда не должны) иметь одинаковые идентификаторы «этот конец» и «другой конец». Сокет, который «прослушивается» (принимает входящие соединения), имеет подстановочный знак «другой конец», поэтому единовременно может существовать только один. По мере поступления соединений accept
выполняется, возвращая сокет с кортежем host: port для другого конца.
Ваш вопрос напоминает мне меня несколько лет назад до Cisco CCNA - были те же сомнения :)
Во-первых, установка нескольких HTTP-соединений не обязательно зависит от количества вкладок, открытых в вашем браузере. Например, при посещении сайта с рекламой или кодом Google Analytics вы будете подключаться к нескольким сайтам, несмотря на то, что находитесь только на одной вкладке.
В любом случае, когда ваш браузер обменивается данными с веб-сервером, порт назначения трафика, отправляемого на веб-сервер, - это порт 80, а исходный порт - случайное число. Исходный порт должен сообщить веб-серверу, по какому порту он должен связаться с вами. Каждое установленное http-соединение будет иметь собственный порт на вашем компьютере. Попробуйте запустить netstat с несколькими открытыми веб-сайтами, и вы сразу поймете, что я имею в виду.
Вы можете смеяться, но этот book - отличный и быстрый способ познакомиться с основами TCP / IP. Это мне очень помогло.