Что происходит, когда вы вводите http://www.cnn.com в браузере?
Взаимодействие между вашим клиентом и веб-сервером можно разделить на следующие компоненты.
Предположения: Вы используете Linux-клиент и пытаетесь подключиться через домашнее кабельное соединение Comcast.
– DNS
– Сетевое взаимодействие
– HTTP
DNS:
DNS-запрос разрешает имя http://www.cnn.com. Сначала Linux-клиент проверит свой кэш демона службы имён (nscd), не кэширован ли этот запрос ранее. Если нет, запрос должен быть отправлен на сервер имён. Это происходит, когда DNS-запрос отправляется на сервер имён, указанный в /etc/resolv.conf на клиенте.
DNS-резолвером обычно является ваш локальный роутер, если вы дома. Роутер перенаправит все DNS-запросы на резолвер, указанный в его конфигурации, который он мог получить от провайдера Comcast. DNS-сервер Comcast перенаправит этот запрос к корневым серверам домена .com. Те, в свою очередь, найдут NS-серверы для cnn.com. Серверы имён cnn.com указываются при регистрации домена через регистратора. Затем запрос отправляется на серверы имён cnn.com, которые найдут http://www.cnn.com в своих зонных файлах и ответят на запрос.
Существуют зонные файлы прямого и обратного просмотра. Файл прямого просмотра сопоставляет имя хоста с IP-адресом.
Существует два типа запросов: рекурсивный и нерекурсивный.
- Рекурсивный запрос — когда клиент запрашивает ответ, который DNS-сервер должен найти и вернуть.
- Нерекурсивный запрос — когда DNS-сервер не возвращает конечный ответ, и клиент должен сам выяснить его, обратившись к следующему резолверу.
Следует помнить, что каждый DNS-сервер может иметь собственный кэш, поэтому в любой момент ответ может прийти из кэша, если он там есть. Кэширование имеет свои особенности, и я расскажу об этом в блоге, посвящённом DNS.
Сетевое взаимодействие:
Сетевое взаимодействие происходит, когда между клиентом и сервером выполняется трёхэтапное TCP-рукопожатие (SYN, SYN-ACK, ACK).
Как только клиент получает IP-адрес из DNS (см. выше), он устанавливает соединение с сервером. В нашем случае клиент использует свою таблицу маршрутизации, чтобы проверить, есть ли запись для сети cnn.com. Если записи нет, клиент отправит запрос на установление соединения (SYN-пакет) на шлюз по умолчанию.
Шлюз по умолчанию делает то же самое: он пытается найти запись для сети назначения, и если не находит, пакет отправляется на его шлюз по умолчанию. Это продолжается до тех пор, пока пакет не достигнет интернет-шлюза, на котором работает BGP. Таблица маршрутизации BGP содержит список всех публичных IP-адресов, выделенных интернет-провайдерами. В ней будет указан публичный IP-адрес cnn.com и путь к нему. Comcast установит адрес назначения пакета соответствующим cnn.com и отправит его через интернет.
Когда пакет достигает http://www.cnn.com, получатель подтвердит SYN-пакет пакетом ACK и также отправит свой собственный SYN. Это вторая часть трёхэтапного рукопожатия (SYN-ACK). Тот же процесс маршрутизации происходит на обратном пути, после чего клиент отправляет ACK, и соединение устанавливается.
Важный вопрос: как клиент определяет, какой хост находится в его сети, а какой — нет? Ответ основан на маске сети (netmask). Например, если IP-адрес клиента — 10.1.1.100, а маска — 255.255.255.0, клиент знает, что диапазон 10.1.1.[0-255] — это его локальная подсеть, а всё остальное — за её пределами.
Клиент использует ARP (Address Resolution Protocol) для определения MAC-адреса, на который нужно отправить пакет на втором уровне (L2). Если шлюз по умолчанию — 10.1.1.1, клиент отправит ARP-запрос: «У кого есть 10.1.1.1?». Этот ARP-запрос услышит роутер, который ответит своим MAC-адресом, и клиент инкапсулирует пакет, указав MAC-адрес роутера.
HTTP:
Как только пакет достигает назначения… Допустим, http://www.cnn.com работает за HTTP-балансировщиком нагрузки. В этом случае балансировщик может использовать режим in-line или DSR.
- In-line означает, что балансировщик обрабатывает все входящие и исходящие соединения между клиентом и HTTP-сервером.
- DSR (Direct Server Return) означает, что входящие соединения могут проходить через балансировщик, но исходящие устанавливаются напрямую между веб-сервером и клиентом. Подробнее об этом будет в моём блоге про балансировщики.
Когда Apache получает входящий запрос на порт 80, он передаёт его либо форкнутому процессу, либо потоку (thread). У Apache есть два режима работы: worker.c и pre-fork. В режиме pre-fork Apache использует заранее созданные (forked) процессы. В режиме worker.c он использует потоки. Потоки потребляют меньше ресурсов, но сложнее в реализации. Поскольку по умолчанию используется pre-fork, допустим, Apache форкнул процесс для обработки нашего запроса.
Если вам задают вопрос: «Что происходит, когда вы вводите адрес в браузере?», вышеизложенное — хорошее начало. В ходе обсуждения вы можете углубиться в определённую тему. Например, в сетевом взаимодействии можно подробнее разобрать различия TCP/UDP и поговорить о протоколах маршрутизации (RIP, OSPF, BGP). В части DNS — рассказать о записи SOA, её значении и других DNS-записях. Также можно обсудить настройку сервера BIND. Что касается HTTP — можно поговорить о настройке Apache, разнице между зашифрованным и незашифрованным трафиком, а также подробнее рассмотреть SSL.