Что происходит, когда доступ к файлу PHP осуществляется через браузер?

интервью задняя часть PHP Nginx браузер

Браузер анализирует URL

Стандартный синтаксис URL обычно основан на общем формате, состоящем из 9 частей, и браузер анализирует соответствующий контент из строки URL, введенной пользователем:

<schema>://<user>:<password>@<host>:<port>;<params>?<query>#<frag>

Среди наиболее важных из них:

  • схема - версия протокола
  • хост - адрес хоста
  • Порт - номер порта
  • путь - путь к файлу
  • query - строка запроса query_string

Разрешение доменного имени DNS

если упомянутое вышеhostчастьдоменное имя, вам нужно пройтиDNSразобрать его.

Найти локальный файл hosts

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

разрешение DNS

  • Запросместныйсервер доменных имен
  • местныйСервер доменных имен перенаправляет сообщение запроса накореньсерверы имен и запрос
  • кореньВ соответствии с конкретным адресом доменного имени сервер доменных имен отправляетместныйСервер имен возвращаетсяверхняяАдрес сервера доменных имен
  • местныйсервер доменных именверхняяСервер доменных имен отправляет запрос запроса
  • верхняясервер доменных именместныйСервер имен возвращаетсяразрешениеАдрес сервера доменных имен
  • местныйсервер доменных именразрешениеСервер доменных имен отправляет запрос запроса

Наконец, мы получаем IP-адрес хоста через разрешение DNS.

установить TCP-соединение

трехстороннее рукопожатие

Процесс тройного рукопожатия банален, и информации очень много, поэтому я не буду здесь вдаваться в подробности, а лишь перечислю общий процесс:

  1. Клиент отправляетSYNсообщение, просьба установить соединение
  2. сервер отправитьACKсообщение иSYNсообщение, указывающее, что он согласен с запросом клиента на установление соединения, а также просит установить соединение.
  3. Клиент отправляетACKсообщение о том, что запрос получен

Найдите целевой адрес, используя протокол APR

В Ethernet, когда хост хочет отправить кадр данных на другой хост в той же локальной сети, драйвер устройства должен знать адрес Ethernet для отправки данных. И мы знаем только IP-адрес, затем нам нужно использовать протокол ARP для сопоставления IP-адреса с адресом Ethernet. При отправке первого пакета SYN уровень IP запросит MAC-адрес целевого хоста через протокол ARP. (Протокол TCP/IP — подробное объяснение ARP)

существуетпервое рукопожатиепервое отправлено, когдаSYNПакет сначала пройдетconnect()Функция достигает уровня IP, после чего уровень IP получает MAC-адрес целевого хоста, запрашивая таблицу маршрутизации и кэшируя ее, а затем MAC-адрес будет передан черезsend()Функция передается сетевому интерфейсу для инкапсуляции, и, наконец, данные отправляются.
PS: Статья справочного материала очень подробно объясняет рабочие детали процесса в разных ситуациях, и рекомендуется внимательно прочитать ее.

установить SSL-туннель

Если запрос используетHTTPSСоглашение, после установления TCP-соединения, необходимочетырехстороннее рукопожатиеУстановите зашифрованный туннель поверх него, т.е.SSL.

четырехстороннее рукопожатие

  1. Клиент:
    • ОтправитьНомер версии протокола
    • Отправить методы шифрования поддерживаются
    • генерироватьслучайное число 1(client random) и передать его на сервер
  2. Сервер:
    • Выберите и отправьте метод шифрования для использования
    • Отправить数字证书
    • генерироватьслучайное число 2(server random) и передать клиенту
  3. Клиент:
    • проверять数字证书
    • генерироватьслучайное число 3(premaster secret),использоватьоткрытый ключОн шифруется и передается на сервер
    • использоватьclient random,server random,premaster secretгенерироватьсеансовый ключ(session key)
  4. сервер:
    • использоватьзакрытый ключРасшифруйте зашифрованную строку, чтобы получитьpremaster secret
    • использоватьclient random,server random,premaster secretгенерироватьсеансовый ключ(session key)

Через четырехстороннее рукопожатиеАсимметричное шифрованиетаким образом, чтобы клиент и сервер получали и удерживали одно и то жеsession keyи передать значение ключа следующему процессу сеансаСимметричное шифрование.

Отправить запрос HTTP(s)

Браузер использует информацию, полученную на первых двух шагах, для построения请求报文и отправить HTTP-запрос на сервер через TCP-соединение, установленное на третьем шаге. в,请求报文Основной формат:

<method><request-URL><version>  
<headers>  
<entity-body>

Эти три частистартовая линия,капиталиосновное тело, значение по умолчанию, инициированное запросом браузера, равноGETпросьба, так что нетосновной корпусчасть.
Гипотетическое HTTP-сообщение показано ниже, где первая строкастартовая линия, Два три поведениякапитал:

GET /index.html HTTP/1.1
Accept: text/html
Host: www.foo.com

Прокси-сервер обрабатывает запрос

прокси сервераэтоnginx,apacheи другое серверное программное обеспечение, они будутЗапросы сопоставления с определенными файлами на сервереи обработайте его в соответствии с возвращаемым типом файла.

Возврат статических файлов (.html) напрямую

Если файл типа.html,.txt,.xmlСтатический файл, просто используйте его содержимое в качестве ответаentity-bodyвозвращается непосредственно клиенту.

Разбирать динамические файлы (.php)

Если тип файла.php,.jsp,.aspи другие динамические файлы, их необходимо разобрать. Здесь мы только объясняем.phpФайловые операции to.nginxсервер например.

  • nginx узнает, что это файл .php для обработки
  • nginx вызывает собственныйFast-CGIМодуль, формирующий запросы Fast-CGI.
  • nginx вPHP-FPMотправлять запросы Fast-CGI,На данный момент nginx эквивалентно обратному прокси-серверу
  • PHP-FPMmaster 进程получил запрос
  • мастер назначает запросы конкретнымworker 进程
  • Рабочий процесс использует встроенныйPHP-CGIИнтерпретатор разбирает файл PHP, возвращает результат и формирует ответ nginx
  • nginx получает ответ от PHP-FPM, т.е. статические файлы

Прокси-сервер отвечает на запрос

nginx формирует ответное сообщение и возвращает его клиенту. Единственная разница между ответным сообщением и сообщением запроса заключается в синтаксисе стартовой строки:

<version><status><reason-phrase>
<headers>
<entity-body>

закрыть TCP-соединение

Рассказы о хорошо принятых четырех сессиях махания руками — обычное дело, поскольку соответствующих материалов слишком много, я не буду здесь вдаваться в подробности, а лишь перечислю общий процесс:

  1. Клиент отправляетFINсообщение, указывающее, что все его данные были переданы
  2. возврат сервераACKсообщение о том, что запрос получен
  3. сервер отправитьFINсообщение, указывающее, что все его данные были переданы
  4. возврат сервераACKсообщение о том, что запрос получен и введенTIME_WAITгосударство

Клиент анализирует возвращенный файл

Браузер анализирует возвращенные HTML/CSS/JS и другие файлы и, наконец, представляет страницу пользователю.