「自分、組み込み屋ですので」でネットワークのことから逃げられる時代はもう終わった・・・。
いや、ずいぶん前に終わっていたのだが、認める勇気がなかったのだろう。
ネットワークは、socketを開いてlistenさせ、相手側はconnectすればあとはプロトコルで勝手にやればよい、くらいの知識で十分だったのだが、もうちょっと上の方も知らないと話に追いつけないのだ。
MQTTは実装したことがあるので調べ直せば思い出しそうだが、やはりHTTPをスルーはできまい。
というわけで、今回はHTTPについてさらっとまとめよう。
HTTPといえば、やはりブラウザだろう。
昔はMosaicというブラウザがあってね、SunのSS10で見せてもらったことが記憶に残っているよ。
HyperText Transfer Protocolの略で、HTTP。
https://ja.wikipedia.org/wiki/Hypertext_Transfer_Protocol
https://tools.ietf.org/html/rfc2616
https://developer.mozilla.org/ja/docs/Web/HTTP/Overview
3番目に載せたMozillaの説明がわかりやすそうだ。
- クライアント・サーバプロトコル
- クライアントのメッセージ:リクエスト
- サーバのメッセージ:レスポンス
- 直接クライアントとサーバが接続することもあるし、間にプロシキが挟まることもある。
- プロトコルとしてはリクエスト間に関係性は無い(ステートレス)。ただCookieによってセッションという概念を持ち込むことはできる。
クライアントとサーバのフローはそれぞれメッセージを投げるだけなので、あとはメッセージの仕様を確認すればなんとなくHTTPがわかったと思ってよいのでは無かろうか。
HTTPメッセージ
https://developer.mozilla.org/ja/docs/Web/HTTP/Overview#http_messages
- ASCII文字列と改行
- 改行はCR/LF(RFC2616 2.2)
- が、解析時はCRを無視してLFで判定することを推奨(RFC2616 19.3)
- HTTPヘッダインジェクションという攻撃があるらしい
- 1行目がメッセージの種別で、2行目からがヘッダ、そこから空行(つまりCR/LFが2回続く)の後がボディ。
リンク先の画像ではちょっと分かりづらいかもしれんが、1行目はこう。
Method + (space) + Path + (space) + Version of the protocol
Pathは、たとえばcurlコマンドで "curl http://127.0.0.1/time" とアクセスしたとすると、
GET /time HTTP/1.1
となった。
むかし組み込みのHTTPサーバをデバッグしたこともあるし、デバッグ用にHTTPサーバをPocoライブラリ使って作業したことがあるのだが、暗号の処理と同じ感じ匂いがしている。
危ないので自分で実装するものじゃ無いよね、というやつだ。
ただ、自分で実装しない=自分で知っておく必要はない、ではないのだ。まあ万人が知っておく必要があるというものでもないとは思うが、知っていると楽しいと思うのだよ。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。