Чтобы ответить на ваш вопрос о том, как он знает, это связано с тем, что ваш браузер отправляет на сервер.
Вы правы, что система всегда разрешает его в IP-адрес, но браузер отправляет URL-адрес, к которому вы пытались получить доступ, в заголовке HTTP.
Вот пример заголовка, который я нашел в сети, модифицированный, чтобы выглядело так, как будто вы использовали Firefox в Windows и набрали apple.com
в адресную строку:
GET / HTTP/1.1
Host: apple.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Вот как будет выглядеть заголовок, если вы используете его IP-адрес:
GET / HTTP/1.1
Host: 17.142.160.59
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Оба они будут отправлены на один и тот же IP-адрес через сокет, но браузер сообщает серверу, к чему он обращался.
Зачем? Потому что веб-серверы с одинаковым IP-адресом могут размещать несколько сайтов и давать разные страницы для каждого. Он не может различить, кому нужна какая страница по IP-адресу, потому что все они имеют один и тот же, но он может различить их по заголовку HTTP.