Jak napisać serwer HTTP?

17

Jak mówi tytuł, chciałbym napisać serwer HTTP. Moje pytanie brzmi: jak to zrobić? Wiem, że to brzmi BARDZO ogólnie i zbyt „na wysokim poziomie”, ale w moim szaleństwie jest metoda. Odpowiedź na to pytanie powinna być, jak sądzę, agnostyczna wobec języka; czyli bez względu na to, jakiego języka używam (np. C, C ++, Java itp.), odpowiedź powinna być taka sama. Mam ogólne pojęcie o tym, jak to powinno działać:

  1. Otwórz gniazdo na porcie 80.
  2. Poczekaj, aż klient złoży żądanie.
  3. Przeczytaj żądanie (tj. Ta osoba chce strony „contact-us.html”).
  4. Znajdź i przeczytaj „contact-us.html”.
  5. Wyślij nagłówek HTML, a następnie wyślij treść „contact-us.html”
  6. Gotowy

Tak jak powiedziałem, wierzę, że to jest proces, ale nie jestem w 100% pewien. To prowadzi mnie do sedna mojego pytania. Jak lub gdzie dana osoba znajduje te informacje?

Co jeśli nie chciałbym pisać tylko na serwerze HTTP, co jeśli chciałbym napisać serwer FTP, serwer czatu, przeglądarkę zdjęć itp.? W jaki sposób osoba dowiaduje się, jakie dokładnie kroki / proces są potrzebne do utworzenia działającego serwera HTTP?

Współpracownik powiedział mi o nagłówku HTML, więc NIGDY nie wiedziałbym tego bez niego. Powiedział także coś o przekazaniu każdej prośby do nowego wątku. Czy jest jakaś duża książka o tym, jak to działa? Czy istnieje instrukcja obsługi serwera HTTP?

Próbowałem google „jak działa serwer HTTP”, ale jedyne odpowiedzi, jakie mogłem znaleźć, były skierowane do przeciętnego Joe, a nie do osoby, która chce zaprogramować serwer HTTP.

Brian
źródło
12
RFC2616 powinien mieć dla Ciebie wszystkie szczegółowe szczegóły protokołu HTTP. RFC959 to samo dla FTP.
Mike
3
Alternatywnie (lub dodatkowo) spójrz na sposób implementacji istniejących prostych serwerów HTTP. Więcej niż jeden powinien dać ci pojęcie, jakie struktury mają sens.
Michael Borgwardt,
Michael Borgwardt - zrobiłbym to, ale mam tendencję do kopiowania tego, co widziałem, gdy patrzę na inny kod. Miałem nadzieję, że przejdę do tego czystego, żeby sprawdzić, czy dam radę zrobić to sam, bez „oszukiwania”.
Brian
wyszukiwane hasło jest niepoprawne, jest skierowane do użytkowników, dlatego dostajesz przeciętne rzeczy Joe. Użyj: „jak stworzyć serwer HTTP” , lepiej odzwierciedla to, czego szukasz. Właśnie wypróbowałem to w Google i dostałem pełną stronę z odnośnikami, które wyjaśniają to
gnat,
rozważ przejrzenie innych implementacji, na przykład apache tomcat. Prawdopodobnie robi więcej, niż chcesz, ale pokaże jedną technikę rozwiązania problemu.
DwB

Odpowiedzi:

19

Użyj RFC2616 , Luke!

Czytasz RFC 2616 na HTTP / 1.1 i idziesz na to.

To był właściwie projekt na trzecim roku w szkole inżynierskiej, i to w zasadzie opis projektu.

Przybory

Twoje narzędzia to:

  • podstawowe rzeczy związane z siecią (zarządzanie gniazdami, wiązanie, zrozumienie adresów),
  • dobra znajomość strumieni we / wy,
  • dużo cierpliwości, aby zdobyć jakieś podejrzane części RFC (typy MIME są zabawne).

