Para responder à sua pergunta de como ele sabe , isso tem a ver com o que o navegador envia ao servidor.
Você está certo de que o sistema sempre o resolve para um endereço IP, mas o navegador envia a URL que você tentou acessar no cabeçalho HTTP.
Aqui está um exemplo de cabeçalho que eu achei on-line, modificado para parecer que você usou o Firefox no Windows e digitou apple.com
na barra de endereço:
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
Aqui está a aparência do cabeçalho se você usasse o endereço 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
Ambos seriam enviados para o mesmo endereço IP em um soquete, mas o navegador informa ao servidor o que ele acessou.
Por quê? Como os servidores da Web com o mesmo endereço IP podem hospedar vários sites e fornecer páginas diferentes para cada um. Ele não pode distinguir quem deseja qual página por endereço IP, porque todos eles têm o mesmo - mas pode distingui-los pelo cabeçalho HTTP.