I browser Web utilizzano porte in uscita diverse per schede diverse?


58

In un browser Web che supporta la presenza di più schede, ad esempio Firefox, schede diverse che vanno a domini di siti Web diversi utilizzano una porta dedicata per ciascun dominio ?.

Oppure il browser utilizza un'unica porta per gestire tutte le schede e quindi tutti i domini?


I browser utilizzano 2 porte durante la connessione a siti Web, 80 per connessioni http, 443 per connessioni https. it.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
Moab

7
Conosco le porte utilizzate per connettersi al server, ma mi chiedevo quali fossero i numeri delle porte utilizzate per connettersi dal client (computer host).
yoyo_fun

2
Penso che il termine "porti in uscita" sia impreciso. Le porte sono bidirezionali. Forse potresti dire. "porte locali", invece. Le porte locali vengono utilizzate come porte di origine (in uscita) per l'invio di richieste e porte di destinazione (in entrata) per la ricezione di risposte.
Ron Maupin,

6
Le porte sono assegnate dal sistema operativo e ad ogni nuova connessione viene assegnata una nuova porta locale per renderla distinta da tutte le altre connessioni aperte.
Ex Umbris,

1
@ExUmbris: potrebbe essere una strategia ragionevole e semplice, ma le connessioni TCP sono identificate dal quad {IP locale, porta locale, IP remoto, porta remota}. La porta locale non è necessaria per l'unicità, il che è positivo: il server web non può usare la sua porta locale per l'unicità. E dal punto di vista del server web, l'IP remoto non è univoco, poiché più utenti potrebbero trovarsi dietro un singolo gateway / proxy.
MSalters,

Risposte:


55

I browser utilizzano porte diverse per connettersi a siti Web diversi?

Si lo fanno.

Ecco un esempio, che mostra le mie attuali connessioni di Firefox (ho 9 schede aperte) su Windows 7:

inserisci qui la descrizione dell'immagine

Appunti:

  • Puoi vedere che le porte locali sono tutte diverse.

  • Le porte remote sono in genere 80 (HTTP), 443 (HTTPS) o 8080 (HTTP alternativo).

  • Il processo completo di rendering di una pagina Web è descritto di seguito. Vedi in particolare i passaggi 5, 6, 13 e 15 (che sono in grassetto):

    • In generale, il rendering di una singola pagina Web utilizza connessioni multiple, non tutte allo stesso indirizzo remoto.

    • Questo perché le pagine Web spesso includono risorse ospitate altrove (file javascript, ecc.).

  • Le connessioni multiple allo stesso sito Web (ad es. Stackoverflow.com) hanno anche porte locali diverse (perché sono connessioni separate in schede diverse che rendono diverse pagine).


Rendering di una pagina Web - passo dopo passo

Nota:

  • I passaggi 5, 6, 13 e 15 (che sono in grassetto) sono direttamente rilevanti per la domanda.

Hai mai pensato a cosa succede quando navighi sul web? Non è così semplice come sembra:

  1. Digiti un URL nella barra degli indirizzi nel tuo browser preferito.
  2. Il browser analizza l'URL per trovare protocollo, host, porta e percorso.
  3. Forma una richiesta HTTP (che molto probabilmente era il protocollo)
  4. Per raggiungere l'host, deve prima tradurre l'host leggibile umano in un numero IP e lo fa eseguendo una ricerca DNS sull'host
  5. Quindi un socket deve essere aperto dal computer dell'utente a quel numero IP, sulla porta specificata (molto spesso porta 80)
  6. Quando una connessione è aperta, la richiesta HTTP viene inviata all'host
  7. L'host inoltra la richiesta al software server (molto spesso Apache) configurato per l'ascolto sulla porta specificata
  8. Il server controlla la richiesta (molto spesso solo il percorso) e avvia il plug-in del server necessario per gestire la richiesta (corrispondente alla lingua del server utilizzata, PHP, Java, .NET, Python?)
  9. Il plug-in ottiene l'accesso alla richiesta completa e inizia a preparare una risposta HTTP.
  10. Per costruire la risposta si accede (molto probabilmente) a un database. Viene effettuata una ricerca nel database, in base ai parametri nel percorso (o dati) della richiesta
  11. I dati del database, insieme ad altre informazioni che il plugin decide di aggiungere, vengono combinati in una lunga stringa di testo (probabilmente HTML).
  12. Il plug-in combina tali dati con alcuni metadati (sotto forma di intestazioni HTTP) e restituisce la risposta HTTP al browser.
  13. Il browser riceve la risposta e analizza l'HTML (che con il 95% di probabilità è interrotto) nella risposta
  14. Un albero DOM viene creato dal codice HTML non funzionante
  15. Vengono inviate nuove richieste al server per ogni nuova risorsa trovata nell'origine HTML (in genere immagini, fogli di stile e file JavaScript). Torna al passaggio 3 e ripeti per ciascuna risorsa.
  16. I fogli di stile vengono analizzati e le informazioni di rendering in ciascuno vengono allegate al nodo corrispondente nella struttura DOM
  17. Javascript viene analizzato ed eseguito, i nodi DOM vengono spostati e le informazioni di stile vengono aggiornate di conseguenza
  18. Il browser esegue il rendering della pagina sullo schermo in base all'albero DOM e alle informazioni di stile per ciascun nodo
  19. Vedi la pagina sullo schermo
  20. Ti infastidisci l'intero processo è stato troppo lento.

