[20] [DFN[[[HTTP/1.1]]]] は、3つ目の[[HTTPの版]]です。多くの[[サーバー]]と[[クライアント]]により広く実装されています。

* 仕様書

[REFS[
- [9] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230>
- [10] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-06-07 01:55:45 +09:00]] 版) <https://tools.ietf.org/html/rfc7231>
- [11] [CITE@en[RFC 7232 - Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests]] ([TIME[2014-06-07 01:59:31 +09:00]] 版) <https://tools.ietf.org/html/rfc7232>
- [12] [CITE@en[RFC 7233 - Hypertext Transfer Protocol (HTTP/1.1): Range Requests]] ([TIME[2014-06-07 01:59:31 +09:00]] 版) <https://tools.ietf.org/html/rfc7233>
- [13] [CITE@en[RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching]] ([TIME[2014-06-07 01:58:49 +09:00]] 版) <https://tools.ietf.org/html/rfc7234>
- [14] [CITE@en[RFC 7235 - Hypertext Transfer Protocol (HTTP/1.1): Authentication]] ([TIME[2014-06-07 01:59:34 +09:00]] 版) <https://tools.ietf.org/html/rfc7235>
- [40] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-18>
- [39] [CITE[UPnP Device Architecture 2.0]] ([TIME[2014-09-05 02:24:48 +09:00]] 版) <http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v2.0.pdf#page=23>
- [43] [CITE@en[RFC 7301 - Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension]] ([TIME[2014-10-12 15:39:49 +09:00]] 版) <https://tools.ietf.org/html/rfc7301#section-6>
- [49] [CITE@en[RFC 7838 - HTTP Alternative Services]] ([TIME[2016-04-17 23:25:39 +09:00]] 版) <https://tools.ietf.org/html/rfc7838#section-2>
]REFS]

* HTTP/1.0 との差異

[23] [[HTTP/1.0]] と [[HTTP/1.1]] には次のような差異があります。

[FIG(list)[
- [24] [[プロトコルの版]]が異なります
- [25] [CODE(HTTP)[[[1xx]]]] とそれに関連する機能は [[HTTP/1.1]] でのみ利用可能です
- [45] [[WebSocket]] は [[HTTP/1.1]] [[以上]]でのみ利用可能です。
- [26] [[HTTP/1.1]] では [CODE(HTTP)@en[[[Transfer-Encoding:]] [[chunked]]]] の実装が義務付けられています
- [27] [[鯖]]は [CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]のない [[HTTP/1.1]] [[要求]]に
[CODE(HTTP)[[[400]]]] [[応答]]を返さなければなりません
- [33] [[HTTP/1.1]] では[[持続的接続]]が標準の動作となっています。
[[HTTP/1.0]] では接続を直ちに閉じるのが標準の動作となっています。
- [34] [[齢]]の計算方法が [[HTTP/1.0]] [[串]]の存在如何により異なります。
- [35] [CODE(HTTP)@en[[[Meter:]]]] [[ヘッダー]]は [[HTTP/1.0]] [[以下]]では使えません。
]FIG]

[36] [[HTTP/1.1]] を実装せずに [[HTTP/1.0]] を実装するとしたら、その理由は
[CODE(HTTP)@en[[[chunked]]]] を実装したくないか、
[CODE(HTTP)[[[1xx]]]] を実装したくないか、
またはその両方が理由でしょう。[[持続的接続]]を含めその他の [[HTTP/1.1]]
のみの機能は、[[クライアント]]も[[鯖]]も必要がなければ使わなくて済みます。

[41] [[WebDAV]] は [[HTTP/1.1]] (の当時の仕様書である [[RFC 2616]]) 
に適合することを求めています [SRC[>>40]]。
ただし [[HTTP/1.0]] を使うことを明示的に禁止してはいません。 [[RFC 2616]]
に違反せずに [[HTTP/1.0]] を使うことは可能ではあります。

