¿Cómo escribir un servidor HTTP?

17

Como dice el título, me gustaría escribir un servidor HTTP. Mi pregunta es esta, ¿cómo hago esto? Sé que esto suena MUY general y demasiado "alto nivel", pero hay un método para mi locura. Una respuesta a esta pregunta debería ser, creo, agnóstico del lenguaje; es decir, no importa qué lenguaje use (p. ej., C, C ++, Java, etc.) la respuesta debe ser la misma. Tengo una idea general de cómo se supone que esto funciona:

  1. Abra un zócalo en el puerto 80.
  2. Espere a que un cliente haga una solicitud.
  3. Lea la solicitud (es decir, esta persona quiere la página "contact-us.html").
  4. Busque y lea "contact-us.html".
  5. Envíe un encabezado html, luego envíe el contenido de "contact-us.html"
  6. Hecho

Como dije, creo que este es el proceso, pero no estoy 100% seguro. Esto me lleva al corazón de mi pregunta. ¿Cómo o dónde encuentra una persona esta información?

¿Qué sucede si no quisiera escribir solo un servidor HTTP, y si quisiera escribir un servidor FTP, un servidor de chat, un visor de imágenes, etc.? ¿Cómo descubre una persona los pasos / procesos exactos necesarios para crear un servidor HTTP que funcione?

Un compañero de trabajo me habló del encabezado html, por lo que NUNCA habría sabido esto sin él. También dijo algo sobre entregar cada solicitud a un nuevo hilo. ¿Hay algún gran libro sobre cómo funcionan las cosas? ¿Hay algún manual de lo que se necesita para ser un servidor HTTP?

Traté de buscar en Google "cómo funciona un servidor HTTP", pero las únicas respuestas que pude encontrar estaban orientadas a su Joe promedio, y no a una persona que desea programar un servidor HTTP.

Brian
fuente
12
RFC2616 debe tener todos los detalles esenciales del protocolo HTTP para usted. RFC959 es lo mismo para FTP.
Mike
3
Alternativamente (o adicionalmente), observe cómo se implementan los servidores HTTP simples existentes. Más de uno, eso debería darle una idea de qué estructuras tienen sentido.
Michael Borgwardt
Michael Borgwardt: haría eso, pero tengo tendencia a copiar lo que he visto cuando veo otro código. Tenía la esperanza de entrar en esta limpieza, para ver si podía hacerlo por mi cuenta sin "hacer trampa".
Brian
su frase de búsqueda en la web es incorrecta, está dirigida a usuarios, por eso está obteniendo cosas promedio de Joe. Uso: "cómo desarrollar un servidor HTTP" en su lugar, refleja mejor lo que estás buscando. Acabo de probarlo con Google y obtuve una página completa de referencias que explican estas cosas
mosquito
considere revisar otras implementaciones, por ejemplo apache tomcat. Probablemente haga más de lo que desea, pero demostrará una técnica para resolver el problema.
DwB

Respuestas:

19

¡Usa el RFC2616 , Luke!

Usted lee el RFC 2616 en HTTP / 1.1 , y lo hace.

Ese fue en realidad un proyecto en mi tercer año en la escuela de ingeniería, y esa es más o menos la descripción del proyecto.

Herramientas

Tus herramientas son:

  • cosas básicas de redes (gestión de socket, enlace, comprender direcciones),
  • buena comprensión de las secuencias de E / S,
  • mucha paciencia para obtener algunas partes sombrías del RFC (los tipos mimo son divertidos).

Consideraciones divertidas

Cosas a considerar para la diversión extra:

  • arquitectura de complemento para agregar soporte CGI / mod,
  • archivos de configuración para, bueno, muchas cosas,
  • mucha experimentación sobre cómo optimizar las transferencias,
  • mucha experimentación para ver cómo administrar la carga en términos de CPU y memoria, y elegir un modelo de despacho (bucle grande y uniforme, despacho de aceptación simple, multiproceso, multiproceso, etc.).

Que te diviertas. Es algo muy bueno de ver.

Otras sugerencias (más simples)

  • Cliente / servidor FTP (principalmente RFC959 pero hay versiones anteriores y también algunas extensiones)
  • Cliente / servidor IRC (principalmente RFC1459 , pero hay extensiones)

Primero son mucho más fáciles de abordar, y sus RFC son mucho más fáciles de digerir (bueno, el IRC tiene algunas partes extrañas, pero el FTP es bastante claro).

Elección de idioma

Por supuesto, algunos detalles de implementación dependerán en gran medida del idioma y la pila que use para implementarlo. Abordé todo eso en C, pero estoy seguro de que puede ser divertido igual de bien en otros idiomas (bueno, tal vez no sea tan divertido, pero aún así es divertido).

haylem
fuente
Sí, tuve que hacer esto como un proyecto en la escuela también. Es sorprendentemente divertido y le da más aprecio por los servidores web de "fuerza industrial".
Evicatos
Conseguir la implementación correcta del protocolo es una parte;
diseñar
@tdammers: los RFC son bastante buenos, si los sigues, ya tienes un plan básico decente para seguir. Todavía tiene mucho espacio para el diseño de su arquitectura, pero es una especificación bastante buena y directiva.
haylem
@haylem: sí y no. La implementación de la especificación le brinda un trabajador individual, pero aún necesita integrar a este trabajador en una imagen más amplia: ¿cómo se ocupa de manejar las solicitudes concurrentes? ¿Cómo se proporciona contenido útil? ¿Dónde guardas el estado?
tdammers
@tdammers: Yo: You still have lots of room for your architecture design, but it's a pretty good and directive spec.usted: yes and no. Creo que ya nos redujimos, ya que el RFC no lo era todo. Y creo que depende del OP descubrir estas cosas en lugar de señalarlas directamente más de lo que ya he hecho en las secciones de "consideraciones adicionales" y otras cosas. Es parte de la diversión.
haylem
2

Cada uno de los protocolos utilizados en Internet se especifica en uno o más documentos públicos llamados RFC. Todos los RFC actuales se pueden encontrar en http://www.rfc-editor.org/ , que también tiene una función de búsqueda decente.

El protocolo HTTP (versión 1.1), por ejemplo, se especifica en RFC2616 y el protocolo FTP se especifica en RFC959 .

Según las especificaciones, los RFC son, en mi opinión, muy legibles.

Bart van Ingen Schenau
fuente
Estoy realmente confundido con este RFC. ¿Alguna vez actualizarán los RFC HTTP? En la respuesta anterior, hay un comentario que dice In 2014, RFC2616 was replaced by multiple RFCs (7230-7237).. Entonces, ¿cómo encontrar los RFC actualizados si están presentes? ¿Debo verificar la Obsoleted bylista?
SkrewEverything
@SkrewEverything: los RFC no se actualizan, pero se reemplazan por RFC más nuevos. Puede encontrar los más nuevos siguiendo los enlaces "Obsoleado por".
Bart van Ingen Schenau