Браузер анализирует 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-соединение
трехстороннее рукопожатие
Процесс тройного рукопожатия банален, и информации очень много, поэтому я не буду здесь вдаваться в подробности, а лишь перечислю общий процесс:
- Клиент отправляет
SYN
сообщение, просьба установить соединение - сервер отправить
ACK
сообщение иSYN
сообщение, указывающее, что он согласен с запросом клиента на установление соединения, а также просит установить соединение. - Клиент отправляет
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(
client random
) и передать его на сервер
- Сервер:
- Выберите и отправьте метод шифрования для использования
- Отправить
数字证书
- генерироватьслучайное число 2(
server random
) и передать клиенту
- Клиент:
- проверять
数字证书
- генерироватьслучайное число 3(
premaster secret
),использоватьоткрытый ключОн шифруется и передается на сервер - использовать
client random
,server random
,premaster secret
генерироватьсеансовый ключ(session key
)
- проверять
- сервер:
- использоватьзакрытый ключРасшифруйте зашифрованную строку, чтобы получить
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-FPM
master 进程
получил запрос - мастер назначает запросы конкретным
worker 进程
- Рабочий процесс использует встроенный
PHP-CGI
Интерпретатор разбирает файл PHP, возвращает результат и формирует ответ nginx - nginx получает ответ от PHP-FPM, т.е. статические файлы
Прокси-сервер отвечает на запрос
nginx формирует ответное сообщение и возвращает его клиенту. Единственная разница между ответным сообщением и сообщением запроса заключается в синтаксисе стартовой строки:
<version><status><reason-phrase>
<headers>
<entity-body>
закрыть TCP-соединение
Рассказы о хорошо принятых четырех сессиях махания руками — обычное дело, поскольку соответствующих материалов слишком много, я не буду здесь вдаваться в подробности, а лишь перечислю общий процесс:
- Клиент отправляет
FIN
сообщение, указывающее, что все его данные были переданы - возврат сервера
ACK
сообщение о том, что запрос получен - сервер отправить
FIN
сообщение, указывающее, что все его данные были переданы - возврат сервера
ACK
сообщение о том, что запрос получен и введенTIME_WAIT
государство
Клиент анализирует возвращенный файл
Браузер анализирует возвращенные HTML/CSS/JS и другие файлы и, наконец, представляет страницу пользователю.