Як сервер отримує сповіщення про 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 розповідає сам NIC, який насправді має власне програмне забезпечення для інтерпретації електричних сигналів по мережевому кабелю (або бездротових сигналів у повітрі тощо, ви розумієте).

Бічна примітка :

Якщо ви хочете дізнатися більше про те, як NIC може ініціювати зв’язок з драйвером / ОС, вам може знадобитися пошук деякої основної інформації про апаратні переривання - в основному все, що в даний час працює процесор, зупинено, і потік програми переходить на переривання рутинна обробка - надзвичайно простий фрагмент коду, який піклується про сповіщення системи, а потім негайно повертає контроль назад до оригінальної речі, яку робив процесор. Насправді це може відповісти на безліч запитань щодо внутрішньої роботи ОС та самого комп’ютера - як, наприклад, як операційна система може «викрасти» ЦП із запущених програм і перемістити ресурси CPU між різними програмами, що працюють одночасно, навіть якщо вони не співпрацюють.

Повернутися до бізнесу:

У ручній аналогії телефону, уявіть, що телефон насправді не дзвонить. Щоб знати, чи є у вас спроба телефонного дзвінка, вам доведеться періодично дивитися на екран і перевіряти. Щоб зробити це простішим керуванням для HTTP-сервера (оскільки там вже досить багато шарів, які роблять цю періодичну перевірку), ви можете фактично заблокувати при спробі перевірки.

Тож замість того, щоб перевірити, побачивши, що там нічого немає, і ще раз перевірити, ви в основному постійно дивитесь на екран. Однак у вас є ціла окрема система для вирішення цього питання (у вашому випадку слуховий центр, який перевіряє коливання повітря на корисну інформацію, дзвінок), тому він насправді не потребує вашої уваги (час процесора).

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


Обережне "пінг" має інше абсолютно не пов'язане значення в роботі в мережі. Крім того, чому ніхто не згадав про "апаратні переривання"?
Лі Лі Райан

1
@LieRyan Ну, так, це в тій частині, де NIC повідомляє драйверу NIC. Це просто відчуває, як крихітна маленька цятка у величезному списку абстракцій, які беруть участь, і насправді, поза людьми, що грають зі старовинною архітектурою, вбудованими пристроями або розробниками драйверів, це, на жаль, досить незрозумілі знання. Але добре, я думаю, додам швидку згадку.
Луань

1
Чи порти є лише номерами? чи це фізичні шпильки на картці NIC? Мені важко уявити, що може бути 65536 портів
Dhiwakar Ravikumar

2
@DhiwakarRavikumar: Так, порти - це просто цифри. Вони складаються програмою або операційною системою, вони не відповідають нічого апаратному.
sleske

1
@DhiwakarRavikumar Порти - це просто цифри, але апаратні переривання насправді використовувались як апаратні штифти на процесорі (тож у вас був інший штифт для "отримав ділку на нуль!", А інший для "будильник дзвонить"). Отже, у вас було лише три-сім різних переривань або таких більшу частину часу. Це можна порівняти зі старими телефонними станціями - раніше вони мали фізичні штифти, до яких вам потрібно було підключитись, щоб здійснити дзвінок, але вони зараз включені в програмне забезпечення, як і порти TCP.
Луань

9

Комп'ютери використовують поняття "порти", аналогічне "розширенням" для телефонного комутатора: Клієнт не лише "викликає" IP-адресу сервера, але й надсилає запит на певний порт на цьому сервері.

Є тисячі портів ( список вікіпедій ), наприклад, порт 80 є типовим для HTTP.

Хитрість полягає в тому, що програма, наприклад веб-сервер, може зареєструватися для прослуховування на певному порті. Тоді ОС передасть будь-які запити, що надходять на цей порт, до цієї програми.

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


Точніше
65535

3

Веб-сервер повідомив про наступний процес

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

Скажімо, веб-сервер слухає порт 80, коли запит від клієнта надходить на порт 80, він прийме з'єднання з системним викликом accept (). Цей виклик зазвичай блокується, поки клієнт не з'єднається з сервером.

Потім прослухайте з'єднання з системним викликом Listen () та прив’яжіть сокет до адреси за допомогою системного дзвінка bind ().

Atlast створює сокет із системним викликом socket ().

Сподіваюся, це допомагає!


0

У вас є каталог / var / log / apache2 із такою директорією:

access.log
error.log
other_vhosts_access.log

Це пов’язано з тим, що ви хочете від клієнта, і як повідомляти, смс, електронною поштою тощо.

Моя пропозиція:

Ви можете створити сервер журналу і надсилати кожен ваш журнал, такий як поштовий сервер, dns-сервер, веб-сервер тощо. Потім ви можете його розібрати, Навіть той же сервер використовує db і ви можете запускати запити.


Дякую за відповідь, але я думаю, ви неправильно зрозуміли моє запитання. Я мав на увазі, коли мені телефонувати, телефон дзвонить. Тож я знаю, що мені зателефонували, тому що в мене задзвонив телефон. Аналогічно, коли клієнт робить запит, як повідомляється веб-сервер?
raj цікаво

0

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

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

Я дав тут дуже поверхневий та макро погляд на те, що відбувається. Щоб отримати точніші відповіді, зачекаємо, доки приїдуть експерти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.