Os navegadores da Web usam portas de saída diferentes para guias diferentes?

58

Em um navegador da web que oferece suporte a várias guias, como o Firefox, guias diferentes que vão para domínios de sites diferentes usam uma porta dedicada para cada domínio ?.

Ou o navegador usa uma única porta para gerenciar todas as guias e, portanto, todos os domínios?

yoyo_fun
fonte
Os navegadores usam 2 portas ao se conectar a sites, 80 são para conexões http e 443 são para conexões https. en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
Moab
7
Conheço as portas usadas para conectar ao servidor, mas estava pensando nos números de porta usados ​​para conectar-se a partir do cliente (computador host).
precisa saber é o seguinte
2
Eu acho que o termo "portas de saída" é impreciso. As portas são bidirecionais. Talvez você possa dizer. "portas locais". As portas locais são usadas como portas de origem (de saída) para enviar solicitações e portas de destino (de entrada) para receber respostas.
21316 Ron Maupin
6
As portas são atribuídas pelo sistema operacional e a cada nova conexão é atribuída uma nova porta local para torná-la distinta de todas as outras conexões abertas.
precisa saber é o seguinte
11
@ExUmbris: Essa pode ser uma estratégia simples e sensata, mas as conexões TCP são identificadas pelo quad {IP local, porta local, IP remoto, porta remota}. A porta local não é necessária para a exclusividade, o que é uma coisa boa: o servidor da Web não pode usar sua porta local para exclusividade. E da perspectiva do servidor da web, o IP remoto não é único, pois vários usuários podem estar localizados atrás de um único gateway / proxy.
precisa saber é o seguinte

Respostas:

55

Os navegadores usam portas diferentes para se conectar a sites diferentes?

Sim, eles fazem.

Aqui está um exemplo, mostrando minhas conexões atuais do Firefox (tenho 9 guias abertas) no Windows 7:

insira a descrição da imagem aqui

Notas:

  • Você pode ver que as portas locais são todas diferentes.

  • As portas remotas são geralmente 80 (HTTP), 443 (HTTPS) ou 8080 (HTTP Alternativo).

  • O processo completo de renderização de uma página da web é descrito abaixo. Veja em particular as etapas 5, 6, 13 e 15 (em negrito):

    • Em geral, a renderização de uma única página da Web usa várias conexões, nem todas no mesmo endereço remoto.

    • Isso ocorre porque as páginas da Web geralmente incluem recursos hospedados em outros lugares (arquivos javascript, etc.).

  • Múltiplas conexões com o mesmo site (por exemplo, stackoverflow.com) também possuem portas locais diferentes (porque são conexões separadas em guias diferentes, renderizando páginas diferentes).


Renderizando uma página da Web - passo a passo

Nota:

  • As etapas 5, 6, 13 e 15 (em negrito) são diretamente relevantes para a pergunta.

Você já pensou no que acontece quando você navega na web? Não é tão simples quanto parece:

  1. Você digita um URL na barra de endereços no seu navegador preferido.
  2. O navegador analisa o URL para encontrar o protocolo, host, porta e caminho.
  3. Ele forma uma solicitação HTTP (provavelmente o protocolo)
  4. Para alcançar o host, ele primeiro precisa converter o host legível por humanos em um número IP e faz isso fazendo uma pesquisa de DNS no host
  5. Em seguida, é necessário abrir um soquete do computador do usuário para esse número IP, na porta especificada (geralmente a porta 80)
  6. Quando uma conexão é aberta, a solicitação HTTP é enviada ao host
  7. O host encaminha a solicitação ao software do servidor (geralmente Apache) configurado para escutar na porta especificada
  8. O servidor inspeciona a solicitação (geralmente apenas o caminho) e inicia o plug-in do servidor necessário para lidar com a solicitação (correspondente à linguagem do servidor que você usa, PHP, Java, .NET, Python?)
  9. O plug-in obtém acesso à solicitação completa e começa a preparar uma resposta HTTP.
  10. Para construir a resposta, um banco de dados é (provavelmente) acessado. É feita uma pesquisa no banco de dados, com base nos parâmetros no caminho (ou dados) da solicitação
  11. Os dados do banco de dados, juntamente com outras informações que o plug-in decide adicionar, são combinados em uma longa sequência de texto (provavelmente HTML).
  12. O plug-in combina esses dados com alguns metadados (na forma de cabeçalhos HTTP) e envia a resposta HTTP de volta ao navegador.
  13. O navegador recebe a resposta e analisa o HTML (que com 95% de probabilidade está quebrado) na resposta
  14. Uma árvore DOM é construída a partir do HTML quebrado
  15. Novas solicitações são feitas ao servidor para cada novo recurso encontrado na fonte HTML (normalmente imagens, folhas de estilo e arquivos JavaScript). Volte para a etapa 3 e repita para cada recurso.
  16. As folhas de estilo são analisadas e as informações de renderização em cada uma são anexadas ao nó correspondente na árvore DOM
  17. Javascript é analisado e executado, os nós DOM são movidos e as informações de estilo são atualizadas de acordo
  18. O navegador renderiza a página na tela de acordo com a árvore DOM e as informações de estilo para cada nó
  19. Você vê a página na tela
  20. Você fica irritado por todo o processo ser muito lento.

