Nunca había pensado en eso, pero ahora me interesan algunas cosas básicas detrás de escena. 1) ¿El servidor web cierra la conexión después de cada solicitud? 2) Cuando tengo más ventanas del navegador abiertas y todos los datos de solicitud de algún servidor web, ¿el servidor web utiliza algún tipo de comunicación de socket estándar para reconocer qué conexión estaba solicitando qué? 3) ¿Qué pasa si hay más usuarios que puertos libres (digamos 66k solicitando algo al mismo tiempo)?
Gracias :)
Respuesta1
- Depende de qué versión de HTTP esté utilizando la solicitud. Las conexiones HTTP 1.0 se cierran inmediatamente cuando el servidor termina de enviar la respuesta al agente de usuario. HTTP1.1 agregó soporte para keepalives, lo que permite que la conexión del socket permanezca abierta después de que la respuesta haya sido devuelta al agente de usuario. En este caso, el agente de usuario envía un encabezado HTTP Connection: Keep-Alive indicando que desea mantener la conexión abierta, lo que implica que enviará más solicitudes.
- Sí. Esta es la funcionalidad básica del socket. El cliente abre un socket en un puerto local no utilizado (normalmente alto) e intenta abrir una conexión con un puerto de destino específico (por ejemplo: 80 para HTTP) en el host remoto. Cada otra conexión que crea el cliente abre un socket local en un puerto diferente, pero aún podría intentar una conexión en el mismo puerto en el host remoto.
- El proceso de escucha en el servidor generará procesos de trabajo para manejar las múltiples solicitudes entrantes, dejando al oyente libre para manejar las solicitudes entrantes. La mayoría de los servidores http tendrán una opción de configuración para controlar la cantidad de solicitudes simultáneas a manejar.
Respuesta2
1) Generalmente, cada solicitud de página se limita a una conexión abierta y cerrada.
2) Su computadora cambia su puerto de origen para cada solicitud que realiza. El servidor utiliza la combinación IP/puerto de origen para realizar un seguimiento de qué solicitudes provienen de qué hosts.
3) Bueno, el servidor responde a todas las solicitudes HTTP en el puerto 80. Pero en cuanto a los clientes, si pudiera generar 66 000 solicitudes de 1 cliente exactamente al mismo tiempo, podría tener problemas, no estoy seguro de eso.
Respuesta3
1) Keepalive es compatible con la mayoría de los servidores web modernos, por lo que si el navegador lo admite, el servidor web aceptará más de una solicitud por conexión.
http://en.wikipedia.org/wiki/HTTP_persistent_connection
2) Sí, cada conexión tiene su propio socket, que es un par IP:PUERTO.
http://en.wikipedia.org/wiki/TCP_sockets
3) Si tienes 65.535 personas solicitando simultáneamente desde un único servidor, ¡debes dar un paso atrás y considerar lo que estás haciendo! :) En serio, a menos que tengas mucha suerte, sentirás la necesidad de equilibrar la carga antes de llegar a este problema. Un problema que podría tener antes es quedarse sin descriptores de archivos. El valor predeterminado en bash es 1024 (consulte "ulimit" en la página de manual de bash).