Wie schreibe ich einen HTTP-Server?

16

Wie der Titel schon sagt, möchte ich einen HTTP-Server schreiben. Meine Frage ist, wie mache ich das? Ich weiß, das klingt SEHR allgemein und zu "hoch", aber mein Wahnsinn hat eine Methode. Eine Antwort auf diese Frage sollte meines Erachtens sprachunabhängig sein. Das heißt, egal welche Sprache ich verwende (z. B. C, C ++, Java usw.), die Antwort sollte dieselbe sein. Ich habe eine allgemeine Vorstellung davon, wie das funktionieren soll:

  1. Öffnen Sie eine Steckdose an Port 80.
  2. Warten Sie, bis ein Client eine Anfrage gestellt hat.
  3. Lesen Sie die Anfrage (dh diese Person möchte die Seite "contact-us.html").
  4. Suchen und lesen Sie "contact-us.html".
  5. Sende einen HTML-Header und sende dann den Inhalt von "contact-us.html"
  6. Erledigt

Wie gesagt, ich glaube, das ist der Prozess, aber ich bin nicht 100% sicher. Dies führt mich zum Kern meiner Frage. Wie oder wo findet eine Person diese Informationen heraus?

Was wäre, wenn ich nicht nur einen HTTP-Server schreiben wollte, sondern einen FTP-Server, einen Chat-Server, einen Bildbetrachter usw.? Wie findet eine Person die genauen Schritte / Prozesse heraus, die zum Erstellen eines funktionierenden HTTP-Servers erforderlich sind?

Ein Mitarbeiter erzählte mir von dem HTML-Header, daher hätte ich das NIE ohne ihn gewusst. Er sagte auch etwas über die Übergabe jeder Anfrage an einen neuen Thread. Gibt es ein großes Buch darüber, wie die Dinge funktionieren? Gibt es ein Handbuch darüber, was es braucht, um ein HTTP-Server zu sein?

Ich habe versucht zu googeln, wie ein HTTP-Server funktioniert, aber die einzigen Antworten, die ich finden konnte, richteten sich gegen Ihren durchschnittlichen Joe und nicht gegen eine Person, die einen HTTP-Server programmieren möchte.

Brian
quelle
12
RFC2616 sollte alle wichtigen Details des HTTP-Protokolls für Sie haben. RFC959 ist dasselbe für FTP.
Mike
3
Sehen Sie sich alternativ (oder zusätzlich) an, wie vorhandene einfache HTTP-Server implementiert werden. Mehr als eine sollte Ihnen eine Vorstellung davon geben, welche Strukturen sinnvoll sind.
Michael Borgwardt
Michael Borgwardt - Ich würde das tun, aber ich neige dazu, das zu kopieren, was ich gesehen habe, wenn ich mir anderen Code ansehe. Ich hatte gehofft, in dieses Clean zu gehen, um zu sehen, ob ich es alleine schaffen könnte, ohne zu "schummeln".
Brian
Ihre Websuchphrase ist falsch. Sie richtet sich an Benutzer. Deshalb erhalten Sie durchschnittliches Joe-Zeug. Verwenden Sie stattdessen "Wie man einen HTTP-Server entwickelt" , um besser zu reflektieren, wonach Sie suchen. Ich habe es gerade mit Google ausprobiert und habe eine ganze Seite mit Referenzen bekommen, die dieses Zeug erklären
gnat
erwägen Sie, andere Implementierungen zu überprüfen, beispielsweise Apache Tomcat. Es ist wahrscheinlich mehr als Sie wollen, aber es wird eine Technik zur Lösung des Problems demonstrieren.
DwB

Antworten:

18

Verwenden Sie den RFC2616 , Luke!

Sie lesen den RFC 2616 unter HTTP / 1.1 und greifen zu.

Das war eigentlich ein Projekt in meinem dritten Jahr an der Ingenieurschule, und das ist so ziemlich die Projektbeschreibung.

Werkzeuge

Ihre Werkzeuge sind:

  • Grundlegendes Netzwerkmaterial (Socket-Management, Bindung, Adressen verstehen),
  • gutes Verständnis von I / O-Streams,
  • Viel Geduld, um ein paar zwielichtige Teile des RFC zu bekommen (MIME-Typen machen Spaß).

