Pelo que entendi, o DNS vincula o nome de domínio ao endereço IP do servidor em que o site está armazenado, isso significa que cada servidor pode conter apenas um site? Caso contrário, como a chamada do endereço IP do servidor saberá qual site eu quero se houver muitos no mesmo servidor?
80
Host:
cabeçalho. No caso de hospedagem compartilhada, o servidor da Web pode ser configurado pelo provedor para lidar com isso de diferentes maneiras (por exemplo, ter um padrão, redirecionar para o provedor etc.).Respostas:
Basicamente: o navegador inclui o nome de domínio na solicitação HTTP, para que o servidor web saiba qual domínio foi solicitado e possa responder de acordo.
Solicitações HTTP
Veja como sua solicitação HTTP típica acontece:
O usuário fornece uma URL, no formulário
http://host:port/path
.O navegador extrai a parte do host (domínio) da URL e a converte em um endereço IP, se necessário, em um processo conhecido como resolução de nomes . Essa tradução pode ocorrer via DNS, mas não precisa (por exemplo, o
hosts
arquivo local em sistemas operacionais comuns ignora o DNS).O navegador abre uma conexão TCP com a porta especificada ou o padrão é a porta 80, nesse endereço IP.
O navegador envia uma solicitação HTTP. Para HTTP / 1.1, é assim:
(O
Host
cabeçalho é padrão e requerido no HTTP / 1.1. Ele não foi especificado na especificação HTTP / 1.0, mas alguns servidores o suportam de qualquer maneira.)A partir daqui, o servidor da web possui várias informações que podem ser usadas para decidir qual deve ser a resposta. Observe que é possível que um único servidor da Web seja vinculado a vários endereços IP.
Host
cabeçalho pelo navegador na solicitação HTTP.Como você deve ter notado, a configuração de hospedagem compartilhada mais comum atualmente coloca vários sites em um único endereço IP: combinação de portas, deixando apenas
Host
a diferenciação entre sites.Isso é conhecido como host virtual baseado em nome no Apache-land, enquanto o Nginx os chama de nomes de servidor em blocos de servidor e o IIS prefere o servidor virtual .
E o HTTPS?
HTTPS é um pouco diferente. Tudo é idêntico até o estabelecimento da conexão TCP, mas depois disso um túnel TLS criptografado deve ser estabelecido. O objetivo é não vazar nenhuma informação sobre a solicitação.
Para verificar se o servidor realmente possui esse domínio, o servidor deve enviar um certificado assinado por terceiros confiáveis. O navegador comparará esse certificado com o domínio solicitado.
Isso apresenta um problema. Como o servidor sabe qual certificado do host (site) enviar, se precisar fazer isso antes que a solicitação HTTP seja recebida?
Tradicionalmente, isso era resolvido com um endereço IP (ou porta) dedicado para cada site que requer HTTPS. Obviamente, isso se torna problemático quando começamos a ficar sem endereços IPv4.
Digite SNI (indicação do nome do servidor). O navegador agora passa o nome do host durante as negociações do TLS, para que o servidor tenha essas informações com antecedência suficiente para enviar o certificado correto. No lado do servidor, a configuração é muito semelhante à forma como os hosts virtuais HTTP são configurados.
A desvantagem é que o nome do host agora é passado como texto sem formatação antes da criptografia e é essencialmente uma informação vazada. Isso geralmente é considerado uma troca aceitável, considerando que o nome do host é normalmente exposto em uma consulta DNS de qualquer maneira.
E se você solicitar um site apenas por endereço IP?
O que o servidor faz quando não sabe qual host específico que você solicitou depende da implementação e configuração do servidor. Normalmente, há um site "padrão", "catchall" ou "fallback" especificado que fornecerá respostas a todas as solicitações que não especificam explicitamente um host.
Este site padrão pode ser seu próprio site independente (geralmente mostrando uma mensagem de erro) ou pode ser qualquer um dos outros sites no servidor, dependendo da preferência do administrador do servidor.
fonte
Eu tenho essa explicação para pessoas que não são de tecnologia.
Jack, Jill e Joe moram em um dormitório e não têm celular.
Na lista telefônica, todos são listados com o mesmo número. (Uma gravação)
Você disca o número e alguém atende o telefone; você diz "eu gostaria de falar com Jill" e você a coloca em risco.
Em vez de um registro A (um número de telefone / endereço IP) na lista telefônica, ele pode apenas dizer "Dormitório X", então você deve procurar mais o número do Dormitório X. Este é um registro CNAME.
Se Jill não estiver disponível, você poderá obter
302 Jill está visitando Peter, ligue para ele
400 Eu não consigo te entender.
451 Você está violando sua ordem de restrição.
500 Nosso sistema de telefonia quebrou.
fonte
Primeiro, você precisa entender que existem vários conceitos distintos aqui.
Não existe um relacionamento individual entre essas coisas. Um servidor pode ter vários endereços IP; vários nomes de host podem apontar para um endereço IP; um nome de host pode apontar para vários endereços IP. Vários sites podem estar com o mesmo nome de host. Um site pode ser espalhado por vários nomes de host.
Antigamente (HTTP 1.0 e anterior), cada nome de host que o servidor desejava manipular de maneira diferente tinha que ter seu próprio endereço IP. Isso foi um desperdício.
O HTTP 1.1 adicionou o
Host
"cabeçalho como um campo obrigatório na solicitação HTTP (IIRC, alguns fornecedores já o apoiaram como uma extensão). Isso informava ao servidor qual nome do host havia sido solicitado e, portanto, permitiu que ele servisse conteúdo diferente para nomes de host diferentes no mesmo Endereço IP. O suporte ao HTTP 1.1 nos clientes agora é onipresente.Infelizmente, o SSL (posteriormente TLS) adicionou uma ruga. O estabelecimento de uma sessão SSL / TLS exige que o servidor apresente um certificado ao cliente que cubra o nome do host solicitado, mas a solicitação HTTP não chega até que a sessão SSL / TLS seja estabelecida.
É possível que um certificado cubra vários nomes de host através do uso do
SubjectAltName
campo ou do uso de curingas noCommonName
campo. No entanto, isso apresenta desafios administrativos, especialmente se os nomes de host envolvidos estiverem em domínios com propriedade diferente.Portanto, o TLS introduziu a extensão "SNI (Server Name Indication)". Com essa extensão, o cliente envia o nome do host solicitado ao servidor durante o procedimento de handshake TLS. O servidor pode então apresentar o certificado apropriado. Infelizmente, enquanto as versões atuais de todas as principais implementações de SSL / TLS oferecem suporte ao SNI, demorou muito tempo para que versões mais antigas deixassem de ser usadas.
fonte
A resposta é um pouco mais complicada do que algumas das respostas. Quando você realiza uma pesquisa de DNS, DEVE obter um endereço IP (
A
registro para IPv4,AAAA
IPv6). Você precisa abrir um soquete pelo TCP / IP para se comunicar ou tudo falhará. Esse endereço pode representar um servidor ou um balanceador de carga. Pode até representar um proxy. Se o host estiver atrás do CloudFlare, por exemplo, o endereço que você recebe é de um servidor CloudFlare. O servidor real está em outro lugar. Isso permite que o host evite problemas como ataques de negação de serviço.A hospedagem virtual é o que você está perguntando (algumas das outras perguntas abordaram isso, mas não em detalhes). A hospedagem virtual pega a solicitação da web e analisa o nome do host (por exemplo, domain.com) para determinar qual site será veiculado. Portanto, no servidor da web HTTP Apache, você teria uma configuração como esta
Isso é simplificado, por exemplo. Portanto, estamos dizendo ao Apache para ouvir na porta 80 de qualquer IP (na máquina virtual moderna que hospeda o IP da sua máquina pode ser diferente do seu IP ativo). Em seguida, dizemos que este é o
domain.com
site e em que diretório ele vive. Podemos então repetir esse bloco repetidamente para dizer ao Apache para lidar com sites diferentes. Todo servidor da web suporta esse tipo de sistema.Outra maneira de lidar com isso seria dizer ao servidor da Web para direcionar todo o tráfego da Web para um único script de programação (por exemplo, PHP, ASP.NET, etc) e, em seguida, esse único script determinará qual site e página exibir.
fonte
Usando o DNS, você pode atribuir tantos nomes a um endereço IP individual quanto desejar (no arquivo de hosts, você pode simplesmente separar cada nome com espaços, por exemplo). Usando um servidor DNS, você também pode atribuir vários endereços IP a um único nome . Não se limita a um relacionamento individual.
Um servidor da web sabe qual site servir examinando o URL solicitado. Ele analisa qual domínio foi solicitado, a porta que foi solicitada e qual protocolo foi usado. Isso não tem nada a ver com o DNS e é tratado pelo protocolo HTTP.
fonte
Servidor da Web tem o conceito de contêiner de host ( aqui está a documentação para o Tomcat, por exemplo). Vários contêineres de host podem ser configurados para o mesmo endereço IP / caixa, atendendo a vários domínios. Os contêineres têm diretórios de trabalho independentes, regiões de autenticação, diretórios de log e coisas assim.
O servidor encontra o contêiner relevante para a nova solicitação, pois o nome do domínio faz parte dessa solicitação HTTP.
Instâncias de servidor da Web completamente diferentes podem compartilhar o mesmo endereço IP, se executadas em portas diferentes. Isso é usado principalmente em vários ambientes de desenvolvimento e teste nos quais os nomes de domínio podem não estar disponíveis, pois o servidor de produção não pode ser executado em uma porta arbitrária.
Por fim, mesmo que o endereço IP estritamente exclusivo seja necessário para um site, uma caixa de servidor geralmente possui vários adaptadores de rede, por isso é configurada para usar vários endereços IP.
fonte
O endereço IP do servidor pode conter vários nomes de domínio diferentes ao mesmo tempo.
Quando você acessa o site, seu navegador envia a solicitação HTTP com o nome de domínio e o servidor pode encontrar quais dados do site devem ser enviados naquele momento.
Chama-se hosts virtuais, tão simples assim :)
Dê uma olhada aqui para obter mais informações sobre DNS e hosts virtuais.
fonte