Браузер анализирует 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 и другие файлы и, наконец, представляет страницу пользователю.