Origem Renderização de uma página da Web - passo a passo

DavidPostill
fonte
63

Cada conexão com um site usa um soquete diferente com a porta TCP de destino padrão 80 para HTTP simples e 443 para HTTPS. Para que o soquete seja exclusivo, a combinação do endereço IP de origem, porta TCP de origem, endereço IP de destino e porta TCP de destino deve ser diferente.

Se você tiver várias conexões com o mesmo site (assumindo que o site use apenas 1 endereço IP) do mesmo computador, uma porta TCP de origem diferente deverá ser usada. Dessa forma, cada conexão é única.

No entanto, deve-se observar que, a partir do HTTP 1.1, todas as conexões são persistentes por um determinado período de tempo (a menos que seja declarado o contrário). Isso significa que a mesma conexão pode ser reutilizada pelo seu navegador se forem solicitados vários recursos do mesmo site (por exemplo, arquivos css / js). Isso também se aplica se você tiver várias instâncias do mesmo site no seu navegador.

Se você estiver no Windows, o netstat -no -p TCPcomando mostrará todos os soquetes TCP ativos e seu ID de processo correspondente, incluindo os do seu navegador:

insira a descrição da imagem aqui

Se você estiver no Unix / Linux (Debian neste caso), poderá usar o comando netstat -ntpou ss -t:

insira a descrição da imagem aqui

Egon Olieux
fonte
4
Observe que o netstat também mostrará conexões que não são do navegador, por exemplo, conexões de email para um cliente de email, conexões de notícias para um leitor de notícias. Essas conexões estarão em diferentes portas remotas.
DavidPostill
A menos que esteja faltando alguma coisa, parece que você está assumindo que o solicitante está usando o Windows, embora ele não tenha mencionado um sistema operacional. Também é bom listar a qual SO você está se referindo sempre que fornecer comandos do console.
user45623
9
@ user45623: Embora a captura de tela seja uma captura de tela do Windows, netstat -ndeve funcionar na maioria dos sistemas operacionais, incluindo Linux e Mac OS.
Heinzi 21/03
11
No Windows (talvez também em outros sistemas operacionais), você pode usar netstat -n -opara ver qual processo criou qual conexão. Ou você pode executar o tcpview do SysInternal para ver a lista em uma GUI, com nomes e ícones de processos e tudo.
Jonathan
Agora, a pergunta é: os navegadores da Web reutilizam conexões de guias diferentes se levam ao mesmo servidor?
John Dvorak
11

No que diz respeito a guias para sites diferentes, nada no TCP exige que a porta local seja diferente, desde que a tupla {IP local, porta local, IP de destino, porta de destino} seja única. Para guias para o mesmo site, a situação é muito mais complexa.

O navegador, como qualquer outro software cliente, usa uma porta local diferente por conexão de saída para o mesmo destino. Em geral, ele formará várias conexões com qualquer site, para buscar recursos incorporados, como imagens, CSS, JavaScript etc. Ele também agrupará essas conexões para possível reutilização.

