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?)
fuente
recv()
en cada proceso.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).
fuente
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
netcat
listen 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.
fuente
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,
accept
se realiza un retorno de un socket con un host: tupla de puerto para el otro extremo.fuente
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.
fuente