Comment écrire un serveur HTTP?

17

Comme le titre l'indique, je voudrais écrire un serveur HTTP. Ma question est la suivante, comment dois-je procéder? Je sais que cela semble TRÈS général et trop "de haut niveau", mais il y a une méthode à ma folie. Une réponse à cette question devrait être, je crois, indépendante du langage; ce qui signifie, quel que soit le langage 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é fonctionner:

  1. Ouvrez une prise sur le port 80.
  2. Attendez qu'un client fasse une demande.
  3. Lisez la demande (c.-à-d., Cette personne veut la page "contactez-nous.html").
  4. Recherchez et lisez "contact-us.html".
  5. Envoyez un 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 m'amène au cœur de ma question. Comment ou où une personne trouve-t-elle ces informations?

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

Un collègue m'a parlé de l'en-tête html, donc je n'aurais JAMAIS su cela sans lui. Il a également dit quelque chose sur la remise de chaque demande à un nouveau fil. Y a-t-il un gros livre sur 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é de googler "comment fonctionne un serveur HTTP", mais les seules réponses que j'ai pu trouver étaient destinées à votre Joe moyen, et non à une personne souhaitant programmer un serveur HTTP.

Brian
la source
12
RFC2616 devrait avoir tous les détails du protocole HTTP pour vous. RFC959 est la même chose pour FTP.
Mike
3
Alternativement (ou en plus), regardez comment les serveurs HTTP simples existants sont implémentés. Plus d'un, cela devrait vous donner une idée des structures qui ont du sens.
Michael Borgwardt
Michael Borgwardt - Je le ferais, mais j'ai tendance à copier ce que j'ai vu quand je regarde un autre code. J'espérais entrer dans ce nettoyage, pour voir si je pouvais le faire par moi-même sans "tricher".
Brian
votre expression de recherche sur le Web est erronée, elle est destinée aux utilisateurs, c'est pourquoi vous obtenez des trucs moyens de Joe. Utilisez plutôt : "comment développer un serveur HTTP" , il reflète mieux ce que vous recherchez. Je viens de l'essayer avec Google et j'ai obtenu une page complète de références qui expliquent ce genre de choses
GNAT
pensez à revoir d'autres implémentations, par exemple apache tomcat. Il fait probablement plus que ce que vous voulez, mais il vous montrera une technique pour résoudre le problème.
DwB

Réponses:

19

Utilisez le RFC2616 , Luke!

Vous lisez le RFC 2616 sur HTTP / 1.1 , et c'est parti.

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

Outils

Vos outils sont:

  • trucs de base en réseau (gestion des sockets, liaison, compréhension des adresses),
  • bonne compréhension des flux d'E / S,
  • beaucoup de patience pour obtenir des parties ombragées du RFC (les types MIME sont amusants).

Considérations amusantes

Choses à considérer pour plus de plaisir:

  • architecture de plug-in pour ajouter le support CGI / mod,
  • fichiers de configuration pour, eh bien, beaucoup de choses,
  • beaucoup d'expérimentation sur la façon d'optimiser les transferts,
  • beaucoup d'expérimentation pour voir comment gérer la charge en termes de CPU et de mémoire, et pour choisir un modèle de répartition (grosse boucle paire même, répartition unique d'acceptation, multi-thread, multi-processus, etc ...).

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

Autres suggestions (plus simples)

  • Client / serveur FTP (principalement RFC959 mais il existe des versions plus anciennes et aussi quelques extensions)
  • Client / serveur IRC (principalement RFC1459 , mais il existe des extensions)

Ils sont beaucoup plus faciles à aborder en premier, et leurs RFC sont beaucoup plus faciles à digérer (eh bien, celui de l'IRC a quelques parties étranges, mais le FTP est assez clair).

Choix de la langue

Bien sûr, certains détails d'implémentation dépendront fortement de la langue et de la pile que vous utilisez pour l'implémenter. J'ai abordé tout cela en C, mais je suis sûr que cela peut être amusant aussi bien dans d'autres langues (ok, peut-être pas aussi amusant, mais toujours amusant).

haylem
la source
Ouais, je devais aussi faire ça en tant que projet à l'école. C'est étonnamment amusant et vous donne plus d'appréciation pour les serveurs Web de «puissance industrielle».
Evicatos
Obtenir la bonne implémentation du protocole est une partie; l'architecture du serveur en est une autre ...
tdammers
@tdammers: Les RFC sont assez bons, si vous les suivez, vous avez déjà un plan décent à suivre. Vous avez encore beaucoup de place pour la conception de votre architecture, mais c'est une spécification assez bonne et directive.
haylem
@haylem: oui et non. L'implémentation de la spécification vous donne un travailleur individuel, mais vous devez toujours intégrer ce travailleur dans une image plus grande - comment vous occupez-vous de gérer les demandes simultanées? Comment fournissez-vous du contenu utile? Où gardez-vous l'état?
tdammers
@tdammers: moi: You still have lots of room for your architecture design, but it's a pretty good and directive spec.vous: yes and no. Je pense que nous avons déjà rétréci que le RFC n'était pas tout. Et je pense que c'est au PO de découvrir ensuite ces choses plutôt que de les signaler directement plus que ce que j'ai déjà fait dans les sections "considérations supplémentaires" et d'autres choses. Cela fait partie du plaisir.
haylem
2

Chacun des protocoles utilisés sur Internet est spécifié dans un ou plusieurs documents publics appelés RFC. Tous les RFC actuels peuvent être trouvés sur 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 .

Selon les spécifications, les RFC sont, à mon avis, très lisibles.

Bart van Ingen Schenau
la source
Je suis vraiment confus avec ces RFC. Vont-ils jamais mettre à jour les RFC HTTP? Dans la réponse ci-dessus, il y a un commentaire qui dit In 2014, RFC2616 was replaced by multiple RFCs (7230-7237).. Alors, comment trouver les RFC mis à jour s'ils sont présents? Dois-je vérifier la Obsoleted byliste?
SkrewEverything
@SkrewEverything: Les RFC ne sont pas mis à jour mais ils sont remplacés par des RFC plus récents. Vous trouverez en effet les plus récents en suivant les liens "Obsolète par".
Bart van Ingen Schenau