Как сервер получает уведомление о HTTP-запросе?

8

У меня есть общее представление о том, как работает HTTP . Я понимаю, что клиент (веб-браузер) делает запрос, а сервер отвечает обратно на запрос. Однако я не понимаю, как веб-сервер узнает, когда клиент делает запрос?

Если кто-то звонит мне, мой телефон звонит, и я получаю уведомление. Точно так же, как веб-сервер получает уведомление о запросе?

Радж любопытно
источник
2
Как это не повторяется через 5 лет после запуска Super User?
Питер Мортенсен

Ответы:

28

Здесь много слоев. И что немаловажно, многие из них взаимозаменяемы.

Например, у вас может быть сеть с коаксиальным кабелем, Ethernet или Wi-Fi на физическом уровне. HTTP работает поверх всего этого, но у каждого из них есть немного различная обработка полезной нагрузки, отправляемой вокруг.

HTTP работает поверх другого протокола, называемого TCP, который, в свою очередь, более или менее работает поверх еще одного протокола, называемого IP (в настоящее время в основном в двух вариантах - IPv4 и IPv6).

Таким образом, HTTP-сервер регистрирует IP-адрес (например 184.38.45.1, или чаще всего «любой») вместе с TCP-портом ( 80по умолчанию для HTTP, но, в общем, что угодно, начиная 1с 65535) в операционной системе. Теперь HTTP-сервер сообщает ОС пропинговать его, когда приходят данные (или другое сообщение). ОС знает, когда это произойдет, потому что драйвер сетевой карты сообщает об этом. А драйвер сетевого адаптера получает информацию от самого сетевого адаптера, который на самом деле имеет собственное программное обеспечение для интерпретации электрических сигналов на сетевом кабеле (или беспроводных сигналов в воздухе и т. Д., Вы поймете).

Примечание стороны :

Если вы хотите узнать больше о том, как NIC может инициировать связь с драйвером / ОС, вам может потребоваться просмотреть некоторую основную информацию о аппаратных прерываниях - в основном, независимо от того, что процессор в данный момент делает, останавливается, и поток программы переключается на прерывание. подпрограмма обработчика - чрезвычайно простой кусок кода, который заботится об уведомлении системы, а затем немедленно возвращает управление обратно к исходной вещи, которую делал процессор. Фактически, это может ответить на многие вопросы о внутренней работе ОС и самого компьютера - например, как операционная система может «красть» ЦП из запущенных приложений и перетасовывать ресурсы ЦП между различными приложениями, работающими одновременно, даже если они не сотрудничают.

Вернемся к делу:

В своей телефонной аналогии представьте, что ваш телефон на самом деле не звонит. Чтобы узнать, если у вас есть попытка телефонного звонка, вам придется периодически смотреть на экран и проверять. Чтобы упростить управление для HTTP-сервера (поскольку эта периодическая проверка уже выполняется довольно многими слоями), вы можете заблокировать попытку проверки.

Таким образом, вместо проверки, видя, что там ничего нет, и проверки снова, вы в основном все время смотрите на экран. Тем не менее, у вас в основном есть отдельная система для обработки этого (в вашем случае, слуховой центр, который проверяет вибрации воздуха на предмет полезной информации, звон), так что на самом деле он не требует вашего внимания (время процессора).

Это еще более улучшено с помощью методов, которые позволяют вам контролировать много соединений одновременно (IOCP). Это все ближе и ближе к системе телефонных звонков - у вас есть комната с десятью тысячами телефонов, но вы заботитесь только о тех, которые звонят в данный момент, другие не привлекают вашего внимания.

Luaan
источник
Осторожность, "пинг" имеет другое совершенно не связанное значение в сети. Кроме того, почему никто не упомянул «аппаратные прерывания»?
Ли Райан
1
@LieRyan Ну, да, это та часть, где NIC сообщает драйверу NIC. Это просто похоже на крошечное пятнышко в огромном списке абстракций, которые вовлечены, и действительно, к сожалению, за пределами людей, играющих со старыми школьными архитектурами, встроенными устройствами или разработчиками драйверов, это довольно туманное знание. Но я думаю, я добавлю краткое упоминание.
Луаан
1
Порты это просто цифры? или это физические контакты на карте NIC? Мне трудно представить, что там может быть 65536 портов
Dhiwakar Ravikumar
2
@DhiwakarRavikumar: Да, порты это просто цифры. Они состоят из программы или операционной системы, они ничего не соответствуют в аппаратном обеспечении.
Слеське
1
@DhiwakarRavikumar Порты - это просто числа, но аппаратные прерывания фактически были аппаратными выводами на процессоре (поэтому у вас был другой вывод для «получил деление на ноль!» И другой для «будильник звонит»). Таким образом, у вас было всего три или семь разных прерываний или почти столько же времени. Это сравнимо со старыми телефонными станциями - на самом деле они имели физические контакты, которые вы должны были подключить, чтобы совершать вызов, но в настоящее время они подключены в программном обеспечении точно так же, как порты TCP.
Луаан
9

Компьютеры используют концепцию «порты», аналогичную «добавочным номерам» для телефонного коммутатора: клиент не только «вызывает» IP-адрес сервера, но и отправляет запрос на определенный порт на этом сервере.

Существуют тысячи портов ( список википедии ), например, порт 80 по умолчанию для HTTP.

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

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

JG-Фауст
источник
65 535 портов, если быть точным
ub3rst4r
3

Веб-сервер уведомлен с помощью следующего процесса

Accept ()
Liseten()
bind()
socket()

Скажем, веб-сервер прослушивает порт 80, когда запрос от клиента приходит на порт 80, он примет соединение с системным вызовом accept (). Этот вызов обычно блокируется, пока клиент не соединится с сервером.

Затем прослушайте соединения с помощью системного вызова listen () и привяжите сокет к адресу с помощью системного вызова bind ().

Atlast создает сокет с помощью системного вызова socket ().

Надеюсь это поможет!

vembutech
источник
0

У вас есть каталог / var / log / apache2 со следующим каталогом:

access.log
error.log
other_vhosts_access.log

Это связано с тем, что вы хотите от клиента, и как уведомлять, смс, электронная почта и так далее.

Мое предложение:

Вы можете создать сервер журналов и отправлять каждый свой журнал, такой как почтовый сервер, DNS-сервер, веб-сервер и т. Д. Затем вы можете проанализировать его. Даже тот же сервер использует БД, и вы можете выполнить запрос.

Персидский залив
источник
Спасибо за ответ, но я думаю, вы неправильно поняли мой вопрос. Я имел в виду, когда мне звонят, мой телефон звонит. Я знаю, что мне позвонили, потому что зазвонил телефон. Точно так же, когда клиент делает запрос, как веб-сервер уведомляется?
Радж любопытно
0

Я думаю, веб-сервер регистрирует функции обратного вызова с портом.

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

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

Царь я царь
источник