Comprender los puertos: ¿Cómo se comunican varias pestañas del navegador al mismo tiempo? [cerrado]


18

Hoy me di cuenta de que fundamentalmente no entiendo cómo funciona la comunicación portuaria.

Si enciendo una instancia de un servidor web que escucha en el puerto 80, puede responder a muchas solicitudes de muchas pestañas diferentes del navegador, todas comunicadas a través del puerto 80.

Sin embargo, no puedo iniciar dos instancias del servidor, ambas escuchando en el puerto 80, ya que resulta en un conflicto de puertos.

Siempre he tomado esto como un hecho, (solo un proceso puede unirse a un puerto específico en un momento dado) sin pensarlo realmente: ¿no hay múltiples procesos que se comunican en el puerto 80? (es decir, ¿cada una de las pestañas se ejecuta en el navegador?)

Respuestas:


24

Básicamente, solo un proceso puede ESCUCHAR en un puerto a la vez (técnicamente, un socket está dedicado a escuchar). Pero, un puerto puede manejar muchos sockets transfiriendo datos, un socket es una combinación de IP local / puerto y dirección IP remota / puerto remoto. De esa manera, una vez que el servidor acepta la conexión entrante mientras ESCUCHA, abre un nuevo socket dedicado a esa conversación y entrega el procesamiento a otra cosa, luego vuelve a ESCUCHAR.

Más detalles aquí .


En realidad, puede tener múltiples procesos escuchando en el mismo puerto. Si lo hace con múltiples lectores udp, por ejemplo, obtendrá un equilibrio de carga en el nivel del kernel. Primero abra el zócalo para escuchar, luego bifurque e intente recv()en cada proceso.
viraptor

55
@viraptor: Cierto, pero como UDP no tiene conexión, no hay realmente una distinción entre "escuchar" y "recibir".
Adam Robinson el

La misma idea funciona con TCP, bifurcando el proceso con el socket de escucha y aceptando () en ambos.
viraptor

En realidad, un socket es solo un "punto final" para la comunicación. Supongo que lo que querías decir es que un socket conectado es una combinación de IP / puerto local e IP / dirección / puerto remoto. La palabra
``

14

El navegador se conecta desde un puerto alto aleatorio (es decir,> 1024) en su computadora al puerto 80 de un servidor remoto. Por lo tanto, no hay conflicto de puertos en su máquina.

Si usa muchas pestañas para conectarse al mismo servidor remoto (o si hay muchos usuarios que se conectan al servidor), todos van al mismo puerto y son atendidos por el mismo proceso (es decir, el servidor web del sitio).


2
Esta es la respuesta correcta. Las conexiones TCP tienen un número de puerto en ambos extremos. Ambas computadoras involucradas pueden distinguir entre el sitio web de conexión: 80 <-> navegador: 12397 y el sitio web de conexión diferente: 80 <-> navegador: 22958.
pjc50

7

El servidor que escucha en el puerto 80 no TIENE que manejar múltiples procesos. Los demonios TCP simples de los años mayores solo podían manejar una conexión a la vez. Puede emular este comportamiento haciendo que un programa como netcatlisten en un puerto específico e intente conectar dos máquinas a él. Uno entrará, el otro rebotará sin una conexión. Estos demonios son en su mayoría inútiles, por lo que nunca más los verás.

Para algo así como un servidor web, está escuchando directamente en el puerto. Lo que hay que tener en cuenta es que se encuentra en la parte superior de la biblioteca de sockets del sistema operativo. Cuando se establece una nueva conexión, la biblioteca de sockets pasa el nuevo socket al software del servidor web. En ese punto, el software del servidor web tiene algunas opciones.

Una posibilidad es que pase el objeto de socket a un nuevo hilo en el mismo proceso. Siempre que la comunicación ocurra a través de este socket, este hilo lo manejará. El proceso padre media qué hilos están activos en un momento dado, lo que podría ser mucho.

Otra posibilidad es que acelere un nuevo proceso y pase el objeto socket al proceso. Según tengo entendido, ahora depende del sistema de socket del sistema operativo mediar en la comunicación entre estos procesos secundarios y sus objetivos. El proceso padre todavía tiene cierto control sobre los procesos, como matar a los colgados y otras comunicaciones entre procesos.

Cuál de estos enfoques es más eficiente depende del sistema operativo. IIRC, Apache puede ejecutarse en cualquier modo.

En esencia, la biblioteca de sockets proporciona un nivel de procesamiento paralelo al servidor web. Puede manejar múltiples conexiones simultáneas transfiriendo datos activamente, todo mientras acepta nuevas conexiones.

Para un navegador que puede activar múltiples intentos de conexión a un servidor web para mejorar los tiempos de carga, el paralelismo se aplica también en el extremo del navegador, esto es algo bueno y maravilloso. El navegador realiza un seguimiento del estado de la página a medida que se carga, y los múltiples intentos de conexión que gira son parte del proceso.


+1 por estar en lo cierto de muchas maneras :)
Michael Lowman

2

Hay, efectivamente, dos "tipos" de sockets de flujo. Uno tiene un "otro extremo" comodín, uno tiene un host específico: puerto para el otro extremo.

No hay dos sockets que puedan (o más bien deberían tener) los mismos identificadores "este final" y "otro extremo". El socket que se "escucha" (acepta conexiones entrantes) es el que tiene un "otro extremo" comodín, por lo que solo puede existir uno a la vez. A medida que llegan las conexiones, acceptse realiza un retorno de un socket con un host: tupla de puerto para el otro extremo.


1

Su pregunta me recuerda a mí mismo hace unos años antes de que Cisco CCNA tuviera las mismas dudas :)

En primer lugar, establecer múltiples conexiones HTTP no está necesariamente relacionado con la cantidad de pestañas que tiene abiertas en su navegador. Cuando visite un sitio con anuncios o código de Google Analytics, por ejemplo, se conectará a varios sitios a pesar de estar solo en una pestaña.

De todos modos, cuando su navegador se comunica con el servidor web, el puerto de destino del tráfico enviado al servidor web es el puerto 80, mientras que el puerto de origen es un número aleatorio. El puerto de origen es permitir que el servidor web sepa en qué puerto debe comunicarse con usted. Cada conexión establecida por HTTP tendrá su propio puerto abierto en su computadora. Intente ejecutar netstat con algunos sitios web abiertos e inmediatamente verá lo que quiero decir.

Es posible que se ría, pero este libro es una forma excelente y rápida de conocer los conceptos básicos de TCP / IP. Me ayudó un montón.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.