Sorgente Rendering di una pagina Web - passo dopo passo


63

Ogni connessione a un sito Web utilizza un socket diverso con la porta TCP di destinazione predefinita 80 per HTTP semplice e 443 per HTTPS. Perché il socket sia univoco, la combinazione di indirizzo IP di origine, porta TCP di origine, indirizzo IP di destinazione e porta TCP di destinazione deve essere diversa.

Se si hanno più connessioni allo stesso sito Web (supponendo che il sito Web utilizzi solo 1 indirizzo IP) dallo stesso computer, è necessario utilizzare una porta TCP di origine diversa. In questo modo, ogni connessione è unica.

Tuttavia, va notato che a partire da HTTP 1.1, tutte le connessioni sono persistenti per un determinato periodo di tempo (se non diversamente indicato). Ciò significa che la stessa connessione può essere riutilizzata dal browser se sono richieste più risorse dallo stesso sito Web (ad esempio file css / js). Questo vale anche se nel tuo browser sono presenti più istanze dello stesso sito Web.

Se sei su Windows, il netstat -no -p TCPcomando ti mostrerà tutti i socket TCP attivi e il loro ID processo corrispondente, inclusi quelli del tuo browser:

inserisci qui la descrizione dell'immagine

Se sei su Unix / Linux (Debian in questo caso), puoi usare il comando netstat -ntpo ss -t:

inserisci qui la descrizione dell'immagine


4
Notare che netstat mostrerà anche connessioni non browser, ad esempio connessioni e-mail per un client e-mail, connessioni notizie per un lettore di notizie. Queste connessioni saranno su porte remote diverse.
DavidPostill

A meno che non mi manchi qualcosa, sembra che tu stia assumendo il presupposto che il richiedente stia usando Windows, sebbene non abbia menzionato un sistema operativo. È anche utile elencare il sistema operativo a cui ti riferisci ogni volta che fornisci i comandi della console.
user45623

9
@ user45623: sebbene lo screenshot sia uno screenshot di Windows, netstat -ndovrebbe funzionare nella maggior parte dei sistemi operativi, inclusi Linux e Mac OS.
Heinzi,

1
Su Windows (forse anche su altri SO) puoi usare netstat -n -oper vedere quale processo ha creato quale connessione. Oppure puoi eseguire tcpview di SysInternal per vedere l'elenco in una GUI, con nomi e icone di processo e tutto.
Jonathan,

Ora la domanda è: i browser Web riutilizzano le connessioni da diverse schede se conducono allo stesso server?
John Dvorak,

11

Per quanto riguarda le schede di diversi siti Web, in TCP non esiste nulla che richieda che la porta locale sia diversa, purché la tupla {IP locale, porta locale, IP di destinazione, porta di destinazione} sia unica. Per le schede sullo stesso sito Web, la situazione è molto più complessa.

Il browser, come qualsiasi altro software client, utilizza una porta locale diversa per connessione in uscita allo stesso target. In generale formerà più connessioni a un determinato sito Web, per recuperare risorse incorporate come immagini, CSS, JavaScript, ecc. Inoltre metterà in comune tali connessioni per un possibile riutilizzo.

