Come scrivere un server HTTP?

13

Come dice il titolo, vorrei scrivere un server HTTP. La mia domanda è questa, come faccio a fare questo? So che questo suona MOLTO generale e troppo "di alto livello", ma c'è un metodo per la mia follia. Una risposta a questa domanda dovrebbe essere, credo, agnostica del linguaggio; nel senso, a prescindere dalla lingua che uso (ad es. C, C ++, Java, ecc.) la risposta dovrebbe essere la stessa. Ho un'idea generale di come dovrebbe funzionare:

  1. Apri un socket sulla porta 80.
  2. Attendi che un cliente faccia una richiesta.
  3. Leggi la richiesta (ad esempio, questa persona vuole la pagina "contact-us.html").
  4. Trova e leggi "contact-us.html".
  5. Invia un'intestazione HTML, quindi invia il contenuto di "contact-us.html"
  6. Fatto

Come ho detto, credo che questo sia il processo, ma non ne sono sicuro al 100%. Questo mi porta al cuore della mia domanda. Come o dove una persona scopre queste informazioni?

Che cosa succede se non volessi scrivere solo un server HTTP, e se volessi scrivere un server FTP, un server di chat, un visualizzatore di immagini, ecc.? In che modo una persona scopre gli esatti passaggi / processi necessari per creare un server HTTP funzionante?

Un collega mi ha parlato dell'intestazione HTML, quindi non l'avrei mai saputo senza di lui. Ha anche detto qualcosa sulla consegna di ogni richiesta a un nuovo thread. C'è un grande libro su come funzionano le cose? C'è qualche manuale di ciò che serve per essere un server HTTP?

Ho provato googling "come funziona un server HTTP", ma le uniche risposte che ho trovato erano orientate verso il tuo Joe medio, e non verso una persona che desidera programmare un server HTTP.

    
posta Brian 07.06.2013 - 16:48
fonte

2 risposte

16

Utilizza RFC2616 , Luke!

Leggi RFC 2616 su HTTP / 1.1 , e tu vai per questo.

Questo era in realtà un progetto nel mio terzo anno di scuola di ingegneria, ed è praticamente la descrizione del progetto.

Strumenti

I tuoi strumenti sono:

  • elementi di networking di base (gestione socket, associazione, comprensione degli indirizzi),
  • buona comprensione dei flussi di I / O,
  • tanta pazienza per ottenere alcune parti ombreggiate della RFC (i mimo-tipi sono divertenti).

Considerazioni sugli aspetti divertenti

Cose da considerare per divertimento in più:

  • architettura plug-in per aggiungere supporto CGI / mod,
  • file di configurazione per, beh, molte cose,
  • molti esperimenti su come ottimizzare i trasferimenti,
  • un sacco di sperimentazione per vedere come gestire il carico in termini di CPU e memoria e scegliere un modello di dispacciamento (ciclo di grandi fatie, invio singolo accettato, multi-thread, multi-processo, ecc ...).

Divertiti. È una cosa molto interessante da guardare.

Altri suggerimenti (più semplici)

  • FTP client / server (principalmente RFC959 ma ci sono versioni precedenti e anche alcune estensioni)
  • IRC client / server (principalmente RFC1459 , ma ci sono estensioni)

Sono molto più facili da affrontare per primi, e le loro RFC sono molto più facili da digerire (beh, l'IRC ha alcune parti strane, ma quella FTP è abbastanza chiara).

Scelta della lingua

Naturalmente, alcuni dettagli di implementazione dipenderanno molto dalla lingua e dallo stack che utilizzi per implementarlo. Mi sono avvicinato a tutto ciò in C, ma sono sicuro che può essere divertente anche in altre lingue (ok, forse non tanto divertente, ma comunque divertente).

    
risposta data 07.06.2013 - 18:01
fonte
2

Ciascuno dei protocolli utilizzati su Internet è specificato in uno o più documenti pubblici chiamati RFC. Tutti gli RFC correnti possono essere trovati all'indirizzo link , che ha anche una funzione di ricerca decente.

Il protocollo HTTP (versione 1.1), ad esempio, è specificato in RFC2616 e viene specificato il protocollo FTP in RFC959 .

Come specifica, le RFC sono, a mio parere, molto ben leggibili.

    
risposta data 07.06.2013 - 18:10
fonte

Leggi altre domande sui tag