web-dev-qa-db-fra.com

Comment écrire un serveur HTTP?

Comme le dit le titre, je voudrais écrire un serveur HTTP. Ma question est la suivante: comment puis-je faire cela? Je sais que cela semble très général et aussi "haut niveau", mais il y a une méthode à ma folie. Je crois que la réponse à cette question devrait être une langue agnostique linguistique; Signification, peu importe la langue que j'utilise (par exemple, C, C++, Java, etc.) La réponse doit être la même. J'ai une idée générale de la façon dont cela est censé travailler:

  1. Ouvrez une prise sur le port 80.
  2. Attendez qu'un client effectue une demande.
  3. Lisez la demande (c'est-à-dire que cette personne veut la page "contact-us.html").
  4. Trouver et lire "contact-us.html".
  5. Envoyez une en-tête HTML, puis envoyez le contenu de "contact-us.html"
  6. Terminé

Comme je l'ai dit, je crois que c'est le processus, mais je ne suis pas sûr à 100%. Cela me conduit au cœur de ma question. Comment ou où une personne découvre-t-elle ces informations?

Et si je ne voulais pas écrire un serveur HTTP, que si je voulais écrire un serveur FTP, un serveur de discussion, une visionneuse d'images, etc.? Comment une personne trouve-t-elle les étapes/processus exacts nécessaires pour créer un serveur HTTP de travail?

Un collègue m'a parlé de l'en-tête HTML, alors je ne le saurais jamais sans lui. Il a également dit quelque chose à propos de la remise de chaque demande à un nouveau fil. Y a-t-il un gros livre de la façon dont les choses fonctionnent? Existe-t-il un manuel de ce qu'il faut pour être un serveur HTTP?

J'ai essayé Googling "Comment fonctionne un serveur HTTP", mais les seules réponses que je pouvais trouver étaient orientées vers votre Joe moyen et non vers une personne qui souhaite programmer un serveur HTTP.

17
Brian

Utilisez le RFC2616 , Luke!

Vous lisez le RFC 2616 sur http/1.1 , et vous allez pour cela.

C'était en fait un projet de ma 3e année dans l'école d'ingénieur, et c'est à peu près la description du projet.

Outils

Vos outils sont:

  • stuff à réseautage de base (gestion de la prise, reliure, comprendre les adresses),
  • bonne compréhension des flux d'E/S,
  • beaucoup de patience pour obtenir des parties ombragées de la RFC (les types de mime sont amusants).

Considérations amusantes

Choses à considérer pour plus de plaisir:

  • architecture plug-in pour ajouter un support CGI/MOD,
  • fichiers de configuration pour, bien, beaucoup de choses,
  • beaucoup d'expérimentation sur la manière d'optimiser les transferts,
  • beaucoup d'expérimentations à voir comment gérer la charge en termes de processeur et de mémoire, et de choisir un modèle de répartition (gros boucle gras, répartition unique acceptante, multi-thread, multi-processus, etc.).

S'amuser. C'est une chose très cool à regarder.

Autres suggestions (simples)

Ils sont de plus en plus faciles à résoudre en premier et leurs RFC sont beaucoup plus faciles à digérer (bien, le IRC One a des parties impaires, mais le FPP est assez clair).

Choix de la langue

Bien sûr, certains détails de la mise en œuvre seront fortement dépendants de la langue et de la pile que vous utilisez pour la mettre en œuvre. J'ai approché tout cela en C, mais je suis sûr que cela peut être amusant aussi bien dans d'autres langues (ok, peut-être pas autant de plaisir, mais toujours amusant).

19
haylem

Chacun des protocoles utilisés sur Internet est spécifié dans un ou plusieurs documents publics appelés RFCS. Tous les RFC actuels peuvent être trouvés à http://www.rfc-editor.org/ , qui a également une fonction de recherche décente.

Le protocole HTTP (version 1.1), par exemple, est spécifié dans RFC2616 et le protocole FTP est spécifié dans RFC959 .

Comme la spécification se passe, les RFC sont, à mon avis, très bien lisibles.