Überlegungen zum Spaß

Dinge, die für zusätzlichen Spaß zu beachten sind:

  • Plug-in-Architektur für CGI / Mod-Unterstützung,
  • Konfigurationsdateien für viele Dinge,
  • viele Experimente zur Optimierung von Transfers,
  • viele Experimente, um herauszufinden, wie die Auslastung in Bezug auf CPU und Arbeitsspeicher verwaltet werden kann, und um ein Versandmodell auszuwählen (Big Fat Even Loop, Single Accept Versand, Multi-Thread, Multi-Prozess usw.).

Habe Spaß. Es ist eine sehr coole Sache zu sehen.

Andere (einfachere) Vorschläge

  • FTP- Client / Server (meist RFC959, aber es gibt ältere Versionen und auch einige Erweiterungen)
  • IRC- Client / Server (meist RFC1459 , aber es gibt Erweiterungen)

Sie sind viel einfacher anzufassen und ihre RFCs sind viel einfacher zu verdauen (nun, der IRC hat einige seltsame Teile, aber der FTP ist ziemlich klar).

Sprachauswahl

Natürlich hängen einige Implementierungsdetails stark von der Sprache und dem Stack ab, die Sie zur Implementierung verwenden. Ich habe das alles in C angegangen, aber ich bin sicher, es kann genauso gut in anderen Sprachen Spaß machen (ok, vielleicht nicht so viel Spaß, aber immer noch Spaß).

Haylem
quelle
Ja, ich musste das auch als Projekt in der Schule machen. Es macht überraschend Spaß und gibt Ihnen mehr Wertschätzung für "industrielle Stärke" Webserver.
Evicatos
Die richtige Implementierung des Protokolls ist ein Teil. Die Architektur des Servers ist ein weiterer ...
tdammers
@tdammers: RFCs sind ziemlich gut. Wenn Sie ihnen folgen, haben Sie bereits einen anständigen Barebone-Entwurf, dem Sie folgen können. Sie haben immer noch viel Platz für Ihr Architekturdesign, aber es ist eine ziemlich gute und richtungsweisende Spezifikation.
Haylem
@ Haylem: ja und nein. Durch die Implementierung der Spezifikation erhalten Sie einen einzelnen Mitarbeiter, müssen diesen jedoch noch in ein größeres Bild einbetten. Wie kümmern Sie sich um die Behandlung gleichzeitiger Anforderungen? Wie liefern Sie nützliche Inhalte? Wo halten Sie den Staat?
Tdammers
@tdammers: me: You still have lots of room for your architecture design, but it's a pretty good and directive spec.Sie: yes and no. Ich denke, wir haben uns bereits eingegrenzt, als der RFC nicht alles war. Und ich denke, es liegt an der OP, diese Dinge zu entdecken, anstatt sie direkt darauf hinzuweisen, mehr als das, was ich bereits in den Abschnitten "Zusätzliche Überlegungen" und anderen Dingen getan habe. Es ist ein Teil des Spaßes.
Haylem
2

Jedes im Internet verwendete Protokoll ist in einem oder mehreren öffentlichen Dokumenten angegeben, die als RFCs bezeichnet werden. Alle aktuellen RFCs finden Sie unter http://www.rfc-editor.org/ , die auch über eine anständige Suchfunktion verfügen.

Das HTTP-Protokoll (Version 1.1) ist beispielsweise in RFC2616 und das FTP-Protokoll in RFC959 angegeben .

Die RFCs sind meiner Meinung nach sehr gut lesbar.

Bart van Ingen Schenau
quelle
Ich bin wirklich verwirrt mit diesen RFCs. Werden sie jemals HTTP-RFCs aktualisieren? In der obigen Antwort gibt es einen Kommentar, der besagt In 2014, RFC2616 was replaced by multiple RFCs (7230-7237).. So finden Sie die aktualisierten RFCs, wenn sie vorhanden sind? Soll ich nach einer Obsoleted byListe suchen?
SkrewEverything
@SkrewEverything: RFCs werden nicht aktualisiert, sondern durch neuere RFCs ersetzt. Sie finden die neueren in der Tat, indem Sie den Links "Veraltet von" folgen.
Bart van Ingen Schenau