web-dev-qa-db-ja.com

HTTPサーバーを作成する方法

タイトルのとおり、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サーバーをプログラムしたい人には向けられていませんでした。

17
Brian

RFC2616 を使用してください、ルーク!

HTTP/1.1RFC 2616 を読んで、それを実行します。

それは実際には工学部3年生のプロジェクトであり、それはまさにプロジェクトの説明です。

ツール

あなたのツールは:

  • 基本的なネットワーキング関連(ソケット管理、バインディング、アドレスの理解)、
  • i/Oストリームの十分な理解
  • rFCのいくつかの怪しげな部分を取得するための多くの忍耐(MIMEタイプは楽しいです)。

楽しい考察

追加の楽しみのために考慮すべき事柄:

  • cGI/modサポートを追加するためのプラグインアーキテクチャ
  • まあ、多くのもののための設定ファイル、
  • 転送を最適化する方法に関する多くの実験、
  • cPUとメモリの観点から負荷を管理する方法を確認し、ディスパッチモデル(ビッグファットイーブンループ、シングルアクセプトディスパッチ、マルチスレッド、マルチプロセスなど)を選択するための多くの実験。

楽しんで。見ていてとてもクールです。

その他の(よりシンプルな)提案

それらは最初に取り組む方がはるかに簡単で、RFCはダイジェストがはるかに簡単です(まあ、IRC 1つはいくつかの奇妙な部分がありますが、FTPはかなり明確です)。

言語の選択

もちろん、一部の実装の詳細は、実装に使用する言語とスタックに大きく依存します。私はすべてCでアプローチしましたが、他の言語でも同じように楽しくなると確信しています(まあ、それほど楽しくはないかもしれませんが、それでも楽しいでしょう)。

19
haylem

インターネットで使用される各プロトコルは、RFCと呼ばれる1つ以上の公開ドキュメントで指定されています。現在のすべてのRFCは http://www.rfc-editor.org/ にあります。これにはまともな検索機能もあります。

たとえば、HTTPプロトコル(バージョン1.1)は RFC2616 で指定され、FTPプロトコルは RFC959 で指定されます。

仕様が進むにつれ、私の意見では、RFCは非常に読みやすくなっています。