HTTPサーバを作る

きっかけ

最近、HTTPサーバを作っている。
と言っても、商用利用を考えているわけではなくて、学習目的だ。
何事も理解したいと思ったら自分で作ってみるのが一番だし、学習にはなるべく低レイヤーの方が良い。
明確にゴールを決めているわけではないけど、ひとまずGETメソッドでファイルコンテンツを返すところまで出来たので、区切りのエントリ。
f:id:nao_bamboo:20151005013024p:plain

プログラム

ソースはGitHubに置いてある。github.com

ので、細かい解説はしないが、ポイントだけ。

HTTPサーバと言っても、大きく2つのパートに分けられる。
1つはTCPコネクション周りで、ソース上はserver.cにあたる。
もう1つはHTTP周りの処理で、ソース上はhttp.cにあたる。

TCPパートは、コネクションに関する、socket -> bind -> listen -> acceptという定型的な処理があって、コネクションが成立した時のfork(並行サーバ)、コネクションが切断した時のシグナル処理なども含まれる。
この辺りの処理は、HTTPサーバに限らず、TCPによるコネクションを行うサーバであれば、ある程度共通になるだろう。

逆にHTTPパートは何をするかというと、TCPコネクション成立後のデータストリームの処理を行う。
HTTPだからと言って何か特別な処理をするわけではなくて、ソケットディスクリプタからreadしたデータ(HTTPリクエスト)に対して、HTTPプロトコルに則った処理を施して、ソケットディスクリプタにwrite (HTTPレスポンス) する処理を行う。
その意味では、HTTPとは正にプロトコル (規約) なんだなということを実感できる。

TCPについては以下の本が非常にためになった。
ピアソンエデュケーションでもう絶版かもしれないが。

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI

  • 作者: W.リチャードスティーヴンス,W.Richard Stevens,篠田陽一
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 1999/07
  • メディア: 単行本
  • 購入: 8人 クリック: 151回
  • この商品を含むブログ (37件) を見る

HTTPについては以下の本が参考になると思う。
WebAPI開発の時に利用していたが、HTTPサーバの開発にも役立つと思う。

Web API: The Good Parts

Web API: The Good Parts

HTTPクライアントには以下のアプリを利用している。

まとめ

まだ道半ばではあるものの、今回の開発を通じて得られた知識は非常に多い。
特にソケットを中心としたTCPに関する知識や、シグナルなどのLinuxカーネルに関する知識は、これまで曖昧だった部分も含めて理解を深めることができた。
また、Apacheやnginxが「きっとこう処理してるんだろうな」と想像できるようになったことは、当初の目的に適っている。
HTTP部分の処理についてはまだまだやるべきことがあるので、引き続き取り組んでいきたい。