Non è possibile stabilire se schede diverse per lo stesso sito Web utilizzeranno connessioni distinte , poiché (a) in genere non esiste comunque una singola connessione per scheda e (b) a seconda dei tempi e dell'autenticazione, le connessioni potrebbero essere riutilizzato tra le schede; e poiché non è possibile identificare le connessioni, non è neppure possibile identificare le porte locali.


Grazie. Cosa significa "raggruppare" una connessione?
yoyo_fun,

Invece di chiuderlo, restituirlo a un pool e chiuderlo solo se rimane lì inattivo per un intervallo di timeout; e guardare nel pool prima di creare una nuova connessione a quella destinazione. Ecco come viene implementato HTTP keep-alive.
user207421

Quindi un pool è una struttura di dati nella memoria che memorizza connessioni aperte e non ancora chiuse?
yoyo_fun

È corretto, in genere una mappa codificata dall'IP di destinazione: porta.
user207421

2
@EJP: si noti che per HTTPS non è sicuro digitare la mappa in base all'IP e alla porta di destinazione; devi anche distinguere tra connessioni a nomi host diversi anche se capita di risolversi con lo stesso IP e porta. Probabilmente anche un browser dovrebbe mantenere separate le connessioni per diverse schede se almeno una scheda è in modalità di navigazione in incognito.
Henning Makholm,

6

Sì. No forse. Dipende.

Innanzitutto, un browser può utilizzare una di queste strategie per le connessioni:

  1. Connessione singola (improbabile per qualsiasi browser più recente del 1995)
  2. Una connessione per scheda (sostanzialmente uguale al numero 1, leggermente migliore)
  3. Una connessione per risorsa (ingenua, ma non funziona così male)
  4. Gruppo di connessioni con connessioni keep-alive, riutilizzo
  5. Qualcosa di diverso (leggi come: cose strane)

Non hai modo di sapere quale strategia verrà utilizzata da un browser, sebbene l'utilizzo di un pool di connessioni (e il riutilizzo delle connessioni) sia un presupposto ragionevole.

In secondo luogo, il modo in cui TCP funziona, hai una porta di origine e una porta di destinazione per ogni connessione. La coppia di indirizzo / porta di origine e destinazione definisce la connessione.
È sempre [1] utilizza un noto porto (ad esempio 80 o 443) per connettersi al server (per cui è in ascolto al suo indirizzo advertized), ma l'altra porta è scelto a caso. Pertanto, a seconda del lato da cui si guarda una connessione, essa ha una o più porte possibili.

Pertanto, la stessa scheda può (e solitamente) utilizzare più porte differenti sulla sua estremità, ma in linea di schede diverse potrebbe (se i collegamenti sono raggruppati e diverse risorse in diverse schede vengono caricate dallo stesso server) utilizzare la stessa porta.

Poiché la domanda menziona esplicitamente in uscita , nel caso "normale", i numeri di porta sarebbero gli stessi indipendentemente da quale scheda si trovino o da una delle due porte possibili (80 e 443). Anche se ovviamente è possibile richiedere esplicitamente una porta diversa (come 8080) in un URL. È un po 'raro, però.


[1] Beh, non sempre ... ma non compliciamoci troppo.


Un altro fattore ... la porta lato client è in genere scelta dal sistema operativo, non dal browser; e la porta sul lato client visualizzata dal server potrebbe essere diversa da quella visualizzata dal browser, se la connessione passa attraverso un dispositivo NAT. La maggior parte dei sistemi operativi si alloca in modo lineare o casuale all'interno di un intervallo di porte effimere (configurabile), ma un browser potrebbe richiedere la stessa porta di origine su più connessioni a server diversi. (E l'OP chiede porte client, non porte server.)
David

@david: è difficile dire quale sia giusto (o che cosa rispondere) poiché la Q è un boccone ambiguo, quindi la mia escursione piuttosto completa. L'OP chiede informazioni sulla porta in uscita sul client. "Client" suggerisce che stiamo parlando della porta di origine (in termini TCP) che è quella che viene scelta liberamente o casualmente (dall'implementazione), ma "in uscita" suggerisce che è davvero la porta di destinazione di cui stiamo parlando. Che è meglio descritto come "porta sul server" in parole profani. Il tuo commento su NAT è corretto visto dal server, ma non influisce sul client.
Damon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.