Como escrever um servidor HTTP?

17

Como o título diz, eu gostaria de escrever um servidor HTTP. Minha pergunta é esta, como faço isso? Eu sei que isso soa muito geral e muito "alto nível", mas existe um método para a minha loucura. Uma resposta a essa pergunta deve ser, acredito, independente da linguagem; significando, não importa qual idioma eu use (por exemplo, C, C ++, Java etc.), a resposta deve ser a mesma. Eu tenho uma idéia geral de como isso deve funcionar:

  1. Abra um soquete na porta 80.
  2. Aguarde um cliente fazer uma solicitação.
  3. Leia a solicitação (ou seja, essa pessoa deseja a página "contact-us.html").
  4. Encontre e leia "contact-us.html".
  5. Envie um cabeçalho html e envie o conteúdo de "contact-us.html"
  6. Feito

Como eu disse, acredito que esse seja o processo, mas não tenho 100% de certeza. Isso me leva ao cerne da minha pergunta. Como ou onde uma pessoa encontra essas informações?

E se eu não quisesse escrever apenas um servidor HTTP, e se eu quisesse escrever um servidor FTP, um servidor de bate-papo, um visualizador de imagens etc.? Como uma pessoa descobre as etapas / processos exatos necessários para criar um servidor HTTP funcional?

Um colega de trabalho me contou sobre o cabeçalho html, então eu nunca saberia disso sem ele. Ele também disse algo sobre entregar cada solicitação a um novo tópico. Existe algum grande livro de como as coisas funcionam? Existe algum manual do que é necessário para ser um servidor HTTP?

Tentei pesquisar no Google "como funciona um servidor HTTP", mas as únicas respostas que pude encontrar foram voltadas para o Joe médio, e não para uma pessoa que deseja programar um servidor HTTP.

Brian
fonte
12
O RFC2616 deve ter todos os detalhes básicos do protocolo HTTP para você. RFC959 é a mesma coisa para FTP.
Mike
3
Como alternativa (ou adicionalmente), observe como os servidores HTTP simples existentes são implementados. Mais de um, isso deve lhe dar uma idéia de quais estruturas fazem sentido.
Michael Borgwardt
Michael Borgwardt - Eu faria isso, mas tenho a tendência de copiar o que vi quando olho para outro código. Eu esperava entrar nisso limpo, para ver se eu poderia fazer isso sozinho, sem "trapacear".
7273 Brian
sua frase de pesquisa na web está errada, é direcionada aos usuários, é por isso que você está obtendo informações comuns sobre o Joe. Use: "como desenvolver um servidor HTTP" , em vez disso, reflete melhor o que você está procurando. Eu apenas tentei com o Google e obtive uma página completa de referências que explicam essas coisas #
586
considere revisar outras implementações, por exemplo, apache tomcat. Provavelmente faz mais do que você deseja, mas demonstrará uma técnica para resolver o problema.
DWB

Respostas:

19

Use o RFC2616 , Luke!

Você lê o RFC 2616 no HTTP / 1.1 e segue em frente.

Na verdade, esse foi um projeto no meu terceiro ano na escola de engenharia, e essa é basicamente a descrição do projeto.

Ferramentas

Suas ferramentas são:

  • material básico de rede (gerenciamento de soquete, ligação, entender endereços),
  • bom entendimento dos fluxos de E / S,
  • muita paciência para obter algumas partes obscuras do RFC (tipos mímicos são divertidos).

Considerações divertidas

Coisas a considerar para se divertir extra:

  • arquitetura de plug-in para adicionar suporte a CGI / mod,
  • arquivos de configuração para, bem, muitas coisas,
  • muita experimentação sobre como otimizar transferências,
  • muita experimentação para ver como gerenciar a carga em termos de CPU e memória e escolher um modelo de despacho (loop grande e uniforme, despacho de aceitação única, multithread, multiprocess, etc ...).

Diverta-se. É uma coisa muito legal de se ver.

Outras sugestões (mais simples)

  • Cliente / servidor FTP (principalmente RFC959, mas existem versões mais antigas e também algumas extensões)
  • Cliente / servidor de IRC (principalmente RFC1459 , mas existem extensões)

Eles são muito mais fáceis de lidar primeiro, e seus RFCs são muito mais fáceis de digerir (bem, o IRC tem algumas partes estranhas, mas o FTP é bastante claro).

Escolha de idioma

Obviamente, alguns detalhes da implementação dependerão muito do idioma e da pilha que você usa para implementá-lo. Abordei tudo isso em C, mas tenho certeza de que pode ser divertido também em outros idiomas (ok, talvez não seja tão divertido, mas ainda assim divertido).

haylem
fonte
Sim, eu tive que fazer isso como um projeto de volta à escola também. É surpreendentemente divertido e oferece uma apreciação maior dos servidores da web "robustos".
Evicatos
Acertar a implementação do protocolo é uma parte; arquitetar o servidor é outro ...
tdammers
@ Tdammers: RFCs são muito bons, se você os seguir, você já tem um plano decente para seguir. Você ainda tem muito espaço para o design da arquitetura, mas é uma especificação bastante boa e diretiva.
precisa saber é
@haylem: sim e não. A implementação das especificações fornece a você um trabalhador individual, mas você ainda precisa incorporá-lo em uma imagem maior - como você cuida de lidar com solicitações simultâneas? Como você fornece conteúdo útil? Onde você mantém o estado?
tdammers
@tdammers: me: You still have lots of room for your architecture design, but it's a pretty good and directive spec.você: yes and no. Acho que já reduzimos o RFC que não era tudo. E acho que cabe ao OP descobrir essas coisas, em vez de apontá-las diretamente mais do que já fiz nas seções "considerações extras" e outras coisas. Faz parte da diversão.
precisa saber é
2

Cada um dos protocolos usados ​​na internet é especificado em um ou mais documentos públicos chamados RFCs. Todos os RFCs atuais podem ser encontrados em http://www.rfc-editor.org/ , que também possui uma função de pesquisa decente.

O protocolo HTTP (versão 1.1), por exemplo, é especificado no RFC2616 e o protocolo FTP é especificado no RFC959 .

Conforme especificação, os RFCs são, na minha opinião, muito bem legíveis.

Bart van Ingen Schenau
fonte
Estou realmente confuso com este RFCs. Será que eles atualizarão HTTP RFCs? Na resposta acima, há um comentário que afirma In 2014, RFC2616 was replaced by multiple RFCs (7230-7237).. Então, como encontrar as RFCs atualizadas, se estiverem presentes? Devo verificar a Obsoleted bylista?
SkrewEverything
@ SkrewEverything: os RFCs não são atualizados, mas são substituídos por RFCs mais novos. Você encontra os mais novos seguindo os links "Obsoleto por".
Bart van Ingen Schenau