Если я использую имя, например «www.example.com», для перехода на веб-страницу, браузер запустится справа налево, просматривая TLD, чтобы найти домен, а затем продолжите. Если я введу IP-адрес этого хоста, как его проанализирует браузер?
4 ответа
Ваш вопрос основан на ошибочном предположении.
Веб-браузер не делает ничего особенного с именем хоста. Он вызовет подпрограмму библиотеки распознавателя, спрашивая: «Эй, у меня есть эта забавная строка; можете ли вы дать мне соответствующий IP-адрес, к которому я могу подключиться?». На практике, вероятно, задействовано несколько уровней косвенного обращения, так что «адресный штрих-код» может просто передать всю строку, введенную пользователем, какой-либо подпрограмме, что в конечном итоге приводит к загрузке запрошенной страницы.
Фактическое разрешение имен обычно обрабатывается процедурами разрешения имен, предоставляемыми библиотекой программ, которые в свою очередь, вероятно, обращаются к операционной системе, которая, в свою очередь, делает запрос DNS и передает его на настроенный сервер распознавателя DNS. Это DNS-сервер распознавания, который разбивает это на части, на которые он может ответить напрямую и следует за любым вовлеченным делегированием. Это означает, что веб-браузер полностью игнорирует этот процесс.
IP-адреса имеют определенную форму: либо n.n.n.n
где каждое n
- это число от 0 до 255, либо IPv6-адрес, заключенный в квадратные скобки [s0m3:add:re::s:s]
. Это можно легко обнаружить программно и обработать как особый случай, просто преобразовав IP-адрес в двоичную форму и используя его для подключения к данному хосту. Существуют готовые библиотечные функции для выполнения таких преобразований, так как это очень распространенный случай - иметь строку, содержащую IP-адрес (предоставленный пользователем, считанный из файла конфигурации или любой другой) и желающий подключиться к нему.
Обратите внимание, что вышеизложенное очень обобщенно. Некоторые операционные системы могут предоставлять функции подключения TCP, которые принимают полностью определенное имя хоста напрямую и выполняют поиск от имени вызывающей стороны; другие могут потребовать от вызывающего абонента сначала найти имя хоста, а затем сделать еще один вызов, чтобы инициировать соединение TCP. Несмотря на это, общий процесс такой же; разница только в том, какой фрагмент кода отвечает за какую часть потока. (И даже если вызов connect может принять имя хоста, в любом случае может быть целесообразным сначала разрешить его в IP-адресе; например, вы можете выбрать, предпочитаете ли вы IPv4 или IPv6, или можете применить настройки прокси.)
На самом деле, браузер не будет анализировать URL справа налево. Он попытается сопоставить его с шаблоном:
scheme://domain[:port]/[path][?query_string][#fragment_id]
Схема рассказывает, как обрабатывать URL. Если это http
или https
, он будет обработан внутри браузера, в противном случае браузер может решить обработать его (например, ftp
) или передать его во внешнее приложение, предоставляемое ОС (например, mailto
, skype
и многие, многие другие).
Когда браузер извлечет доменную часть из URL, он проверит, является ли это уже IP. Если это не так, то он запросит DNS-сервер, чтобы получить IP-адрес сервера.
Обратите внимание, что простая замена доменного имени на IP-адрес сервера не будет работать для большинства веб-сайтов. Это из-за виртуальных хостов. Это механизм, который позволяет вам запускать несколько сайтов на одном IP-адресе. Когда сервер за IP получает запрос HTTP, он проверяет заголовки запроса, чтобы определить, какой веб-сайт клиент хочет видеть. Затем он подает соответствующий документ. Теперь, если сервер 198.51.100.1
настроен на прием только запросов для example.com
, он не будет отвечать на ваш запрос для http://198.51.100.1/
поскольку домен не является example.com
.
Браузер просто подключится к указанному IP-адресу, ничего не нужно разрешать или анализировать.
RFC 3986 определяет, как анализировать и обрабатывать URL-адреса. Разбор IPv4-адреса довольно прост, вам просто нужно:
- Возьмите строку и проверьте, является ли она abcd, где a, b, c и d являются числами в диапазоне 0..255.
- Убедитесь, что не все четыре числа равны нулю. (0.0.0.0 не является допустимым целевым адресом.)
Каждое проанализированное число может быть сохранено в один байт в памяти (отсюда диапазон 0..255). Если вы храните их в памяти с заданным порядком байтов (сетевым порядком байтов), то вы получите 4-байтовую структуру, которая может использоваться сетевыми API.
Обычно браузерам не нужно разбирать адрес самостоятельно, тогда они могут просто вызвать функцию ОС, которая делает это для них. Но необходимо соблюдать осторожность (см. Раздел 7.4 RFC), некоторые функции ОС допускают нотации адресов IPv4, которые не разрешены RFC. Это, например, abc (a, b как 0..255, c как 0..65536) или просто a с a в 0..2 ^ 32-1 (однажды IE поддерживал это, но это может быть проблемой безопасности) ,
Обработка адресов IPv6 очень похожа, но IPv6 обращается к нам: как разделитель, он длиннее и поддерживает более короткую запись с :: вместо: 0: или: 0: 0 :.