Come scrivere un server HTTP?


17

Come dice il titolo, vorrei scrivere un server HTTP. La mia domanda è questa, come posso fare? So che sembra MOLTO generale e troppo "di alto livello", ma c'è un metodo per la mia follia. Una risposta a questa domanda dovrebbe essere, credo, linguaggio agnostico; vale a dire, indipendentemente dal linguaggio che uso (ad esempio, C, C ++, Java, ecc.) la risposta dovrebbe essere la stessa. Ho un'idea generale di come dovrebbe funzionare:

  1. Aprire un socket sulla porta 80.
  2. Attendere che un client faccia una richiesta.
  3. Leggi la richiesta (ovvero, questa persona desidera 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 sono sicuro al 100%. Questo mi porta al cuore della mia domanda. Come o dove una persona scopre queste informazioni?

E 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 i passaggi / processi esatti necessari per creare un server HTTP funzionante?

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

Ho provato a cercare su google "come funziona un server HTTP", ma le uniche risposte che ho trovato sono state orientate verso il tuo Joe medio e non verso una persona che voleva programmare un server HTTP.


12
RFC2616 dovrebbe avere per te tutti i dettagli essenziali del protocollo HTTP. RFC959 è la stessa cosa per FTP.
Mike,

3
In alternativa (o in aggiunta), guarda come vengono implementati i semplici server HTTP esistenti. Più di uno, questo dovrebbe darti un'idea di quali strutture abbiano senso.
Michael Borgwardt,

Michael Borgwardt - Lo farei, ma ho la tendenza a copiare ciò che ho visto quando guardo un altro codice. Speravo di andare in questo pulito, per vedere se potevo farlo da solo senza "barare".
Brian

la tua frase di ricerca web è sbagliata, è indirizzata agli utenti, ecco perché stai ottenendo roba media di Joe. Usa: "come sviluppare un server HTTP" invece, riflette meglio ciò che stai cercando. Ho appena provato con Google e ho ottenuto una pagina completa di riferimenti che spiegano questa roba
moscerino

prendere in considerazione la revisione di altre implementazioni, ad esempio apache tomcat. Probabilmente fa più di quanto desideri, ma dimostrerà una tecnica per risolvere il problema.
DW

Risposte:


19

Utilizzare RFC2616 , Luke!

Hai letto RFC 2616 su HTTP / 1.1 e ci provi.

Quello era in realtà un progetto durante il mio terzo anno alla scuola di ingegneria, e questa è praticamente la descrizione del progetto.

Utensili

I tuoi strumenti sono:

  • roba di rete di base (gestione socket, binding, capire indirizzi),
  • buona comprensione dei flussi di I / O,
  • molta pazienza per ottenere alcune parti ombreggiate dell'RFC (i tipi mime sono divertenti).

Considerazioni divertenti

Cose da considerare per un divertimento extra:

  • architettura plug-in per aggiungere il supporto CGI / mod,
  • file di configurazione per molte cose,
  • molta sperimentazione su come ottimizzare i trasferimenti,
  • molta sperimentazione per vedere come gestire il carico in termini di CPU e memoria e scegliere un modello di invio (big fat even loop, single accett dispatch, multi-thread, multi-process, ecc ...).

Divertiti. È una cosa molto interessante da guardare.

Altri suggerimenti (più semplici)

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

Sono molto più facili da affrontare per primi e i loro RFC sono molto più facili da digerire (beh, quello IRC ha alcune parti strane, ma quello FTP è abbastanza chiaro).

Scelta della lingua

Naturalmente, alcuni dettagli dell'implementazione dipenderanno in larga misura dalla lingua e dallo stack utilizzati 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).


Sì, ho dovuto farlo anche come progetto a scuola. È sorprendentemente divertente e ti dà più di un apprezzamento per i server Web "forza industriale".
Evicatos,

Ottenere correttamente l'implementazione del protocollo è una parte; architettare il server è un altro ...
tdammers

@tdammers: gli RFC sono abbastanza buoni, se li segui, hai già un progetto decente da barebone da seguire. Hai ancora molto spazio per il tuo progetto di architettura, ma è una specifica piuttosto buona e direttiva.
haylem,

@haylem: sì e no. L'implementazione delle specifiche ti dà un singolo lavoratore, ma devi comunque incorporarlo in un quadro più ampio: come ti occupi della gestione delle richieste simultanee? Come fornisci contenuti utili? Dove mantieni lo stato?
tdammers,

@tdammers: me: You still have lots of room for your architecture design, but it's a pretty good and directive spec.voi: yes and no. Penso che abbiamo già ristretto che la RFC non era tutto. E penso che spetti all'OP scoprire queste cose piuttosto che indicarle direttamente più di quello che ho già fatto nelle sezioni "considerazioni extra" e altre cose. Fa parte del divertimento.
haylem,

2

Ciascuno dei protocolli utilizzati su Internet è specificato in uno o più documenti pubblici chiamati RFC. Tutti gli RFC attuali sono disponibili all'indirizzo http://www.rfc-editor.org/ , che ha anche una discreta funzione di ricerca.

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

Secondo le specifiche, gli RFC sono, secondo me, molto leggibili.


Sono davvero confuso con questo RFC. Aggiorneranno mai gli RFC HTTP? Nella risposta sopra, c'è un commento che afferma In 2014, RFC2616 was replaced by multiple RFCs (7230-7237).. Quindi, come trovare gli RFC aggiornati se sono presenti? Devo controllare l' Obsoleted byelenco?
SkrewTutto il

@SkrewEverything: gli RFC non vengono aggiornati ma vengono sostituiti da nuovi RFC. Puoi trovare quelli più recenti seguendo i link "Obsoleted by".
Bart van Ingen Schenau,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.