[7] HTTP (Hypertext Transfer Protocol) は、 World Wide Web で用いられているネットワークプロトコル (転送プロトコル) です。 元々はハイパーテキストの転送のためのクライアント鯖型のアプリケーション層プロトコルでしたが、 現在ではハイパーテキストに限らず様々なデータの転送に用いられています。 インターネット技術を流用したシステムではセッション層 (あるいはオーバーレイ・ネットワーク層のプロトコルであるかのように用いられることすらあります。
[69] RFC は HTTP を「Hypertext Transfer Protocol」の略と説明しています。
[8] HTTP protocol と書くのは変だと思うけど、仕様書 (例えば RFC 2616) も使ってるしなー。
[9] HTTP には HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2 の4つの版があります。
[10] 現実に Web で用いられている鯖やクライアント (HTTP では通常利用者エージェント (UA) と呼ばれます。) はこのうち1つ以上に対応しています (ほとんどの場合、最低でも HTTP/1.0 に対応しています)。 ただし HTTP は非常に様々な機能を含んだ膨大な仕様で、 そのうちのどの部分に対応しているかは実装により異なります。
[11] HTTP/0.9 は HTTP/1.x と互換性がありません。 HTTP/1.0 と HTTP/1.1 はメッセージのレベルでの互換性がありますが、 TCP 接続の利用方法が異なります (HTTP/1.1 の方が高機能です)。 HTTP/2 は HTTP/1.1 以下と直接的な互換性はありませんが、HTTP/2 におけるメッセージの意味は HTTP/1.1 の定義をそのまま使っています。
[30] 仕様書としては、 HTTP/0.9 と HTTP/1.0 が RFC 1945 に記述されていますが、その後放置されています。 HTTP/1.1 は RFC 7230 などに記述されています。 HTTP/2 は RFC 7540 などで定義されています。 詳しくはそれぞれの項を参照してください。
[60] サーバーによっては HTTP/1.0 のみや HTTP/1.0 と HTTP/1.1 のみ、 あるいは HTTP/1.1 以下のみに対応するものがあります。 従って、これらの版のすべてに対応できないクライアントは、 Web互換ではありません。
[61] クライアントにも HTTP/1.0 のみや HTTP/1.0 と HTTP/1.1 のみ、 あるいは HTTP/1.1 以下しか対応しないものもあります。 HTTP/2 のみしか実装しないサーバーは、 Web互換ではありません。
[32] HTTP には色々な役割のプログラムが関与します。
[31] HTTP はメッセージとその色々な構成要素を含んでいます。
[1] 処理モデルは各構成要素の項に説明があります。
[44] しばしば HTTP は“状態を持たない”と説明されます。 HTTP によるクライアントと鯖の通信は要求と応答の組が1単位となっており、 複数の要求と応答の組同士は直接影響しあわないという意味で、 HTTP は状態を持たないプロトコルです。
HELO
、
認証、送受信者の指定、本文の送信といった複数の命令のやり取りの組み合わせがクライアントと鯖の間で発生します。また IRC は認証の後長時間接続を維持した状態で、
適宜命令等のやり取りが発生します。これらプロトコルの“状態”をクライアントと鯖が保持する必要があるプロトコルに対して、
HTTP/1 はプロトコルもその実装も非常に簡潔となっています。[46] しかしながら、当然ながらクライアントも鯖も、ある要求を送受信しはじめてからそれに対する応答を送受信し終えるまで、
その要求と応答に関する“状態”を保持し続ける必要はあります。
1xx
応答を使う場合や
multipart/x-mixed-replace
を使う場合、
COMET の場合など、より複雑な状況も存在しています。
HTTP/2 ではこれがストリームなる明示的な状態の元で管理されています。
[47] また持続的接続を使う場合には、要求と応答の組を超えてある種の“状態”を接続単位で維持し続けることになります。 HTTP/1.1 と HTTP/2 ではこれが標準機能となっています。
[49] よりマクロに、HTTP を使うシステム全体として見た時には、様々な“状態” を鯖やクライアントが管理していることがあります。
[54] そのような状態を HTTP 上で実装することは好ましくないと考える人もいます。 例えば Cookie は HTTP の状態を持たない性質を破壊する不適切な技術と考える人もいます。 しかしそのような考え方はあまり現実的ではなく、ほとんど支持されていません。
HTTP
[33] protocol
の値 HTTP
は、HTTP を表すプロトコル名として定義されています >>34, >>37。
[36] しかし Upgrade:
における処理モデルは明記されていません。
HTTP/1.1 で Upgrade: HTTP/1.1
と指定されたときや、
HTTP/0.9 や HTTP/1.0 や HTTP/2.0 を指定した時にどうなるべきかは明記されていません。
[18] HTTP を含む Web は REST 体系様式の1実現値であると HTTP や REST の考案者は主張しています。
[51] 実際には HTTP は非 REST 的な使われ方をすることもよくあります。 またアプリケーションの HTTP の使い方を 「REST API」や「REST ベース」などと修飾することが良くありますが、 その意味するところは文脈により様々で、バズワードの類と理解する方が正しいかもしれません。
[56] HTTP の URL については、 HTTPにおけるURLを参照。
[55] HTTP の下位層として用いられるネットワークプロトコルについては、 HTTP接続や HTTPS を参照。
[66] HTTP は歴史的には TCP/IP 上で用いられてきました。
[67] TLS (SSL) 上で HTTP を使う HTTPS は、90年代から存在していましたが、 決済など安全性が特に重要な場面でのみ限定的に用いられていました。しかし10年代に入って Web のセキュリティーが特に深刻な問題と認識されるようになり、徐々に HTTPS への移行が進んでいます。
[68] TLS を使わない素の HTTP は、原則として用いるべきではありません。 HTTPS を使うことを基本とするべきです。
[4] 色々なプロトコルが HTTP を下位層として使っています。
[58] HTTP を使って Webアプリケーションの操作を機械的に指示する手段を提供するものを
Web API などと呼びます。多くの Webアプリケーションが JSON、XML、
Atom、application/x-www-form-urlencoded
などの文書形式や
OAuth、基本認証などの認証方式と HTTP を組み合わせた API を提供しています。
[29] 派生, HTTPもどきといっても色々な度合いがありますが...
[43] 大きく改変したもの
[57] HTTP は Web を代表するプロトコルであり、仕様上の (そして多くの実装における) データ構造は HTTP 以外も HTTP に基づく形で表されます。 HTML Standard は or equivalent のような形でこれを表現しています。 Fetch Standard は要求や応答などの HTTP に由来する内部データ構造を規定しています。 Fetch の API や XHR を通じて著者もこうした HTTP “風” API にアクセスできます。
[75] なんでこんなに HTTPもどきが作られたのか、今から考えると不思議だけど、当時の時代の雰囲気、一過性のブームみたいなものだと思うしかないなあ。
[76] 似せるなら似せるでもっと似せれば実装を共通化できるとか同じサーバーで同時提供できるとかメリットが出てくるはずなんだけど。 でもそうなるとHTTPそのものを使えばええやんって話にもなるし、 新しいプロトコルを作ったぞ新製品だぞすごいんだぞ感みたいなのあんまりでないから、 マーケティング的に(商品売る的な意味でも研究開発部門から会社経営層へのアピール的な意味でも)見劣りしちゃうとかの事情もありそうやね。
[77] HTTP に限ったことではなく、同時期に HTML に似せたHTMLもどきが大量に出てきたし (これは応用ごとに必要な語彙が違ってくるので意味はある(こともある))、 少し前の時代にはインターネットメールメッセージもどきがたくさん出てきてたし(HTTPもその1つ)、 あるいはSMTPもどきみたいなのもたくさんあるし、 新しい技術が流行ったら真似して似たようなのを作るというのはわりと普遍的な考え方なのかもしれない。 と思うけど最近はそういうのあんまりないなあ。 ベンダー中立のプロトコルが流行る、っていうのがあんまりない時代になってしまったからか?
[78] 似て非なるのがたくさんある、という状況は初期学習を容易にする(とっつきやすくなる)という大きなメリットがある反面、 他の似たものに引っ張られて正しい理解が深まらないとか、なんとなくで済ませられるので正確な仕様が出てこなくなるとか、 元の仕様の改正にもどきの方が追随できなくなって似てるが似てたになってメリットがなくなるとか、 そういうデメリットはいろいろある。
[62] HTTP の API については、 HTTPサーバーやHTTPクライアントを参照。
[12] HTTP は元々 TimBL により考案され、 CERN を中心とする WWW プロジェクトにより発展させられてきましたが、 IETF に HTTP WG (ietf-http) が設けられてからは主にそこで標準化が進められてきました。
[13] IETF HTTP WG は当時の実装の大枠を反映して HTTP/0.9 と HTTP/1.0 を規定した RFC 1945 を情報提供RFC とした後、改良を加えた新版 HTTP/1.1 を提案標準 RFC 2068 として発行しました。 RFC 2068 は更に改訂されて原案標準 RFC 2616、RFC 2617 となりました。
[14] HTTP については中核仕様の他に様々な拡張・派生仕様が策定されました。例えば IETF WebDAV WG (ietf-webdav) は HTTP をストレージ的に利用可能な WebDAV 仕様を HTTP の拡張として定義しました。
[15] その他、 IETF では HTTP 派生仕様として RTSP や SIP や MSRP が標準化されています。
[2] 90年代末に HTTP の新しい版として HTTP-NG が検討されていましたが、 失敗に終わりました。
[16] 2008年頃には HTTP/1.1 仕様の改訂の機運が高まり、 ietf-httpbis WG が設置されています。
[17] HTTP の標準化は基本的に IETF で行われていますが、歴史的経緯により W3C が積極的に関わっています。最近では HTML5 機能などに関して WHATWG 界隈での活動も活発になっています。
[19] IRC logs: freenode / #whatwg / 20091013 ( 版) http://krijnhoetmer.nl/irc-logs/whatwg/20091013
[20] Design Issues for HTTP ( 版) http://www.w3.org/Protocols/DesignIssues.html
[21] Hypertext Transfer Protocol Version 1.x ( 版) http://www.w3.org/Protocols/HTTP/
[22] HTTP - Hypertext Transfer Protocol Overview ( 版) http://www.w3.org/Protocols/
[23] HTTP Problem Statement ( 版) http://www.w3.org/Protocols/HTTP-NG/951005_Problem.html
[24] ( ( 版)) http://cantor1.mathematik.uni-halle.de/doc/CERN/doc/http-spec.txt
[25] ( ( 版)) http://cantor1.mathematik.uni-halle.de/doc/CERN/doc/draft-ietf-iiir-http-00.txt
[26] Information on http://cantor1.mathematik.uni-halle.de/doc/CERN/doc/draft-ietf-iiir-http-00.txt ( ( 版)) http://suika.fam.cx/gate/2007/schema/schema/536186f16bc0128d84e7690b94f18e92/prop.html
[27] Web Applications 1.0 r2499 Always put javascript: into the online whitelist. Make some comments about HTML and HTTPS security. Vaguely define 'or equivalent' for HTTP concepts. ( ( 版)) http://html5.org/tools/web-apps-tracker?from=2498&to=2499
[28] crwlr.net - server header information index | beta ( ( 版)) http://crwlr.net/
[38] httpwg/http-extensions ( ( 版)) https://github.com/httpwg/http-extensions
[39] Work in Progress ( ( 版)) https://httpwg.github.io/wip/
[53] draft-aboba-rtp-http-02 - Payload Format for HTTP Encoding in RTP ( ( 版)) https://tools.ietf.org/html/draft-aboba-rtp-http-02
[64] RFC 3205 - On the use of HTTP as a Substrate for Other Protocols ( 版) http://tools.ietf.org/html/rfc3205
[71] Wireless Profiled HTTP Version 29-Mar-2001 ( 版) http://technical.openmobilealliance.org/tech/affiliates/wap/WAP-229-HTTP-20010329-a.pdf
[72] Hypertext Transport Protocol HTTP/1.1 ( ()) https://www.w3.org/Talks/9608HTTP/
[73] protocol: make normative reference to http (#315) (andreastt著, ) https://github.com/w3c/webdriver/commit/8f75b83f789d0dead1a370e0a90f57cce045c64f