Rozważania na temat zabawy

Rzeczy do rozważenia dla dodatkowej zabawy:

  • architektura wtyczek, aby dodać obsługę CGI / mod,
  • pliki konfiguracyjne dla, cóż, wielu rzeczy,
  • dużo eksperymentów na temat optymalizacji transferów,
  • wiele eksperymentów, aby zobaczyć, jak zarządzać obciążeniem pod względem procesora i pamięci, a także wybrać model wysyłki (duża, nawet gruba pętla, pojedyncza wysyłka, wielowątkowa, wieloprocesowa itp.).

Baw się dobrze. To bardzo fajna rzecz do oglądania.

Inne (prostsze) sugestie

  • Klient / serwer FTP (głównie RFC959, ale istnieją starsze wersje, a także niektóre rozszerzenia)
  • Klient / serwer IRC (głównie RFC1459 , ale istnieją rozszerzenia)

Najpierw są o wiele łatwiejsze do rozwiązania, a ich RFC są o wiele łatwiejsze do strawienia (cóż, IRC ma kilka dziwnych części, ale FTP jest dość wyraźny).

Wybór języka

Oczywiście niektóre szczegóły implementacji będą w dużym stopniu zależne od języka i stosu używanego do implementacji. Podszedłem do tego wszystkiego w C, ale jestem pewien, że może być równie fajnie w innych językach (ok, może nie tak fajnie, ale nadal fajnie).

Haylem
źródło
Tak, musiałem to zrobić jako projekt jeszcze w szkole. To zaskakująco zabawne i bardziej docenia serwery sieciowe o „sile przemysłowej”.
Evicatos,
Właściwe wdrożenie protokołu to jedna część; architektowanie serwera to kolejne ...
tdammers
@tdammers: RFC są całkiem niezłe, jeśli je zastosujesz, masz już przyzwoity plan na boso. Nadal masz dużo miejsca na projektowanie architektury, ale jest to całkiem niezła specyfikacja.
haylem,
@haylem: tak i nie. Wdrożenie specyfikacji daje indywidualnego pracownika, ale nadal musisz osadzić go na szerszym obrazie - jak zadbać o obsługę równoczesnych żądań? Jak udostępniasz przydatne treści? Gdzie utrzymujesz stan?
tdammers
@tdammers: Ja: You still have lots of room for your architecture design, but it's a pretty good and directive spec.Ty: yes and no. Myślę, że już się zawęziliśmy, niż RFC to nie wszystko. I myślę, że to OP musi odkryć te rzeczy, zamiast bezpośrednio wskazywać je bardziej niż to, co już zrobiłem w sekcjach „dodatkowe uwagi” i inne rzeczy. To część zabawy.
haylem,
2

Każdy z protokołów używanych w Internecie jest określony w co najmniej jednym dokumencie publicznym zwanym RFC. Wszystkie obecne RFC można znaleźć na stronie http://www.rfc-editor.org/ , która ma również funkcję porządnego wyszukiwania.

Na przykład protokół HTTP (wersja 1.1) jest określony w RFC2616, a protokół FTP jest określony w RFC959 .

Według specyfikacji, RFC są, moim zdaniem, bardzo dobrze czytelne.

Bart van Ingen Schenau
źródło
Jestem naprawdę mylony z tymi RFC. Czy kiedykolwiek zaktualizują RFC HTTP? W powyższej odpowiedzi znajduje się komentarz, który stwierdza In 2014, RFC2616 was replaced by multiple RFCs (7230-7237).. Jak więc znaleźć zaktualizowane RFC, jeśli są obecne? Czy powinienem sprawdzić Obsoleted bylistę?
SkrewWszystko
@SkrewWszystko: RFC nie są aktualizowane, ale są zastępowane nowszymi RFC. Rzeczywiście nowsze można znaleźć, podążając za linkami „Przestarzałe przez”.
Bart van Ingen Schenau