[42] [[HTTP/1.0]] の[[串]]における[[キャッシュ]]を無効化し、 [[HTTP/1.1]]
の[[串]]には[[キャッシュ]]させるために [CODE(HTTP)@en[[[Expires:]]]]
と [CODE(HTTP)@en[[[Cache-Control:]] [[max-age]]]] 
を組み合わせる手法が用いられることがあります。ただし厳密にはプロトコルの版によって動作を変えているのではなく、
[[串]]が作られた時期による分岐となっています。([[HTTP/1.0]] の[[串]]は
[CODE(HTTP)@en[[[Cache-Control:]]]] を実装していないことを前提としていますが、
必ずしもそうとは言えないようです。また本来意図しているのは [[HTTP/1.0]] 
かどうかの分岐ではなく、比較的新しい機能を正しく取り扱えるかどうかの分岐のようです。)

;; [[[CODE(HTTP)@en[Expires:]]]>>49] も参照。

* HTTP/2 との差異

[46] [[HTTP/2]] を参照。

* プロトコルの版 [CODE(HTTP)@en[HTTP/1.1]]

[37] [[開始行]]などで用いられる[[プロトコルの版]] [DFN[[CODE(HTTP)@en[[[HTTP/1.1]]]]]]
は、 [[HTTP/1.1]] を表します。

[38] [[SSDP]] でも [CODE(HTTP)@en[[[HTTP/1.1]]]] を使いますが、後方互換性のためで、
[[HTTP/1.1]] ではないとされています [SRC[>>39]]。

* プロトコル [CODE@en[http/1.1]]

[44] [[TLS]] [[ALPN]] の[[プロトコル]]
0x68 0x74 0x74 0x70 0x2f 0x31 0x2e 0x31 ([CODE[http/1.1]])
は、 [[RFC 7230]] [[HTTP/1.1]] を表します [SRC[>>43]]。

[50] [[代替サービス]]の[[プロトコル名]] [CODE[http/1.1]]
は、 [[HTTP/1.1]] over [[TLS]] を表します [SRC[>>49]]。

* 歴史

[22] [[HTTP/1.1]] は、 [[RFC 1945]] によって規定される [[HTTP/0.9]] や [[HTTP/1.0]]
と並行する第3の [[HTTP]] の版として [[IETF]] によって定義されました。

;; [[HTTP/1.1]] は [[HTTP/1.0]] の改訂版ではありますが、実際上も手続き上も
[[HTTP/0.9]] および [[HTTP/1.1]] を置き換えるものとはなっていません。
[[HTTP/1.1]] の開発開始から20年経った後も [[HTTP/0.9]] は実装されています。

** 第1次仕様 (RFC 2068, RFC 2069)

[REFS[
- [7] [[RFC 2068]]
- [8] [[RFC 2069]]
]REFS]

[28] 後に補足的な内容を含む [[RFC 2145]] が発行されています。

** 第2次仕様 (RFC 2616, RFC 2617)

[REFS[
- [5] [[RFC 2616]]
- [6] [[RFC 2617]]
- [3] ''HTTP/1.1 Specification Errata'' <http://world.std.com/~lawrence/http_errata.html>
]REFS]

** 第3次仕様 (RFC 7230-7237)

[52] 第3次仕様 [DFN[RFC 723[VAR[x]]]] は、十数年ぶりに[TIME[2014年][year:2014]]に出版されました。

