Faz parte do protocolo HTTP 1.1.
Especificamente, o protocolo HTTP 1.1 inclui um cabeçalho chamado "host:" que especifica qual site em um determinado servidor o cliente está tentando acessar.
Assim, se snoopy.net e woodstock.org compartilharem 192.0.32.10 e seu navegador estiver tentando obter o conteúdo de http://snoopy.net/doghouse
, a solicitação http específica ficaria assim:
GET /doghouse HTTP/1.1
Host: snoopy.net
Se o URL desejado for http://woodstock.org/seeds
, a solicitação será semelhante a
GET /seeds HTTP/1.1
Host: woodstock.org
Em ambos os casos, haveria um soquete TCP entre o seu computador e a porta 80 do servidor. O servidor saberia obter conteúdo de /var/www/snoopy.net ou /var/www/woodstock.org/ com base no cabeçalho do host.
Haverá outros cabeçalhos para cookies e outras coisas como tipo de navegador e conteúdo permitido, mas o cabeçalho "Host" é especificamente o que permite que o servidor da Web saiba qual site virtual é desejado.
Há mais na RFC2616 .
Também é por isso que os sites https * devem *** ter seu próprio endereço IP - a verificação da chave e do intercâmbio de chaves ssl ocorre antes da transação http, portanto, o servidor http não saberá fornecer o certificado para "woodstock.org" ou "snoopy.net" quando recebe uma conexão https na porta 443 de 192.0.32.10.
editar
** nos comentários Grawity indica que há extensões para SSL na especificação TLS que permitem ao servidor saber qual site o usuário está tentando acessar, e que os navegadores da web mais modernos têm essas extensões, então deve ser um pouco strong demais.