Se o servidor da Web respondeu à sua solicitação de uma porta aleatória, como o seu sistema operacional saberia enviar esse tráfego para o navegador?
Veja como funciona, em geral:
- Seu navegador deseja fazer uma conexão de saída com um servidor, portanto, ele solicita um soquete ao SO.
- A menos que o navegador esteja fazendo algo estranho, não importa qual porta o soquete está usando, então o SO atribui um livre aleatório.
- Para este exemplo, usarei 53904 como nossa porta aleatória no lado do navegador.
- O navegador solicita que o SO conecte esse soquete ao IP do servidor (normalmente encontrado pelo DNS) e porta de escuta (geralmente 80 para HTTP de texto sem formatação ou 443 para HTTPS; ocasionalmente, algo mais especificado na URL).
- Para este exemplo, vamos supor que você está fazendo HTTP em texto simples pela porta 80.
- O sistema operacional envia uma solicitação de conexão TCP (SYN) ao destino especificado pelo navegador, com os seguintes detalhes: IP de origem: o IP da interface de rede; porta de origem: 53904; IP de destino: o IP do servidor; porto de destino: 80 .
- A solicitação TCP é roteada pela (s) rede (s) entre você e o servidor.
- A conversão de endereços de rede (NAT) pode alterar o IP de origem (para o IP do roteador) e a porta (para um endereço aleatório que o roteador mapeia para a conexão original recebida), mas não afeta o destino. / li>
- O roteador que faz o NAT escutará a nova porta "de origem" e converterá o tráfego de resposta em respostas à solicitação original do seu computador.
- Por simplicidade, não vou mais entrar no NAT neste exemplo; vamos supor que tanto o seu endereço quanto o do servidor são IPs publicamente roteáveis exclusivos.
- A solicitação chega na porta 80 do servidor (ou 443 ou qualquer outro). O processo do servidor da web já informou ao sistema operacional do servidor que gostaria de
accept
de conexões TCP de entrada nessa porta. - O sistema operacional do servidor cria e envia uma confirmação (SYN-ACK) em resposta. Ele precisa ter os mesmos detalhes do pacote de entrada, exceto que a origem e o destino são revertidos: IP de origem: o IP do servidor; porta de origem: 80; IP de destino: seu IP; porto de destino: 53904 .
- Essa resposta retorna pela Internet para o seu computador, onde seu sistema operacional está ouvindo para ver se obtém o SYN-ACK na porta 53904 desse endereço IP.
- Há também uma coisa chamada "números de seqüência" e "números de confirmação" que são usados para verificar se a conexão é a que deveria ser e impedir que algum outro computador fingir que é o servidor com o qual você está tentando falar .
- Obviamente, essa proteção contra falsificação (spoofing) do servidor só funciona se o invasor não conseguir observar / interceptar o tráfego que você está enviando. Uma parte significativa do SSL / TLS, a única coisa que adiciona segurança ao HTTPS, é um mecanismo mais robusto para autenticar o servidor.
- Seu sistema operacional obtém o SYN-ACK e responde com seu próprio ACK, invertendo a origem e o destino novamente (ou apenas reutilizando a origem e o destino originais; a mesma coisa).
- Agora que a conexão foi confirmada por ambos os lados, seu sistema operacional permite que seu navegador saiba que agora ele pode enviar dados por meio do soquete.
- O sistema operacional do servidor, agora que recebeu a confirmação de sua máquina (e verificou os números de sequência), cria um novo soquete para ser utilizado pelo software do servidor da web. Esse soquete é usado para comunicar o tráfego para a conexão TCP recém-concluída e está vinculado à porta 80 no IP do servidor e à porta 53904 no seu IP; ele receberá dados e enviará dados da porta 80 .
A partir daí, o navegador e o servidor da web falam HTTP entre si sobre esse canal TCP. Eu não vou entrar nos detalhes disso, no entanto. Isso tudo é apenas para ilustrar por que seu firewall precisa permitir pacotes de entrada originados da porta 80 de um servidor se você quiser obter respostas HTTP desse servidor.