Não é possível dizer se guias diferentes para o mesmo site usarão conexões distintas , porque (a) geralmente não existe uma única conexão por guia e (b) dependendo do tempo e da autenticação, as conexões podem ser reutilizado entre guias; e como não é possível identificar as conexões, também não é possível identificar as portas locais.

user207421
fonte
Obrigado. O que significa "agrupar" uma conexão?
yoyo_fun
Em vez de fechá-lo, retorne-o a um pool e feche-o apenas se permanecer lá ocioso por algum intervalo de tempo limite; e olhando primeiro no pool antes de criar uma nova conexão com esse destino. É assim que o HTTP keep-alive é implementado.
user207421
Então, um pool é uma estrutura de dados na memória que armazena conexões abertas e ainda não fechadas?
yoyo_fun
Isso está correto, normalmente um mapa codificado pelo IP de destino: porta.
user207421
2
@EJP: Observe que, para HTTPS, não é seguro digitar o mapa por IP e porta de destino; você também precisa distinguir entre conexões com nomes de host diferentes, mesmo que eles resolvam o mesmo IP e porta. Indiscutivelmente, um navegador também deve manter as conexões de diferentes guias separadas se pelo menos uma delas estiver no modo de navegação anônima.
Henning Makholm
6

Sim. Não Talvez. Depende.

Primeiro, um navegador pode usar qualquer uma dessas estratégias para conexões:

  1. Conexão única (improvável para qualquer navegador mais recente que 1995)
  2. Uma conexão por guia (basicamente igual ao nº 1, apenas um pouco melhor)
  3. Uma conexão por recurso (ingênua, mas não funciona tão mal)
  4. Conjunto de conexões com conexões keep-alive e reutilização
  5. Algo diferente (leia-se: coisas estranhas)

Você não tem como saber qual estratégia o navegador utilizará, embora o uso de um conjunto de conexões (e a reutilização de conexões) seja uma suposição razoável.

Segundo, da maneira que o TCP funciona, você tem uma porta de origem e uma porta de destino para todas as conexões. O par de origem / destino endereço / porta define a conexão.
Você sempre [1] usa uma porta conhecida (como 80 ou 443) para se conectar ao servidor (no qual ele escuta no endereço anunciado), mas a outra porta é escolhida aleatoriamente. Portanto, dependendo de qual lado você olha para uma conexão, ela possui uma ou várias portas possíveis.

Portanto, a mesma guia pode (e geralmente utilizará) várias portas diferentes em sua extremidade, mas, em princípio, guias diferentes podem (se as conexões forem agrupadas e recursos diferentes em guias diferentes forem carregadas do mesmo servidor) usar a mesma porta.

Como a pergunta menciona explicitamente a saída , no caso "normal", os números de porta seriam os mesmos, independentemente da guia em que estão ou de uma das duas portas possíveis (80 e 443). Embora, é claro, seja possível solicitar explicitamente uma porta diferente (como 8080) em um URL. Isso é meio raro, no entanto.


[1] Bem, nem sempre ... mas não vamos complicar demais.

Damon
fonte
Um outro fator ... a porta do lado do cliente geralmente é escolhida pelo sistema operacional, não pelo navegador; e a porta do lado do cliente que o servidor vê pode ser diferente da que o navegador vê, se a conexão passar por um dispositivo NAT. A maioria dos sistemas operacionais aloca linear ou aleatoriamente dentro de um intervalo de portas efêmeras (configurável), mas um navegador pode solicitar a mesma porta de origem em várias conexões com servidores diferentes. (E o OP é perguntando sobre portas de cliente, e não portas do servidor.)
david
@ David: É difícil dizer qual é o certo (ou o que responder), já que o Q é um petisco ambíguo, daí a minha excursão um pouco longa. O OP está perguntando sobre a porta de saída no cliente. "Cliente" sugere que estamos falando sobre a porta de origem (em termos de TCP), que é a escolhida livre ou aleatoriamente (pela implementação), mas "saída" sugere que é realmente a porta de destino da qual estamos falando. O que é muito melhor descrito como "porta no servidor" em palavras leigas. Seu comentário sobre o NAT está correto como visto no servidor, mas não afeta o cliente.
Damon