¿Los servidores web generalmente tienen un límite en la cantidad de solicitudes que aceptarán en general (vs por IP)?

Sí. Existen al menos dos factores limitantes: consumo de memoria del servidor web y sockets abiertos máximos (conexiones TCP).

El sistema operativo asigna memoria estática para contener la información del socket. Esto significa que hay un número máximo de sockets abiertos por sistema. Si agota este límite, el sistema operativo dejará de aceptar nuevas conexiones. Por lo general, puede aumentar el número máximo de sockets en el sistema, a expensas de la memoria consumida por el sistema operativo.

El software del servidor web usa memoria para servir cada conexión. Entonces, si se queda sin memoria, dejará de aceptar conexiones. A la mayoría de los programas les resulta muy difícil recuperarse de la falta de memoria, por lo que el servidor web también puede fallar si eso sucede.

Ambas limitaciones son la razón por la cual los ataques de denegación de servicio pueden derribar los sistemas al abrumarlos con conexiones.

Depende de la pila que estén usando, pero generalmente, sí.

No es tanto un límite configurado como “el servidor se bloquea si hay más de esta cantidad de sesiones activas”. Muchos ataques aprovechan esto sobrecargando el servidor con solicitudes de modo que otros que intentan usarlo no puedan acceder al servidor en absoluto. En muchos sistemas, una solicitud se correlacionará con un subproceso, por lo que cada nueva solicitud concurrente significa que otro subproceso está ocupado. Una vez que todos están ocupados, bueno, no queda ninguno para usar, por lo que las cosas dejan de responder.

Algunos sistemas evitan esto al no iniciar un hilo por solicitud, sino al manejar todas las solicitudes en un proceso principal. Obviamente, esto tiene sus desventajas, ya que está limitado a una ‘instancia’ del programa en las primeras etapas, pero generalmente es mucho más eficiente para configuraciones más pequeñas.