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