Как написать HTTP-сервер?

17

Как видно из названия, я хотел бы написать HTTP-сервер. У меня вопрос такой, как мне это сделать? Я знаю, это звучит ОЧЕНЬ вообще и слишком "на высоком уровне", но в моем безумии есть метод. Я полагаю, что ответ на этот вопрос должен быть независимым от языка; То есть, независимо от того, какой язык я использую (например, C, C ++, Java и т. д.), ответ должен быть одинаковым. У меня есть общее представление о том, как это должно работать:

  1. Откройте сокет на порту 80.
  2. Подождите, пока клиент сделает запрос.
  3. Прочитайте запрос (то есть, этот человек хочет страницу "contact-us.html").
  4. Найдите и прочитайте "contact-us.html".
  5. Отправьте заголовок html, затем отправьте содержимое "contact-us.html"
  6. Выполнено

Как я уже сказал, я считаю, что это процесс, но я не уверен на 100%. Это подводит меня к сути моего вопроса. Как или где человек узнает эту информацию?

Что если я не хочу писать только HTTP-сервер, а что если я хочу написать FTP-сервер, чат-сервер, средство просмотра изображений и т. Д.? Как человек узнает точные шаги / процесс, необходимые для создания работающего HTTP-сервера?

Сотрудник рассказал мне о заголовке html, поэтому я бы никогда не узнал об этом без него. Он также сказал что-то о передаче каждого запроса в новую ветку. Есть ли большая книга о том, как все работает? Есть ли какое-то руководство о том, что нужно, чтобы стать HTTP-сервером?

Я попытался погуглить «как работает HTTP-сервер», но единственные ответы, которые я мог найти, были направлены на вашего среднего Джо, а не на человека, желающего запрограммировать HTTP-сервер.

Брайан
источник
12
RFC2616 должен иметь все мелкие детали протокола HTTP для вас. RFC959 это то же самое для FTP.
Майк
3
В качестве альтернативы (или дополнительно) посмотрите, как реализованы существующие простые HTTP-серверы. Более того, это должно дать вам представление о том, какие структуры имеют смысл.
Майкл Боргвардт
Майкл Боргвардт - я бы так и сделал, но у меня есть тенденция копировать то, что я видел, когда смотрю на другой код. Я надеялся пойти в эту чистоту, чтобы посмотреть, смогу ли я сделать это самостоятельно, не "обманывая".
Брайан
Ваша поисковая фраза неверна, она нацелена на пользователей, поэтому вы получаете средний материал Джо. Используйте вместо этого «как разработать HTTP-сервер» , оно лучше отражает то, что вы ищете. Я только что попробовал это с Google и получил полную страницу ссылок, объясняющих этот материал
gnat
рассмотреть возможность рассмотрения других реализаций, например, Apache Tomcat. Вероятно, он делает больше, чем вы хотите, но он продемонстрирует один метод для решения проблемы.
DwB

Ответы:

19

Используйте RFC2616 , Люк!

Вы читаете RFC 2616 по HTTP / 1.1 , и вы идете на это.

На самом деле это был проект на третьем курсе инженерной школы, и это в значительной степени описание проекта.

инструменты

Ваши инструменты:

  • базовые сетевые возможности (управление сокетами, привязка, понимание адресов),
  • хорошее понимание потоков ввода / вывода,
  • много терпения, чтобы получить некоторые тенистые части RFC (mime-типы - это весело).

Забавные Соображения

Что нужно учесть для дополнительного удовольствия:

  • архитектура плагина для добавления поддержки CGI / mod,
  • конфигурационные файлы для многих вещей,
  • много экспериментов о том, как оптимизировать переводы,
  • много экспериментов, чтобы увидеть, как управлять нагрузкой с точки зрения процессора и памяти, и выбрать модель диспетчеризации (большой жирный цикл, диспетчеризация с одним приемом, многопоточность, многопроцессорность и т. д.).

Веселиться. Это очень крутая вещь.

Другие (более простые) предложения

  • FTP клиент / сервер (в основном RFC959, но есть более старые версии, а также некоторые расширения)
  • IRC клиент / сервер (в основном RFC1459 , но есть расширения)

Сначала их гораздо проще решать, а их RFC намного легче переварить (ну, у IRC есть несколько странных частей, но у FTP довольно ясно).

Выбор языка

Конечно, некоторые детали реализации будут сильно зависеть от языка и стека, которые вы используете для его реализации. Я подошел ко всему этому в C, но я уверен, что это может быть весело и на других языках (хорошо, может быть, не так весело, но все же весело).

haylem
источник
Да, я должен был сделать это как проект еще в школе. Это удивительно весело и дает вам больше признательности за «промышленную силу» веб-серверов.
Evicatos
Получение правильной реализации протокола - одна часть; Архитектура сервера это еще один ...
tdammers
@tdammers: RFC довольно хороши, если вы последуете им, у вас уже есть приличный план действий. У вас все еще есть много места для вашего архитектурного дизайна, но это довольно хорошая и директивная спецификация.
Хайлем
@haylem: да и нет. Реализация спецификации дает вам отдельного работника, но вам все равно нужно встроить этого работника в более широкую картину - как вы заботитесь об обработке одновременных запросов? Как вы предоставляете полезный контент? Где вы храните государство?
tdammers
@tdammers: я: You still have lots of room for your architecture design, but it's a pretty good and directive spec.вы: yes and no. Я думаю, что мы уже сузились, чем RFC было не всем. И я думаю, что OP должен затем обнаружить эти вещи, а не прямо указывать на них больше, чем то, что я уже сделал в разделах «дополнительных соображений» и других вещах. Это часть веселья.
Хайлем
2

Каждый из протоколов, используемых в Интернете, указан в одном или нескольких общедоступных документах, называемых RFC. Все текущие RFC можно найти по адресу http://www.rfc-editor.org/ , который также имеет приличную функцию поиска.

Протокола НТТР (версия 1.1), например, указано в RFC2616 и протокол FTP указывается в RFC959 .

Что касается спецификации, то RFC, на мой взгляд, очень хорошо читаются.

Барт ван Инген Шенау
источник
Я действительно запутался с этим RFC. Будут ли они когда-нибудь обновлять HTTP RFC? В ответе выше есть комментарий, который заявляет In 2014, RFC2616 was replaced by multiple RFCs (7230-7237).. Итак, как найти обновленные RFC, если они есть? Должен ли я проверить Obsoleted byсписок?
SkrewEverything
@SkrewEverything: RFC не обновляются, но заменяются более новыми RFC. Вы действительно найдете более новые, перейдя по ссылкам «Устарел».
Барт ван Инген Шенау