HTTPサーバーの作成方法


16

タイトルにあるように、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サーバーをプログラミングしたい人ではなく、平均的なJoeを対象としたものでした。


12
RFC2616には、HTTPプロトコルのすべての詳細が含まれているはずです。RFC959はFTPでも同じです。
マイク

3
あるいは(または追加として)、既存の単純なHTTPサーバーがどのように実装されているかを見てください。複数の場合、どの構造が理にかなっているのかを知る必要があります。
マイケルボルグワード

Michael Borgwardt-私はそうしますが、他のコードを見たときに見たものをコピーする傾向があります。私は、自分自身で「不正行為」なしでそれを行うことができるかどうかを確認するために、このクリーンな状態に入ることを望んでいました。
ブライアン

あなたのウェブ検索フレーズが間違っていて、それがユーザーを対象にしているので、平均的なジョーのものを得ている理由です。代わりに:「HTTPサーバーの開発方法」ではなく、探しているものをよりよく反映します。私はGoogleだけでそれを試してみましたが、このようなものを説明する参照の完全なページを持って
ブヨ

他の実装、たとえばApache Tomcatのレビューを検討してください。おそらくあなたが望む以上のことをしますが、問題を解決するための1つのテクニックを示します。
-DwB

回答:


18

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

HTTP / 1.1RFC 2616を読んで、それを選びます

それは実際、工学部の3年目のプロジェクトであり、それはプロジェクトの説明のほとんどです。

道具

あなたのツールは:

  • 基本的なネットワーク関連のもの(ソケット管理、バインディング、アドレスの理解)、
  • I / Oストリームの十分な理解、
  • RFCの怪しい部分を取得するのに多くの忍耐が必要です(MIMEタイプは楽しいです)。

楽しい検討事項

さらなる楽しみのために考慮すべきこと:

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

楽しんで。見るのはとてもクールなことです。

その他の(簡単な)提案

  • FTPクライアント/サーバー(主にRFC959ですが、古いバージョンといくつかの拡張機能があります)
  • IRCクライアント/サーバー(主にRFC1459ですが、拡張機能があります)

最初に取り組む方がずっと簡単で、RFCの方がはるかに簡単です(IRCには奇妙な部分がありますが、FTPにはかなり明確です)。

言語選択

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


ええ、私もこれを学校でのプロジェクトとしてやらなければなりませんでした。それは驚くほど楽しいものであり、「産業上の強み」のWebサーバーに対する感謝の気持ちを与えてくれます。
エヴィカトス

プロトコルの実装を正しく行うことは、一部です。サーバーの設計は別です
...-tdammers

@tdammers:RFCは非常に優れているため、RFCをフォローすれば、すでにきちんとしたベアボーンブループリントがあります。アーキテクチャ設計にはまだ多くの余地がありますが、それはかなり良い指示仕様です。
ヘイレム

@ヘイレム:はい、いいえ。仕様を実装すると、個々のワーカーが得られますが、このワーカーをより大きな図に埋め込む必要があります。同時リクエストの処理はどのように行いますか?有用なコンテンツをどのように提供しますか?どこで状態を維持しますか?
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と呼ばれる1つ以上の公開ドキュメントで指定されています。現在のすべてのRFCはhttp://www.rfc-editor.org/で見つけることができます。これにはまともな検索機能もあります。

たとえば、HTTPプロトコル(バージョン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に置き換えられます。「Obsoleted by」リンクをたどると、実際に新しいものが見つかります。
バートヴァンインゲンシェ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.