Как написать 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, но я уверен, что это может быть весело и на других языках (хорошо, может быть, не так весело, но все же весело).


Да, я должен был сделать это как проект еще в школе. Это удивительно весело и дает вам больше признательности за «промышленную силу» веб-серверов.
— 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. Вы действительно найдете более новые, перейдя по ссылкам «Устарел».
— Барт ван Инген Шенау
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.