[REFS[
- [1]
[CITE[Revising RFC2616 - what's happening from Mark Nottingham on 2006-10-18 (ietf-http-wg@w3.org from October to December 2006)]] <http://lists.w3.org/Archives/Public/ietf-http-wg/2006OctDec/0046.html>
([[名無しさん]] [WEAK[2006-10-21 12:19:38 +00:00]])
- [2]
[CITE[RFC2616bis Issues]] <http://www.w3.org/Protocols/HTTP/1.1/rfc2616bis/issues/>
([[名無しさん]] [WEAK[2006-11-12 10:25:01 +00:00]])
]REFS]

[4] [TIME[2014年6月][2014-06]]に [DFN[RFC 7230]], [DFN[RFC 7231]], [[RFC 7232]], [[RFC 7233]], [DFN[RFC 7234]],
[[RFC 7235]], [DFN[RFC 7236]], [DFN[RFC 7237]] が発行されました。関連仕様として
[[RFC 7238]], [[RFC 7239]], [[RFC 7240]] も発行されています。

[21] これらの [[RFC]] は [[RFC 2616]] と [[RFC 2145]] を[[廃止]]して置き換える他、
[[RFC 2617]] と [[RFC 2817]] と [[RFC 2818]] の一部を[[更新]]するものとされています。

[REFS[
- [15] [CITE@en[RFC 7236 - Initial Hypertext Transfer Protocol (HTTP) Authentication Scheme Registrations]] ([TIME[2014-06-07 01:57:05 +09:00]] 版) <https://tools.ietf.org/html/rfc7236>
- [16] [CITE@en[RFC 7237 - Initial Hypertext Transfer Protocol (HTTP) Method Registrations]] ([TIME[2014-06-07 01:59:34 +09:00]] 版) <https://tools.ietf.org/html/rfc7237>
- [17] [CITE@en[RFC 7238 - The Hypertext Transfer Protocol Status Code 308 (Permanent Redirect)]] ([TIME[2014-06-07 01:57:48 +09:00]] 版) <https://tools.ietf.org/html/rfc7238>
- [18] [CITE@en[RFC 7239 - Forwarded HTTP Extension]] ([TIME[2014-06-07 01:59:37 +09:00]] 版) <https://tools.ietf.org/html/rfc7239>
- [19] [CITE@en[RFC 7240 - Prefer Header for HTTP]] ([TIME[2014-06-07 01:59:37 +09:00]] 版) <https://tools.ietf.org/html/rfc7240>
]REFS]

[30] 従来の [[RFC]] を全面改訂して再編しており、以前の版よりは大幅に記述が改善され、
比較的詳細になっています。

[31] とはいえ所詮は [[IETF]] 品質で、同時代の他の [[Web標準]] ([[WHATWG]] の
[[HTML Standard]] や [[TC39]] の [[ECMAScript]] など) と比較すると遥かに簡易的で曖昧です。

[32] 本体仕様だけでも6分割もされているため、[[RFC]] の境界部分で若干の曖昧性や規定の重複が起こっています。
また古くからの要件を非網羅的に適宜列挙する形の仕様書となっていますから、
境界条件が曖昧だったり、複数の規定の条件が重複してかつ若干異なっていたり、
起こり得るケースの一部のみしか規定されていなかったりします。
[[誤り処理]]に関する規定も前の版に比べるとかなり増えていますが、それでもほとんどの部分では
(意図的に) 規定されていません。

[29] [[RFC 723x]] は [['''SHOULD''']] を避けるためか、 [[ought to]] 
という表現をかなり頻繁に用いています。しかしその意図するところは説明されておらず、
どの程度の温度感で勧めているのかはよくわからなくなっています。

[51] 元々1つの文書にまとまっていたのがたくさんの [[RFC]] に分割され、
何がどこに書かれているのかは高度な訓練を経ないとわからなくなりました。

** HTTP/2

[47] 2015年には [[HTTP/2]] が [[RFC]] として出版されています。
[[HTTP/2]] は[[ヘッダー]]や[[状態符号]]などの[[語彙]]の部分は [[HTTP/1.1]]
の規定をほぼそのまま参照しており、 [[HTTP/1.1]] を完全に置き換えるものとはなっていません。
また、 (少なくても現時点では) [[HTTP/2]] のプロトコルは [[HTTP/1.1]]
のプロトコルと選択的に利用するものとなっており、 [[HTTP/1.1]]
を[[廃止]]するものではありません。

;; [48] 手続き上も [[HTTP/1.1]] の [[RFC]] は[[廃止]]されていません。

[FIG(quote)[
[FIGCAPTION[
[53] [CITE@en[RFC 8006 - Content Delivery Network Interconnection (CDNI) Metadata]]
([TIME[2016-12-14 14:55:04 +09:00]])
<https://tools.ietf.org/html/rfc8006#section-7.3>
]FIGCAPTION]

>    | http/1.1  | Hypertext Transfer   | RFC 8006      | RFC 7230       |
>    |           | Protocol -- HTTP/1.1 |               |                |

]FIG]
