<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> <cite xml:lang="en">RFC 3229 - Delta encoding in HTTP</cite> (<time>2014-10-26 21:15:25 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://tools.ietf.org/html/rfc3229">http://tools.ietf.org/html/rfc3229</anchor-external></li></ul></refs><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">差分符号化</anchor>も参照。</comment-p><p><strong>Delta encoding in HTTP <ins>HTTP における差分符号化</ins></strong><ul><li>Network Working Group                                          </li><li>Request for Comments: 3229                                   </li><li>Category: Standards Track                              </li><li>J. Mogul</li><li>Compaq WRL</li><li>B. Krishnamurthy</li><li>F. Douglis</li><li>AT&amp;T</li><li>A. Feldmann</li><li>Univ. of Saarbruecken</li><li>Y. Goland</li><li>A. van Hoff</li><li>Marimba</li><li>D. Hellerstein</li><li>ERS/USDA</li><li>January 2002</li></ul></p><section><h1>Status of this Memo</h1><pre>   This document specifies an Internet standards track protocol for the
   Internet community, and requests discussion and suggestions for
   improvements.  Please refer to the current edition of the &quot;Internet
   Official Protocol Standards&quot; (STD 1) for the standardization state
   and status of this protocol.  Distribution of this memo is unlimited.</pre></section><section><h1>Copyright Notice</h1><pre>   Copyright (C) The Internet Society (2002).  All Rights Reserved.</pre></section><section><h1>Abstract</h1><blockquote><p>This document describes how delta encoding can be supported as a
compatible extension to HTTP/1.1.</p></blockquote><p>この文書は、 HTTP/1.1 に互換な拡張としてどう差分符号化に対応することができるかを記述します。</p><blockquote><p>Many HTTP (Hypertext Transport Protocol) requests cause the retrieval
of slightly modified instances of resources for which the client
already has a cache entry.  Research has shown that such modifying
updates are frequent, and that the modifications are typically much
smaller than the actual entity.  In such cases, HTTP would make more
efficient use of network bandwidth if it could transfer a minimal
description of the changes, rather than the entire new instance of
the resource.  This is called &quot;delta encoding.&quot;</p></blockquote><p>多くの HTTP (ハイパーテキスト転送プロトコル) 要求は
クライアントが既にキャッシュ項目を持つ資源を微妙に修正した実現値を取り出すこととなります。
研究によればそのような修正による更新は頻繁にあり、
その修正は典型的なところでは実体の実体より小さいのです。
そのような場合、 HTTP は資源の新しい実現値全体を転送するのではなく、
変更の最小限の記述を転送することができればネットワーク帯域のより効率的な使用が行えるでしょう。
これを「差分符号化」と呼びます。</p></section><section><h1>Table of Contents</h1><pre>   1 Introduction....................................................  3
        1.1 Related research and proposals...........................  4
   2 Goals...........................................................  5
   3 Terminology.....................................................  6
   4 The HTTP message-generation sequence............................  8
        4.1 Relationship between deltas and ranges................... 11
   5 Basic mechanisms................................................ 13
        5.1 Background: an overview of HTTP cache validation......... 13
        5.2 Requesting the transmission of deltas.................... 14
        5.3 Choice of delta algorithm and format..................... 16
        5.4 Identification of delta-encoded responses................ 16
        5.5 Guaranteeing cache safety................................ 17
        5.6 Transmission of delta-encoded responses.................. 18
        5.7 Examples of requests combining Range and delta encoding.. 19
   6 Encoding algorithms and formats................................. 22
   7 Management of base instances.................................... 23
        7.1 Multiple entity tags in the If-None-Match header......... 24
        7.2 Hints for managing the client cache...................... 25
   8 Deltas and intermediate caches.................................. 27
   9 Digests for data integrity...................................... 28
   10 Specification.................................................. 28
        10.1 Protocol parameter specifications....................... 28
        10.2 IANA Considerations..................................... 30
        10.3 Basic requirements for delta-encoded responses.......... 30
        10.4 Status code specifications.............................. 30
             10.4.1 226 IM Used...................................... 31
        10.5 Header specifications................................... 31
             10.5.1 Delta-Base....................................... 31
             10.5.2 IM............................................... 32
             10.5.3 A-IM............................................. 33
        10.6 Caching rules for 226 responses......................... 35
        10.7 Rules for deltas in the presence of content-codings..... 36
             10.7.1 Rules for generating deltas in the presence of
                    content-codings.................................. 37
             10.7.2 Rules for applying deltas in the presence of
                    content-codings.................................. 37
             10.7.3 Examples for using A-IM, IM, and content-codings. 38
        10.8 New Cache-Control directives............................ 40
             10.8.1 Retain directive................................. 40
             10.8.2 IM directive..................................... 40
        10.9 Use of compression with delta encoding.................. 41
        10.10 Delta encoding and multipart/byteranges................ 42
   11 Quantifying the protocol overhead.............................. 42
   12 Security Considerations........................................ 44
   13 Acknowledgements............................................... 44
   14 Intellectual Property Rights................................... 44
   15 References..................................................... 44
   16 Authors' addresses............................................. 47
   17 Full Copyright Statement....................................... 49</pre></section><section><h1>1 Introduction</h1><blockquote><p>The World Wide Web is a distributed system, and so often benefits
from caching to reduce retrieval delays.  Retrieval of a Web resource
(such as a  document, image, icon, or applet) over the Internet or
other wide-area networks usually takes enough time that the delay is
over the human threshold of perception.  Often, that delay is
measured in seconds.  Caching can often eliminate or significantly
reduce retrieval delays.</p></blockquote><p>World Wide Web は分散システムであり、したがってしばしば取出しの遅延を削減するために<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">キャッシュ付け</anchor>から利益を得ます。<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インターネット</anchor>や他の広域網上の
Web <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">資源</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文書</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">画像</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アイコン</anchor>や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">applet</anchor>)
の取出しは通常遅延が人間の認識の閾値を超えるのに十分な時間がかかります。
しばしば、この遅延は秒単位となります。キャッシュ付けはしばしば取出し遅延を除去したり著しく削減したりすることができます。</p><blockquote><p>Many Web resources change over time, so a practical caching approach
must include a coherency mechanism, to avoid presenting stale
information to the user.  Originally, the Hypertext Transfer Protocol
(HTTP) provided little support for caching, but under operational
pressures, it quickly evolved to support a simple mechanism for
maintaining cache coherency.</p></blockquote><p>多くの <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web</anchor> 資源は刻々と変化するので、現実的なキャッシュ付け手法は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">腐敗</anchor>した情報を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者</anchor>に提示することを避けるための密着機構を含まなければなりません。元々、ハイパーテキスト転送プロトコル
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor>) はキャッシュ付けにほとんど対応していませんでしたが、運用の圧力の元、キャッシュの密着性を維持するための単純な仕組みを提供するようにすばやく改良されました。</p><blockquote><p>In HTTP/1.0 [2], the server may supply a &quot;last-modified&quot; timestamp
with a response.  If a client stores this response in a cache entry,
and then later wishes to re-use the response, it may transmit a
request message with an &quot;If-modified-since&quot; field containing that
timestamp; this is known as a conditional retrieval.  Upon receiving
a conditional request, the server may either reply with a full
response, or, if the resource has not changed, it may send an
abbreviated reply, indicating that the client's cache entry is still
valid.  HTTP/1.0 also includes a means for the server to indicate,
via an &quot;Expires&quot; timestamp, that a response will be valid until that
time; if so, a client may use a cached copy of the response until
that time, without first validating it using a conditional retrieval.</p></blockquote><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP/1.0</anchor> では、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鯖</anchor>は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor>に「最終修正」<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">時刻印</anchor>を供給することができます。<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">クライアント</anchor>がこの応答を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">キャッシュ項目</anchor>に蓄積していて、後からその応答を再利用したいと思うなら、時刻印を含めた
<code class="HTTP">If-modified-since</code> 欄を添えて<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求メッセージ</anchor>を転送することができます。
これは<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">条件付取出し</anchor>と言われています。鯖は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">条件付要求</anchor>を受信したら、
完全な応答で返答しても構いませんし、その資源が変更されていなければ、
クライアントのキャッシュ項目が依然<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">妥当</anchor>であることを示す、
省略した返答を送信しても構いません。 HTTP/1.0
はある応答がある時刻までは妥当であると鯖が示すための
<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Expires</anchor></code> 時刻印という手段をも含んでいます。
その場合は、クライアントは応答のキャッシュした複製をその時刻までは条件付取出しを使って最初に健勝しなくても使用して構いません。</p><blockquote><p>HTTP/1.1 [10] adds many new features to improve cache coherency and
performance.  However, it preserves the all-or-none model for
responses to conditional retrievals: either the server indicates that
the resource value has not changed at all, or it must transmit the
entire current value.</p></blockquote><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP/1.1</anchor> はキャッシュの密着性と効率を向上させるための新しい機能を多く加えました。
しかし、条件付取出しに対する応答の「すべてまたは何もなし」模型はそのままにしています。
鯖は資源値が全く変更されていないことを示すか、または現在値全体を転送しなければなりません。</p><blockquote><p>Common sense suggests (and traces confirm), however, that even when a
Web resource does change, the new instance is often substantially
similar to the old one.  If the difference, or &quot;delta&quot;, between the
two instances could be sent to the client instead of the entire new
instance, a client holding a cached copy of the old instance could
apply the delta to construct the new version.  In a world of finite
bandwidth, the reduction in response size and delay could be significant.</p></blockquote><p>しかし常識的に (そして追跡が裏付けるように)、
Web 資源が変更される時といっても、しばしば大抵は新しい<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実現値</anchor>は古い実現値と似ています。
その二つの実現値の差異、「差分」を新しい実現値全体の代わりにクライアントに送信することができれば、古い実現値のキャッシュした複製を保持しているクライアントは新しい版を構築するために差分を適用することができます。
有限の帯域の世界では、応答の寸法と遅延の削減は重大となり得ます。</p><blockquote><p>One can think of deltas as a way to squeeze as much benefit as
possible from client and proxy caches.  Rather than treating an
entire response as the &quot;cache line&quot;, with deltas we can treat
arbitrary pieces of a cached response as the replaceable unit, and
avoid transferring pieces that have not changed.</p></blockquote><p>差分はクライアントと串のキャッシュから可能な限り利益を絞り取る方法であると考えることができます。応答全体を「キャッシュ線」として扱うよりもむしろ、
差分をもってキャッシュした資源の任意の欠片を置換可能な単位として扱い、
変更されていない欠片を転送することを避けることができます。</p><blockquote><p>This document proposes a set of compatible extensions to HTTP/1.1
that allow clients and servers to use delta encoding with minimal overhead.</p></blockquote><p>この文書は、クライアントと鯖が最小の overhead で差分符号化を使用することを可能にする HTTP/1.1 への互換な拡張の集合を提案します。</p><blockquote><p>We assume that the reader is familiar with the HTTP/1.1 specification.</p></blockquote><p>読者は HTTP/1.1 仕様書に精通しているものと想定します。</p><section><h1>1.1 Related research and proposals</h1><blockquote><p>The idea of delta encoding to reduce communication or storage costs
is not new.  For example, the MPEG-1 video compression standard
transmits occasional still-image frames, but most of the frames sent
are encoded (to oversimplify) as changes from an adjacent frame.  The
SCCS and RCS [27] systems for software version control represent
intermediate versions as deltas; SCCS starts with an original version
and encodes subsequent ones with forward deltas, whereas RCS encodes
previous versions as reverse deltas from their successors.
Jacobson's technique for compressing IP and TCP headers over slow
links [17] uses a clever, highly specialized form of delta encoding.</p></blockquote><p>通信や蓄積の経費の削減のために差分符号化を行うという考えは新しい物ではありません。例えば、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MPEG-1</anchor> ビデオ圧縮規格は刻々の静止画こまを転送しますが、送られるこまのほとんどは (簡単に言えば) 隣のこまからの変更として符号化します。
ソフトウェア版制御のための <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SCCS</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RCS</anchor> のシステムは、
中間版を差分で表現します。 SCCS は元の版から開始し、後の版を正の差分で符号化し、逆に RCS は前の版を次の版からの逆向きの差分として符号化します。
遅い連結で <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IP</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCP</anchor> の頭を圧縮する Jacobson
の技法は巧妙で非常に特化した形の差分符号化を使用しています。</p><blockquote><p>In spite of this history, it appears to have taken several years
before anyone thought of applying delta encoding to HTTP, perhaps
because the development of HTTP caching has been somewhat haphazard.
The first published suggestion for delta encoding appears to have
been by Williams et al. in a paper about HTTP cache removal policies
<anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="30" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[30]</anchor-end>, but these authors did not elaborate on their design until later [29].</p></blockquote><p>このような歴史にもかかわらず、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor> に差分符号化を適用しようと考える人が出てくるまでには幾年も要しました。おそらくは、
HTTP <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">キャッシュ付け</anchor>の開発に行き当たりばったりなどころがあるからでしょう。
差分符号化についての最初の出版された提案は Williams 他の HTTP
キャッシュ削除方針についての論文のようですが、この著者は後になるまでその設計を詰めてはいませんでした。</p><blockquote><p>The WebExpress project [15] appears to be the first published
description of an implementation of delta encoding for HTTP (which
they call &quot;differencing&quot;).  WebExpress is aimed specifically at
wireless environments, and includes a number of orthogonal
optimizations.  Also, the WebExpress design does not propose changing
the HTTP protocol itself, but rather uses a pair of interposed
proxies to convert the HTTP message stream into an optimized form.
The results reported for WebExpress differencing are impressive, but
are limited to a few selected benchmarks.</p></blockquote><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebExpress</anchor> 計画は最初に HTTP の差分符号化の実装の記述を出版したようです
(そこでは「差異取り」と呼ばれています)。 WebExpress は特に無線環境を考慮しており、数々の直交する最適化を含んでいました。
また、 WebExpress の設計は HTTP プロトコル自体の変更を提案してはおらず、
HTTP メッセージ流を最適化形に変換する仲介串の組を使用していました。
WebExpress 差異取りの結果の報告は目覚しい物ではありますが、
少数の選択された評価基準に限られています。</p><blockquote><p>Banga et al. [1] describe the use of optimistic deltas, in which a
layer of interposed proxies on either end of a slow link collaborate
to reduce latency.  If the client-side proxy has a cached copy of a
resource, the server-side proxy can simply send a delta (or a 304
[Not Modified] response).  If only the server-side proxy has a cached
copy, it may optimistically send its (possibly stale) copy to the
client-side proxy, followed (if necessary) by a delta once the
server-side proxy has validated its own cache entry with the origin
server.  The use of optimistic deltas, unlike delta encoding,
actually increases the number of bytes sent over the network, in an
attempt to improve latency by anticipating a &quot;Not Modified&quot; response
from the origin server.  The optimistic delta paper, like the
WebExpress paper, did not propose a change to the HTTP protocol
itself, and reported results only for a small set of selected URLs.</p></blockquote><p>Banga 他は、遅い連結の一端で仲介串の層が待ち時間の削減に協力するという楽天的差分の使用を記述しています。クライアント側串が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">資源</anchor>のキャッシュした複製を有していれば、鯖側串は単に差分 (または <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">204</anchor></code> (未修正) 応答) を送ることができます。鯖側串がキャッシュした複製を有していれば、楽観的に (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">腐敗</anchor>しているかもしれない) 複製をクライアント側串に送り、 (必要なら) 鯖側串は自身のキャッシュ項目を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">起源鯖</anchor>で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">検証</anchor>して差分を続けて送ります。
楽天的差分を使用すると、差分符号化とは異なり、起源鯖からの「未修正」応答を先回りすることで待ち時間を改善しようとする中で、実際にはネットワーク上に送信するバイトの数は増加します。
楽天的差分の論文は、 WebExpress の論文と同様に、 HTTP
プロトコル自体の変更は提案せず、選択された <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL</anchor>
の小さな集合についてのみの結果を報告していました。</p><blockquote><p>Mogul et al. [23] collected lengthy traces, at two different sites,
of the full contents of HTTP messages, to quantify the potential
benefits of delta-encoded responses.  They showed that delta encoding
can provide remarkable improvements in response-size and response-delay for an important subset of HTTP content types.  They proposed a
set of HTTP extensions, but without the level of detail required for
a specification.  Douglis et al. [8] used the same sets of full-content traces to quantify the rate at which resources change in the Web.</p></blockquote><p>Mogul 他は、二つの異なるサイトにおいて、 HTTP メッセージの完全な内容の長さ的追跡を集成し、差分符号化応答の潜在的利益を数量化しました。
そこでは差分符号化が HTTP 内容型の重要な部分集合で応答の寸法と遅延において著しい改善を行えることを示しました。
彼らは HTTP 拡張の集合を提案しましたが、仕様書に必要な詳細度ではありませんでした。
Douglis 他は完全な内容の追跡の同じ集合を使用して Web の資源の変更率を数量化しました。</p><blockquote><p>The HTTP Distribution and Replication Protocol (DRP), proposed to W3C
by Marimba, Netscape, Sun, Novell, and At Home, aims to provide a
collection of new features for HTTP, to support &quot;the efficient
replication of data over HTTP&quot; [13].  One aspect of the DRP proposal
is the use of &quot;differential downloading,&quot; which is essentially a form
of delta encoding.  The original DRP proposal uses a different
approach than is described here, but a forthcoming revision of DRP
will be revised to conform to the proposal in this document.</p></blockquote><p>HTTP 配布模造プロトコルは Marimba, Netscape, Sun, Novell, At Home
が W3C に提案した物でありますが、これは
「HTTP 上でデータの効率的な模造」を支援するために HTTP
に新しい機能の集成を提供することを目指しています。
DRP プロトコルの一つの側面は「差異取り寄せ」の使用であり、
これは本質的には差分符号化の一形態です。元の DRP
プロトコルはここで説明する物とは異なる手法を使っていますが、
いずれ改訂された時には DRP はこの文書での提案に適合するものとなります。</p><blockquote><p>Tridgell and Mackerras [28] describe the &quot;rsync&quot; algorithm, which
accomplishes something similar to delta encoding.  In rsync, the
client breaks a cache entry into a series of fixed-sized blocks,
computes a digest value for each block, and sends the series of
digest values to the server as part of its request.  The origin
server does the same block-based computation, and returns only those
blocks whose digest values differ.  We believe that it might be
possible to support rsync using the &quot;instance manipulation&quot; framework
described later in this document, but this has not been worked out in
any detail.</p></blockquote><p>Tridgell と Mackerras は、差分符号化と似た物を実現する「<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">rsync</anchor>」
算法を記述しています。 rsync では、クライアントはキャッシュ項目を固定長の塊の系列に分割し、各塊の要約値を計算し、要約値の系列を要求の一部として鯖に送信します。起源鯖は同じ塊をもとにした計算を行い、
要約値が異なる塊のみを返します。この文書で後から説明する
「<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実現値操作</anchor>」の枠組みを使用して rsync に対応することは可能であろうと考えていますが、その詳細な作業は行われていません。</p></section></section><section><h1>2 Goals</h1><blockquote><p>The goals of this proposal are:</p></blockquote><p>この提案の目標は、</p><blockquote><ul><li>1. Reduce the mean size of HTTP responses, thereby improving
latency and network utilization.</li><li>2. Avoid any extra network round trips.</li><li>3. Minimize the amount of per-request and per-response overheads.</li><li>4. Support a variety of encoding algorithms and formats.</li><li>5. Interoperate with HTTP/1.0 and HTTP/1.1.</li><li>6. Be fully optional for clients, proxies, and servers.</li><li>7. Allow moderately simple implementations.</li></ul></blockquote><ul><li>HTTP 応答の平均的寸法を削減し、それによって待ち時間とネットワーク性能を改善すること</li><li>余計なネットワーク往復を避けること</li><li>要求毎や応答毎の overhead の量を最小化すること</li><li>種々の符号化算法・書式に対応すること</li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP/1.0</anchor> および <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP/1,1</anchor> を相互運用できること</li><li>クライアント, 串, 鯖にとって完全に任意選択機能であること</li><li>適度に簡単に実装できること</li></ul><p>です。目標には次のことは含みません。</p><blockquote><p>The goals do not include:<ul><li>Reducing the number of HTTP requests sent to an origin server.</li><li>Reducing the size of every HTTP message.</li><li>Increasing the cache-hit ratio of HTTP caches.</li><li>Allowing excessively simplistic implementations of delta encoding.</li><li>Delta encoding of request messages, or of responses to methods other than GET.</li></ul></p></blockquote><ul><li>起源鯖に送信する HTTP 要求の数の削減。</li><li>各 HTTP メッセージの寸法の削減。</li><li>HTTP キャッシュのキャッシュ打率の増幅。</li><li>極端に簡単な差分符号化の実装の実現。</li><li>要求メッセージの差分符号化や、 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GET</anchor></code> 以外の方式に対する応答の差分符号化。</li></ul><blockquote><p>Nothing in this specification specifically precludes the use of
a delta encoding for the body of a PUT request.  However, no
mechanism currently exists for the client to discover if the
server can interpret such messages, and so we do not attempt to
specify how they might be used.</p></blockquote><p>この仕様書は特に <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PUT</anchor></code> 要求の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">本体</anchor>で差分符号化を使用することを妨げはしません。
しかし、現在のところ鯖がそのようなメッセージを解釈できるかどうかをクライアントが発見する仕組みは存在していませんから、
これをどう使用するのかを述べようとはしません。</p></section><section><h1>3 Terminology</h1><blockquote><p>HTTP/1.1 [10] defines the following terms:</p></blockquote><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP/1.1</anchor> は次の用語を定義しています。</p><blockquote><dl><dt>resource</dt><dd>
A network data object or service that can be
identified by a URI, as defined in section 3.2.
Resources may be available in multiple
representations (e.g. multiple languages, data
formats, size, resolutions) or vary in other ways.</dd></dl></blockquote><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">資源</anchor></p><blockquote><dl><dt>entity</dt><dd>
The information transferred as the payload of a
request or response.  An entity consists of
metainformation in the form of entity-header fields
and content in the form of an entity-body, as
described in section 7.</dd></dl></blockquote><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体</anchor></p><blockquote><dl><dt>variant</dt><dd>
A resource may have one, or more than one,
representation(s) associated with it at any given
instant.  Each of these representations is termed a
`variant.' Use of the term `variant' does not
necessarily imply that the resource is subject to
content negotiation.</dd></dl></blockquote><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">変体</anchor></p><blockquote><p>The dictionary definition for &quot;entity&quot; is &quot;something that has
separate and distinct existence and objective or conceptual reality&quot; [21].  Unfortunately, the definition for &quot;entity&quot; in HTTP/1.1 is
similar to that used in MIME [12], based on a false analogy between
MIME and HTTP.</p></blockquote><p>「<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体</anchor>」の辞書的定義は「分離された異なる存在ならびに物体的または概念的現実性を有するもの」です。
不幸にも、 HTTP/1.1 の「実体」の定義は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MIME</anchor> で使われているものと同様で、
完全に間違った MIME と HTTP との類似性に基づいています。</p><blockquote><p>In MIME, electronic mail messages do have distinct and separate
existences.  MIME defines &quot;entity&quot; as something that &quot;refers
specifically to the MIME-defined header fields and contents of either
a message or one of the parts in the body of a multipart entity.&quot;</p></blockquote><p>MIME では、電子メイル・メッセージは異なる分離された存在を有していました。
MIME は「実体」を「メッセージまたは<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">多部分実体</anchor>の本体中の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">部分</anchor>の一つのいずれかの MIME 定義<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">頭欄</anchor>および<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容</anchor>を特に指す」ものとして定義しています。</p><blockquote><p>In HTTP, however, a response message to a GET does not have a
distinct and separate existence.  Rather, it reflects the current
state of a resource (or a variant, subject to a set of constraints).
The HTTP/1.1 specification has no term to describe &quot;the value that
would be returned in response to a GET request at the current time
for the selected variant of the specified resource.&quot;  This leads to
awkward wordings in the HTTP/1.1 specification in places where this
concept is necessary.</p></blockquote><p>しかし、 HTTP では、 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GET</anchor></code> に対する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答メッセージ</anchor>は異なる分離された存在を有していません。
むしろ、応答メッセージは資源の現在の状態 (制約の集合の対象となる、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">変体</anchor>)
を記述しています。 HTTP/1.1 仕様書は「指定された資源の選択された変体についての現時点で
<code class="HTTP">GET</code> 要求に対する応答で返されることになる値」
を記述する用語を提供していません。このために、 HTTP/1.1
仕様書でこの概念が必要なところでぐちゃぐちゃした言い方をしています。</p><blockquote><p>To express this concept, we define a new term, for use in this document:</p></blockquote><p>HTTP/1.1 仕様書での用語遣いの失敗を修正するのにはもう遅すぎますので、
代わりにこの文書で使用するために新しい用語を定義します。</p><blockquote><dl><dt>instance</dt><dd>
The entity that would be returned in a status-200
response to a GET request, at the current time, for
the selected variant of the specified resource, with
the application of zero or more content-codings, but
without the application of any instance manipulations
(see below) or transfer-codings.</dd></dl></blockquote><dl><dt>実現値</dt><dd>
特定の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">資源</anchor>の選択された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">変体</anchor>について、
<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GET</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>に対する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態</anchor>
<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">200</anchor></code> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor>で、現時点において返されるであろう、
零個以上の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容符号化</anchor>を適用した、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実現値操作</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">転送符号化</anchor>は適用していない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体</anchor>。</dd></dl><blockquote><p>It is convenient to think of an entity tag, in HTTP/1.1, as being
associated with an instance, rather than an entity.  That is, for a
given resource, two different response messages might include the
same entity tag, but two different instances of the resource should
never be associated with the same (strong) entity tag.</p></blockquote><p>HTTP/1.1 の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体札</anchor>は、実体と関連付けられていると考えるよりは、
実現値と関連付けられていると考えた方が便利です。
すなわち、ある資源について、二つの異なる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答メッセージ</anchor>は同じ実体札を返すかもしれませんが、
その資源の二つの異なる実現値は決して同じ (強い) 実体札に関連付けられるべきではありません。</p><blockquote><p>We will informally use the term &quot;delta,&quot; in this document, to mean an
HTTP response encoded as the difference between two instances.</p></blockquote><p>この文書では用語「差分」を非公式に、二つの実現値間の差異を符号化した
HTTP <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor>を意味して使います。</p><blockquote><p>More formally, delta encodings are members of a potentially larger
class of transformations on instances, leading to this new term:</p></blockquote><p>より公式に、差分符号化はこの新しい用語を導く、
潜在的により大きな実現値の変形の種別の一員です。</p><blockquote><dl><dt>instance manipulation</dt><dd>
An operation on one or more instances which may
result in an instance being conveyed from server to
client in parts, or in more than one response
message.  For example, a range selection or a delta
encoding.  Instance manipulations are end-to-end, and
often involve the use of a cache at the client.</dd></dl></blockquote><dl><dt>実現値操作</dt><dd>
一つ以上の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実現値</anchor>についての演算であり、
結果として一つの実現値が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鯖</anchor>から<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">クライアント</anchor>に部分的に、または複数の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求メッセージ</anchor>によって運ばれてくることになるかもしれない。
例えば、範囲選択や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">差分符号化</anchor>である。
実現値操作は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末端対末端</anchor>であり、しばしばクライアントでの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">キャッシュ</anchor>の使用を伴う。</dd></dl><blockquote><p>For reasons that will become clear later on, it is convenient to
think about subrange selection as a form of instance manipulation.
In some contexts, compression might also be treated as an instance
manipulation, rather than as a content-coding or transfer-coding.</p></blockquote><p>後々明らかになってくる理由から、部分範囲選択を実現値操作の一形式と考えると便利です。
文脈によっては、圧縮もまた<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容符号化</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">転送符号化</anchor>ではなく実現値操作として扱われるかもしれません。</p></section><section><h1>4 The HTTP message-generation sequence</h1><p>→ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP//変形</anchor></p></section><section><h1>5 Basic mechanisms</h1><blockquote><p>In this section, we explain the concepts behind delta encoding.  This
is not meant as a formal specification of the proposed extensions;
see section 10 for that.</p></blockquote><p>この章では、差分符号化の背後にある概念を説明します。
これは提案する拡張の正式な仕様を意味する物ではありません。
正式な仕様は10章を参照して下さい。</p><section><h1>5.1 Background: an overview of HTTP cache validation</h1><blockquote><p>When a client has a response in its cache, and wishes to ensure that
this cache entry is current, HTTP/1.1 allows the client to do a
&quot;conditional GET&quot;, using one of two forms of &quot;cache validators.&quot;  In
the traditional form, available in both HTTP/1.0 and in HTTP/1.1, the
client may use the &quot;If-Modified-Since&quot; request-header to present to
the server the &quot;Last-Modified&quot; timestamp (if any) that the server
provided with the response.  If the server's timestamp for the
resource has not changed, it may send a response with a status code
of 304 (Not Modified), which does not transmit the body of the
resource.  If the timestamp has changed, the server would normally
send a response with a status code of 200 (OK), which carries a
complete copy of the resource, and a new Last-Modified timestamp.</p></blockquote><p>クライアントがキャッシュに応答を有する時で、このキャッシュ項目が原稿の物であると確かめたい時には、 HTTP/1.1 ではクライアントは二つの
「<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">キャッシュ検証子</anchor>」の書式の一つを用いて、「<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">条件付GET</anchor>」
を行うことができます。 HTTP/1.0 と HTTP/1.1 の双方で利用可能な伝統的書式では、クライアントは、鯖が応答で示した <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Last-Modified</anchor></code> 時刻印を (あれば) 示すために <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">If-Modified-Since</anchor></code> 要求頭を使用することができます。その資源についての鯖の時刻印が変更されていなければ、
資源の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">本体</anchor>は転送しない、 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">304</anchor></code> (未修正) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>の応答を送ることができます。時刻印が変更されていれば、鯖は通常のように状態符号 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">200</anchor></code> (了解) の応答を送り、資源の完全な複製と新しい <code class="HTTP">Last-Modified</code> 時刻印を運搬することになります。</p><blockquote><p>This timestamp-based approach is prone to error because of the lack
of timestamp resolution: if a resource changes twice during one
second, the change might not be detectable.  Therefore, HTTP/1.1 also
allows the server to provide an entity tag with a response.  An
entity tag is an opaque string, constructed by the server according
to its own needs; the protocol specification imposes a bare minimum
of requirements on entity tags.  (In particular, a &quot;strong&quot; entity
tag must change if the value of the resource changes.) In this case,
the client may validate its cache entry by sending its conditional
request using the &quot;If-None-Match&quot; request-header, presenting the
entity tag associated with the cached response.  (The protocol
defines several other ways to transmit entity tags, such as the &quot;If-Range&quot; header, used for short-circuiting an otherwise necessary round
trip.) If the presented entity tag matches the server's current tag
for the resource, the server should send a 304 (Not Modified)
response.  Otherwise, the server should send a 200 (OK) response,
along with a complete copy of the resource.</p></blockquote><p>この時刻印を基にした手法は、時刻印の解像度の欠如のために誤りを起こす傾向にあります。資源が一秒の間に二度変更されれば、その変更は検出できないかもしれません。このため、 HTTP/1.1 では鯖が応答と共に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体札</anchor>を提供することもできます。実体札は不透明な文字列であり、鯖が自身の必要に応じて構築します。
プロトコル仕様は実体札に基本的な最低限の要件を課しています。
(特に、「強い」実体札は資源の値が変更されたら変更しなければなりません。)
この場合、クライアントはキャッシュ項目をキャッシュした資源に関連付けられた実体札を示した <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">If-None-Match</anchor></code> 要求頭を用いた<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">条件付要求</anchor>を送信することによって検証できます。 (HTTP は他にも <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">If-Range</anchor></code> 頭のような本来必要な往復を短絡するために使用する実体札を転送する方法を定義しています。)
示された実態札が鯖の資源の現在の札に一致すれば、鯖は <code class="HTTP">304</code>
(未修正) 応答を送信するべきです。そうでなければ、鯖は資源の完全な複製と共に
<code class="HTTP">200</code> (了解) 応答を送信するべきです。</p><blockquote><p>In the existing HTTP protocol (HTTP/1.0 or HTTP/1.1), a client
sending a conditional request can expect either of two responses:</p></blockquote><p>既存の HTTP プロトコル (HTTP/1.0 または HTTP/1.1) では、
条件付要求を送信するクライアントは次の二つの応答のいずれかを期待できます。</p><blockquote><ul><li>status = 200 (OK), with a full copy of the resource, because
the server's copy of the resource is presumably different from
the client's cached copy.</li><li>status = 304 (Not Modified), with no body, because the server's
copy of the resource is presumably the same as the client's
cached copy.</li></ul></blockquote><ul><li>状態が <code class="HTTP">200</code> (了解) で、資源の完全な複製付き。
資源の鯖の複製がクライアントのキャッシュした複製とおそらく異なっている。</li><li>状態が <code class="HTTP">304</code> (未修正) で、本体なし。
資源の鯖の複製がクライアントのキャッシュした複製とおそらく同じである。</li></ul><blockquote><p>Informally, one could think of these as &quot;deltas&quot; of 100% and 0% of
the resource, respectively.  Note that these deltas are relative to a
specific cached response.  That is, a client cannot request a delta
without specifying, somehow, which two instances of a resource are
being differenced.  The &quot;new&quot; instance is implicitly the current
instance that the server would return for an unconditional request,
and the &quot;old&quot; instance is the one that is currently in the client's
cache.  The cache validator (last-modified time or entity tag) is
what is used to communicate to the server the identity of the old instance.</p></blockquote><p>非公式に、この両者を資源のそれぞれ 100% と 0% の「差分」と考えることができます。これらの差分は特定のキャッシュした応答に対するものであることに注意して下さい。
つまり、クライアントはともかくも資源のどの二つの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実現値</anchor>が異なっているのかを指定しなければ差分を要求できないのです。
「新しい」実現値は陰に非条件付要求なら鯖が返すであろう現在の実現値であり、
「古い」実現値は現在クライアントのキャッシュにある実現値です。
キャッシュ検証子 (最終修正時刻または実体札)
が古い実現値の識別について鯖と通信するために使用する物です。</p></section><section><h1>5.2 Requesting the transmission of deltas</h1><blockquote><p>In order to support the transmission of actual deltas, an extension
to HTTP/1.1 needs to provide these features:</p></blockquote><p>実際の差分の転送に対応するために、 HTTP/1.1 への拡張は次の機能を提供する必要があります。</p><blockquote><ul><li>1. A way to mark a request as conditional.</li><li>2. A way to specify the old instance, to which the delta will be
applied by the client.</li><li>3. A way to indicate that the client is able to apply one or more
specific forms of delta encoding.</li><li>4. A way to mark a response as being delta-encoded in a particular format.</li></ul></blockquote><ul><li>要求は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">条件付</anchor>であると印をつける方法</li><li>クライアントが差分を適用する古い実現値を指定する方法</li><li>クライアントが適用することのできる一つ以上の差分符号化の書式を示す方法</li><li>応答を特定の書式で差分符号化されていると印をつける方法</li></ul><blockquote><p>The first two features are already provided by HTTP/1.1: the presence
of a conditional request-header (such as &quot;If-Modified-Since&quot; or &quot;If-None-Match&quot;) marks a request as conditional, and the value of that
header uniquely specifies the old instance (ignoring the problem of
last-modified timestamp granularity).</p></blockquote><p>最初の二つの機能は既に HTTP/1.1 にあります。
条件的要求頭 (<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">If-Modified-Since</anchor></code> や
<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">If-None-Match</anchor></code>) の存在が要求を条件付であると印付けし、
その頭の値が (差異修正時刻印の粒度の問題を無視すれば) 
古い実現値を一意に指定します。</p><blockquote><p>We defer discussion of the fourth feature, until section 5.6.</p></blockquote><p>四番目の機能の議論は5.5節まで先送りします。</p><blockquote><p>The third feature, a way for the client to indicate that it is able
to apply deltas (aside from the trivial 0% and 100% deltas), can be
accomplished by transmitting a list of acceptable delta-encoding
formats in a request-header field; specifically, the &quot;A-IM&quot; header.
The presence of this list in a conditional request indicates that the
client is able to apply delta-encoded cache updates.</p></blockquote><p>三番目の機能、クライアントが (自明な 0% や 100% の差分以外の) 差分を適用することができると示す方法は、
受入れ可能差分符号化書式の一覧を要求頭欄 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">A-IM</anchor></code>
で転送することにより実現できます。
この一覧が条件付き要求に存在することは、クライアントが差分符号化キャッシュ更新を適用することができることを示します。</p><blockquote><p>For example, a client might send this request:</p></blockquote><p>例えば、クライアントは次のような要求を送信するとします。</p><blockquote><pre>GET /foo.html HTTP/1.1
Host: bar.example.net
If-None-Match: &quot;123xyz&quot;
A-IM: vcdiff, diffe, gzip</pre></blockquote><blockquote><p>The meaning of this request is that:</p></blockquote><p>この要求の意味はこうです。</p><blockquote><ul><li>The client wants to obtain the current value of /foo.html.</li><li>It already has a cached response (instance) for that resource,
whose entity tag is &quot;123xyz&quot;.</li><li>It is willing to accept delta-encoded updates using either of
two formats, &quot;diffe&quot; (i.e., output from the UNIX &quot;diff -e&quot;
command), and &quot;vcdiff&quot;.  (Encoding algorithms and formats, such
as &quot;vcdiff&quot;, are described in section 6.)</li><li>It is willing to accept responses that have been compressed
using &quot;gzip,&quot; whether or not these are delta-encoded.  (It
might be useful to compress the output of &quot;diff -e&quot;.)  However,
based on the mandatory ordering constraint specified in section
10.5.3, if both delta encoding and compression are applied,
then this &quot;A-IM&quot; request header specifies that compression
should be done last.</li></ul></blockquote><ul><li>クライアントは <code class="URI">/foo.html</code> の現在値を得たい。</li><li>クライアントは既にこの資源の実体札が <code class="HTTP">&quot;123xyz&quot;</code>
であるキャッシュ応答 (実現値) を有している。</li><li>クライアントは <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">diffe</anchor></code> (すなわち、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UNIX</anchor> <kbd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">diff</anchor> -e</kbd>
命令の出力) と <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">vcdiff</anchor></code> (<code>vcdiff</code> のような符号化算法・書式で、6章に記述されている) の二つの書式のいずれかを用いた差分符号化更新を受入れる意志がある。</li><li>クライアントは差分符号化されていようがいなかろうが、 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">gzip</anchor></code> を用いて圧縮された応答を受入れる意志がある。
(<code>gzip</code> は <kbd>diff -e</kbd> の出力を圧縮するのに有用かもしれない。)
しかし、10.5.3節で規定する強制順序付け制約に基づき、差分符号化と圧縮の両方が適用されるのであれば、この <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">A-IM</anchor></code> 要求頭は圧縮が後から行われれるべきであると指定している。</li></ul><blockquote><p>If, in this example, the server's current entity tag for the resource
is still &quot;123xyz&quot;, then it should simply return a 304 (Not Modified)
response, as would a traditional server.</p></blockquote><p>この例において、鯖のこの資源の現在の実体札が依然 <code class="HTTP">&quot;123xyz&quot;</code>
であれば、単に伝統的鯖のように <code class="HTTP">304</code> (未修正)
を返すべきです。</p><blockquote><p>If the entity tag has changed, presumably but not necessarily because
of a modification of the resource, the server could instead compute
the delta between the instance whose entity tag was &quot;123xyz&quot; and the
current instance.</p></blockquote><p>実体札が変更されていれば、資源の修正が絶対ではないにしろおそらくはなされているので、鯖は代わりに実体札が
<code>&quot;123xyz&quot;</code> の実現値と現在の実現値の差分を計算することができます。</p><blockquote><p>We defer discussion of what the server needs to store, in order to
compute deltas, until section 7.</p></blockquote><p>差分を計算するために鯖が何を蓄積する必要があるのかの議論は7章に先送りします。</p><blockquote><p>We note that if a client indicates it is willing to accept deltas,
but the server does not support this form of instance-manipulation,
the server will simply ignore this aspect of the request.  (HTTP
always allows an implementation to ignore a header that is not
required by a specification that the implementation complies with,
and the specification of &quot;A-IM&quot; allows the server to ignore an
instance-manipulation it does not understand.)  So if a server either
does not implement the A-IM header at all, or does not implement any
of the instance manipulations listed in the A-IM header, it acts as
if the client had not requested a delta-encoded response: the server
generates a status-200 response.</p></blockquote><p>クライアントが差分を受入れる意志を示しているものの鯖がその書式の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実現値操作</anchor>に対応していない時は、鯖は端に要求のその部分を無視することを注記しておきます。
(HTTP は実装が従うことを仕様で要求していない頭を無視することを実装に常に認めており、 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">A-IM</anchor></code> の仕様は鯖が理解しない実現値操作を無視することを認めています。)
ですから鯖が <code class="HTTP">A-IM</code> 頭を全く実装していないか、
または <code class="HTTP">A-IM</code> 頭に列せられた実現値操作のいずれをも実装していないなら、クライアントが差分符号化応答を要求していない場合のように働きます。
つまり、鯖は状態 <code class="HTTP">200</code> 応答を生成します。</p></section><section><h1>5.3 Choice of delta algorithm and format</h1><blockquote><p>The server is not required to transmit a delta-encoded response.  For
example, the result might be larger than the current size of the
resource.  The server might not be able to compute a delta for this
type of resource (e.g., a compressed binary format); the server might
not have sufficient CPU cycles for the delta computation; the server
might not support any of the delta formats supported by the client;
or, the network bandwidth might be high enough that the delay
involved in computing the delta is not worth the delay avoided by
sending a smaller response.</p></blockquote><p>鯖は必ずしも差分符号化応答を転送する必要はありません。
例えば、結果が資源の現在の寸法より大きくなるかもしれません。
鯖はこの型の資源 (例えば圧縮されたバイナリ書式) の差分を計算することができないかもしれません。
鯖は差分計算のための十分な CPU 周期を有しないかもしれません。
鯖はクライアントが対応する差分書式のいずれにも対応していないかもしれません。
ネットワーク帯域が十分広いので差分を計算することによる遅延に小さ目の応答を送信することによって回避される遅延分の価値がないかもしれません。</p><blockquote><p>However, if the server does want to compute a delta, and the set of
encodings it supports has more than one encoding in common with the
set offered by the client, which encoding should it use?  This is
mostly at the option of the server, although the client can express
preferences using &quot;Quality Values&quot; (or &quot;qvalues&quot;) in the &quot;A-IM&quot;
header.  The HTTP/1.1 specification [10] describes qvalues in more
detail.  (Clients may prefer one delta encoding format over another
that generates a smaller encoding, if the decoding costs for the
first format are lower and the client is resource-constrained.)</p></blockquote><p>しかし、鯖が差分を計算したいと思っており、その対応している符号化の集合とクライアントの提案する集合と複数個共通した符号化があるなら、
どの符号化を使用するべきでしょうか。これはほとんど鯖の選択するところであります。ただしクライアントは希望を <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">A-IM</anchor></code>
頭中の「<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">品質値</anchor>」 (<code class="ABNF"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">qvalue</anchor></code>) を使って表現できます。
HTTP/1.1 仕様書は <code class="ABNF">qvalue</code> をより詳しく記述しています。
(クライアントは、そちらの方が復号経費が小さくて、クライアントに資源の上で制約があるなら、小さな符号化を生成する符号化よりも差分符号化を希望するかもしれません。)</p><blockquote><p>Server implementations have a number of possible approaches.  For
example, if CPU cycles are plentiful and network bandwidth is scarce,
the server might compute each of the possible encodings and then send
the smallest result.  Or the server might use heuristics to choose an
encoding format, based on things such as the content-type of the
resource, the current size of the resource, and the expected amount
of change between instances of the resource.</p></blockquote><p>鯖実装は数々の可能な手法を有します。例えば、 CPU 周期が豊富でネットワーク帯域が乏しいなら、鯖は可能な符号化をそれぞれ計算して最小の結果を送信するかもしれません。
あるいは鯖が符号化書式を選ぶに当たって資源の内容型や資源の現在の寸法や資源の実現値間の変更の想定量などの点を基にして発見的方法を使用するかもしれません。</p><blockquote><p>Note that it might pay to cache the deltas internally to the server,
if a resource is typically requested by several different delta-capable clients between modifications.  In this case, the cost of
computing a delta may be amortized over many responses, and so the
server might use a more expensive computation.</p></blockquote><p>資源が典型的に幾つもの異なる修正間の差分能力のあるクライアントから要求を受けるのであれば、
鯖に内部的に差分をキャッシュするために支払うかもしれないことに注意して下さい。
この場合、差分を計算する経費は多くの応答に分割されて、
鯖はより高価な計算を行なうことになるかもしれません。</p></section><section><h1>5.4 Identification of delta-encoded responses</h1><blockquote><p>A response using delta encoding must be identified as such.  This is
done using the &quot;IM&quot; response-header, specified in section 10.5.2.</p></blockquote><p>差分符号化を用いた応答はそのように識別されなければなりません。
これは10.5.2節で規定する、 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IM</anchor></code>
応答頭を使用して行います。</p><blockquote><p>However, a simplistic application of this approach would cause
serious problems if a delta-encoded response flows through an
intermediate (proxy) cache that is not cognizant of the delta
mechanism.  Because the Internet still includes a significant number
of HTTP/1.0 caches, which might never be entirely replaced, and
because the HTTP specifications insist that message recipients ignore
any header field that they do not understand, a non-delta-capable
proxy cache that receives a delta-encoded response might store that
response, and might later return it to a non-delta-capable client
that has made a request for the same resource.  This naive client
would believe that it has received a valid copy of the entire
resource, with predictably unpleasant results.</p></blockquote><p>しかし、この手法の安易な応用は、差分符号化応答が差分機構を認識しない中間
(串) キャッシュを流通する時に重大な問題を引き起こしかねません。
インターネットは依然として多大な数の HTTP/1.0
キャッシュを含んでいまして、それらはまったく置きかえられることがありませんし、 HTTP 仕様書はメッセージ受信者が理解しない頭欄は無視せよと主張していますから、差分能力の無い串キャッシュが差分符号化応答を受け取ったらこれを蓄積し、同じ資源に後から要求を行った差分能力の無いクライアントにこれを返すことになるやもしれません。この無邪気なクライアントは資源全体の妥当な複製を受信したと信じて、予想通り好ましくない結果となるでしょう。</p><blockquote><p>To solve this problem, we propose that delta-encoded responses
(actually, all instance-manipulated responses) be identified as such
using a new HTTP status code.  For specificity in the discussion that
follows, we will use the (currently unassigned) code of 226, with a
reason phrase of &quot;IM Used&quot;.  (We see no benefit in spelling out the
words &quot;Instance Manipulation Used,&quot; since this requires the
transmission of unnecessary bytes, and this Reason-phrase should not
normally be seen by human users.)  There is some precedent for this
approach:  the HTTP/1.1 specification introduces the 206 (Partial
Content) status code, for the transmission of sub-ranges of a
resource.  Existing proxies apparently forward responses with unknown
status codes, and do not attempt to cache them.</p></blockquote><p>この問題を解決するために、差分符号化応答
(実際には、すべての実現値操作応答) は新しい HTTP <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>を使って識別することを提案します。後の議論にあるように、
(現在割り当てられていない) 符号 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">236</anchor></code>
を、理由語句 <code class="HTTP">IM Used</code> (<abbr>IM</abbr> 使用中) 
と共に使用します。 (<code>Instance Manipulation Used</code> と綴っても、
不要なバイトの転送が必要で、この <code class="ABNF">Reason-phrase</code>
は通常人間利用者が見るべきではないので、特に利益にはなりません。)
この方法には先例がありまして、 HTTP/1.1 仕様書は資源の部分範囲の転送のために <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">206</anchor></code> (部分内容) 状態符号を導入しています。
既存の串は未知の状態符号を転送するようで、
これらをキャッシュしようとしません。</p><blockquote><p>An alternative to using a new status code would be to use the
&quot;Expires&quot; header to prevent HTTP/1.0 caches from storing the
response, then use &quot;Cache-Control: max-age&quot; (defined in HTTP/1.1) to
allow more modern caches to store delta-encoded responses.  This adds
many bytes to the response headers, and so would reduce the
effectiveness of delta encoding.  It is also not entirely clear that
this approach suppresses all caching by all HTTP/1.0 proxies.</p></blockquote><p>新しい状態符号を使うのではない別の方法は、
HTTP/1.0 キャッシュが蓄積するのを防ぐために <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Expires</anchor></code>
頭を使用し、より現代的なキャッシュが差分符号化応答を蓄積することを認めるために (HTTP/1.1 で定義された) <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Cache-Control: <anchor>max-age</anchor></anchor>
を使用する方法です。これは応答頭に多くのバイトを追加しますから、
差分符号化の効率性を削減してしまいます。
また、この方法がすべての HTTP/1.0 串によるすべてのキャッシュ付けを抑制するのかはまったく不明です。</code></p><blockquote><p>We were reluctant to define an additional status code as part of
the support for delta encoding.  However, we see no other
efficient way to remain compatible with the deployed base of
HTTP/1.0 cache implementations.</p></blockquote><p>差分符号化への対応の一部として追加の状態符号を定義することは気が進みませんでした。しかし、現在運用中の HTTP/1.0 キャッシュ実装と互換性を保つ効率のよい他の手段は見つかっていません。</p></section><section><h1>5.5 Guaranteeing cache safety</h1><blockquote><p>Although we are not aware of any HTTP/1.1 proxy implementations that
would attempt to cache a response with an unknown 2xx status code,
the HTTP/1.1 specification does allow this behavior if the response
carries an Expires or Cache-Control header field that explicitly
allows caching.  This would present a problem when a 226 (IM Used)
response carries such headers.</p></blockquote><p>未知の <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">2<var xmlns="http://www.w3.org/1999/xhtml">xx</var></anchor></code> 状態符号の応答をキャッシュ使用とする
HTTP/1.1 串実装は知られていませんが、 HTTP/1.1 仕様書は 
<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Expires</anchor></code> 頭欄や <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Cache-Control</anchor></code>
頭欄が陽にキャッシュ付けを認めているのならこの動作を認めています。
これは <code class="HTTP">226</code> (<abbr>IM</abbr> 使用中)
応答がこれらの頭を運ぶ時に問題を招きます。</p><blockquote><p>The solution in that case is to exploit the Cache Control Extensions
mechanism from the HTTP/1.1 specification.  We define a new cache-directive, &quot;im&quot;, which indicates that the &quot;no-store&quot; cache-directive
may be ignored by implementations that conform to the specification
for the IM and A-IM headers.</p></blockquote><p>この場合の解決策として、 HTTP/1.1 仕様書のキャッシュ制御拡張機構を利用します。
<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IM</anchor></code> 頭と <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">A-IM</anchor></code>
頭の仕様書に適合する実装が <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">no-store</anchor></code> キャッシュ指令を無視してもよいことを示す新しい <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">im</anchor></code> キャッシュ指令を定義します。</p><blockquote><p>For example, this response:</p></blockquote><p>例えば、次の応答</p><blockquote><pre>HTTP/1.1 226 IM Used
ETag: &quot;489uhw&quot;
IM: vcdiff
Date: Tue, 25 Nov 1997 18:30:05 GMT
Cache-Control: no-store, im, max-age=30

...</pre></blockquote><blockquote><p>&quot;MUST NOT&quot; be stored by a cache that complies with the HTTP/1.1
specification (which states that the max-age cache-directive &quot;implies
that the response is cacheable [...] unless some other, more
restrictive cache directive is also present.&quot;).  However, a cache
that does comply with the specification for the im cache-directive
(i.e., a cache that complies with the specification for the A-IM and
IM header fields, and the 226 status code) ignores the no-store
directive, and therefore sees the max-age directive as allowing caching.</p></blockquote><p>は HTTP/1.1 仕様書に従うキャッシュは蓄積「<strong>してはなりません</strong>」
(HTTP/1.1 仕様書では <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">max-age</anchor></code> 指令が<q>応答は、他のより制限的なキャッシュ指令も示されていない限り、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">キャッシュ可能</anchor>であることを暗示し、<ins>(略)</ins>。</q>と述べています)。
しかし、 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">im</anchor></code> キャッシュ指令の仕様に従うキャッシュ
(すなわち、 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">A-IM</anchor></code> 頭欄と <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">A-IM</anchor></code> 頭欄と <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">226</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>の仕様に適合するキャッシュ)
は <code class="HTTP">no-store</code> 指令を無視しますから、従って
<code class="HTTP">max-age</code> 指令をキャッシュ付けを認める物として見ます。</p><blockquote><p>We are not entirely sure that all HTTP/1.1 caches obey the rule
that the max-age directive is overridden by the no-store
directive.  If operational testing reveals this to be a problem,
more elaborate solutions are possible.</p></blockquote><p>すべての HTTP/1.1 キャッシュが <code class="HTTP">no-store</code>
指令で <code class="HTTP">max-age</code> 指令が上書きされるという規則に従っているのかは完全には確かめられていません。
運用上の検査でこれが問題であると分かれば、より緻密な解決が可能です。</p><blockquote><p>Warning to origin server implementors: it does not suffice to send</p></blockquote><p>起源鯖実装者へ警告。状態 <code class="HTTP">226</code> 応答で</p><blockquote><pre>Vary: If-None-Match, A-IM</pre><p>in status-226 responses.  We have discovered at least one scenario
where this does not prevent a proxy cache that does not implement IM
and A-IM from incorrectly &quot;validating&quot; a cached 226 response.</p></blockquote><p>を送信するだけでは十分ではありません。最低一つの情景ではキャッシュした
<code class="HTTP">226</code> 応答を不正に「検証」する
<code class="HTTP">IM</code> と <code class="HTTP">A-IM</code> を実装していない串キャッシュから防ぐことができないことを発見しています。</p></section><section><h1>5.6 Transmission of delta-encoded responses</h1><blockquote><p>A delta-encoded response differs from a standard response in four ways:</p></blockquote><p>差分符号化応答は標準応答と4つの点で異なります。</p><blockquote><ul><li>1. It carries a status code of 226 (IM Used).</li><li>2. It carries an &quot;IM&quot; response-header field, indicating which
delta encoding is used in this response.</li><li>3. Its message-body is a delta encoding of the current instance,
rather than a full copy of the instance.</li><li>4. It might carry several other new headers, as described later in
this document.</li></ul></blockquote><ul><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor> <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">226</anchor></code> (<abbr>IM</abbr> 使用中) を運搬する。</li><li>この応答に差分符号化が使用されていることを示す
<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IM</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答頭欄</anchor>を運搬する。</li><li><code class="ABNF"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">message-body</anchor></code> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">現在実現値</anchor>の完全な複製ではなく、
現在実現値の差分符号化である。</li><li>この文書の後で記述するほかの幾つかの新しい頭を運搬するかもしれない。</li></ul><blockquote><p>For example, a response to the request given in section 5.2 might
look like:</p></blockquote><p>例えば、5.2節に与えた要求に対する応答は次のようになるかもしれません。</p><blockquote><pre>HTTP/1.1 226 IM Used
ETag: &quot;489uhw&quot;
IM: vcdiff
Date: Tue, 25 Nov 1997 18:30:05 GMT

...</pre></blockquote><blockquote><p>(We do not show the actual contents of the response body, since this
is a binary format.)</p></blockquote><p>(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答本体</anchor>の実際の内容は、バイナリ書式になりますから、示しません。)</p><blockquote><p>Note: the Etag header in a 226 response with a delta encoding
provides the entity tag of the current instance of the resource
variant.  It is not meaningful to associate an entity tag with the
delta value, which is not an instance.</p></blockquote><p>注意: 差分符号化の <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">226</anchor></code> 応答の <code class="HTTP">Etag</code>
頭は資源<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">変体</anchor>の現在実現値の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体札</anchor>を提供します。
差分値は実現値ではなく、これと実体札を関連付けることには意味がありません。</p></section><section><h1>5.7 Examples of requests combining Range and delta encoding</h1><blockquote><p>In the example used in section 5.2, the client sends:</p></blockquote><p>5.2 節で使用した例で、クライアントは</p><blockquote><pre>GET /foo.html HTTP/1.1
Host: bar.example.net
If-None-Match: &quot;123xyz&quot;
A-IM: vcdiff, diffe, gzip</pre><p>and the server either responds with a 304 (Not Modified) response, or
with the appropriate delta encoding.</p></blockquote><p>と送信し、鯖は <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">304</anchor></code> (未修正) 応答で応答するか、
または適切な差分符号化で応答します。</p><blockquote><p>Here are a few more examples, to clarify how the client request
should be interpreted.</p></blockquote><p>ここに、クライアントの要求をどう解釈するべきかを説明する例をもう少し示します。</p><blockquote><p>If the client sends</p></blockquote><p>クライアントが</p><blockquote><pre>GET /foo.html HTTP/1.1
Host: bar.example.net
If-None-Match: &quot;123xyz&quot;
A-IM: vcdiff, diffe, gzip, range
Range: bytes=0-99</pre><p>then the meaning is the same as in the example above, except that
after the delta encoding (and compression, if any) is computed, the
server then returns only the first 100 bytes of the output of the
delta encoding.  (If it is shorter than 100 bytes, the entire delta
encoding is returned.)  Because the &quot;range&quot; token appears last in the
&quot;A-IM&quot; header, this tells the origin server to apply any range
selection after the other instance-manipulations.</p></blockquote><p>と送信したとしますと、その意味は、差分符号化 (とあれば圧縮)
を計算した後に鯖が差分符号化の出力の最初の100バイトだけを返すことを除いては、
前述の例と同じです。 (差分符号化が100バイトより短ければ、
差分符号化全体を返します。) <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">range</anchor></code>
字句は <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">A-IM</anchor></code> 頭の最後に出現しますから、
起源鯖は範囲選択を他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実現値操作</anchor>の後に適用すると言っています。</p><blockquote><p>The interaction between the If-Range mechanism and delta encoding is
somewhat complex.  (If-Range means, informally, &quot;if the entity is
unchanged, send me the part(s) that I am missing; otherwise, send me
the entire new entity.&quot;)  Here is an example that should clarify the
use of this combination.</p></blockquote><p><code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">If-Range</anchor></code> 機構と差分符号化の相互作用は何かと複雑です。
(<code class="HTTP">If-Range</code> は、ぶっちゃけて言うと、
<q>実体が変更されていなければ、私が持っていない部分(群)を送信して下さい。そうでなければ、新しい実体の全体を送信して下さい。</q>を意味します。)
これはこの組み合わせでの使用の意味を明確にするための例です。</p><blockquote><p>Suppose that the client wants to have the complete current instance
of http://bar.example.net/foo.html.  It already has a (complete)
cache entry for this URI, with entity tag &quot;A&quot;, so it issues this request:</p></blockquote><p>クライアントが <samp class="URI">http://bar.example.net/foo.html</samp>
の完全な現在実現値を持ちたいと思っているとします。
クライアントは既にこの <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URI</anchor> の (完全な)
キャッシュ項目 (実体札 <code class="HTTP">&quot;A&quot;</code>) を持っていますから、
この要求を発行します。</p><blockquote><pre>GET /foo.html HTTP/1.1
host: bar.example.net
If-None-Match: &quot;A&quot;
A-IM: vcdiff</pre></blockquote><blockquote><p>Suppose that the server's current instance has entity tag &quot;B&quot;, and
that the server also has retained a copy of the instance with entity
tag &quot;A&quot;.  Then, the server could compute the difference between &quot;B&quot;
and &quot;A&quot;, and respond with:</p></blockquote><p>鯖の現在の実現値は実体札 <code class="HTTP">&quot;B&quot;</code> を持ち、
鯖は実体札 <code class="HTTP">&quot;A&quot;</code> の複製も残しているとします。
この時、鯖は <code class="HTTP">&quot;B&quot;</code> と <code class="HTTP">&quot;A&quot;</code>
の差異を計算し、次のように応答することができます。</p><blockquote><pre>HTTP/1.1 226 IM Used
Etag: &quot;B&quot;
IM: vcdiff
Date: Tue, 25 Nov 1997 18:30:05 GMT
Content-Length: 1000

...</pre></blockquote><blockquote><p>but the network connection is terminated after the client has
received exactly 900 bytes of the message body for the delta-encoded content.</p></blockquote><p>しかしクライアントが差分符号化内容の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メッセージ本体</anchor>の丁度900バイトを受信した後でネットワーク接続が終端されました。</p><blockquote><p>The client wants to retrieve the remaining 100 bytes of the delta
encoding that was being sent in the interrupted response.  It
therefore should send:</p></blockquote><p>クライアントは中断された応答で送信されていた差分符号化の続きの100バイトを取出したいと考えます。
そこで、次のように送信するべきです。</p><blockquote><pre>GET /foo.html HTTP/1.1
host: bar.example.net
If-None-Match: &quot;A&quot;
If-Range: &quot;B&quot;
A-IM: vcdiff,range
Range: bytes=900-</pre></blockquote><blockquote><p>This rather elaborate request has a well-defined meaning, which
depends on the current entity tag Tcur of the instance when the
server receives the request:</p></blockquote><p>このなんとも凝った要求はよく定義された意味を有していまして、
その意味は鯖が要求を受信した時点の実現値の現在実体札 <var>Tcur</var>
に依存します。</p><blockquote><dl><dt>Tcur = &quot;A&quot;</dt><dd>
(i.e., for some reason, the instance has reverted to
the value already in the client's cache).  The server
should return a 304 (Not Modified) response, as
required by the HTTP/1.1 specification for &quot;If-None-Match&quot;.</dd></dl></blockquote><p>(つまり、何らかの理由で、実現値は既にクライアントのキャッシュにある値に差し戻された)。
鯖は <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">If-None-Match</anchor></code> についての HTTP/1.1 仕様が要求している通り、 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">304</anchor></code> (未修正)
を返すべきです。</p><blockquote><dl><dt>Tcur = &quot;B&quot;</dt><dd>
(i.e., the instance has not changed again).  The
HTTP/1.1 specification for &quot;If-None-Match&quot;, in this
case, is that the header field is ignored (by a
server that does not understand delta encoding).
Therefore, this is equivalent to the client's
previous request, except that the Range selection is
applied after the vcdiff instance manipulation (if
both are to be applied).  So the (delta-aware) server
again computes the delta between the &quot;A&quot; instance and
the &quot;B&quot; instance (or uses a cached computation of the
delta), then applies the Range selection, and returns
a 226 (IM Used) response, with an message-body
containing bytes 900 to 999 of the result of the
vcdiff encoding, with an &quot;IM:vcdiff,range&quot; response header.</dd></dl></blockquote><p>(つまり、実現値は再度変更されてはいない)。
<code class="HTTP">If-None-Match</code> の HTTP/1.1 仕様は、この場合、
(差分符号化を理解しない鯖は)
その頭欄を無視するとしています。従って、これは <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">vcdiff</anchor></code>
実現値操作の後に <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Range</anchor></code> 選択が (両者とも適用されるのであれば) 適用されることを除いては、クライアントの前の要求と同等です。
ですから、 (差分を知っている) 鯖は再び <code class="HTTP">&quot;A&quot;</code> 実現値と
<code class="HTTP">&quot;B&quot;</code> 実現値の差分を計算 (またはキャッシュしている差分の計算結果を使用) して、それから <code class="HTTP">Range</code> 選択を適用し、
<code class="HTTP">226</code> (<abbr>IM</abbr> 使用中) 応答を <code class="HTTP">vcdiff</code>
符号化の結果のバイト 900〜999 を含む <code class="ABNF"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">message-body</anchor></code>
と <code class="HTTP">IM:vcdiff,range</code> 応答頭と共に返します。</p><blockquote><dl><dt>Tcur = &quot;C&quot;</dt><dd>
(i.e., the instance has changed again).  In this
case, the HTTP/1.1 specification for &quot;If-None-Match&quot;
again means that this is equivalent to an
unconditional request for the current instance.  The
specification for &quot;If-Range&quot; requires the server to
return the entire current instance.  However, a
delta-aware server can construct the delta between
the &quot;A&quot; instance described by the &quot;If-None-Match&quot;
field and the current (&quot;C&quot;) instance, and return a
226 (IM Used) response, with an &quot;IM:vcdiff&quot; response header.</dd></dl></blockquote><p>(つまり、実現値は再度変更された)。
この場合、 <code class="HTTP">If-None-Match</code> についての HTTP/1.1
仕様ではやはりこれは現在実現値についての非条件付要求と同等を意味します。
<code class="HTTP">If-Range</code> の仕様は鯖が現在実現値全体を返すことを要求しています。
しかし、差分を知っている鯖は <code class="HTTP">If-None-Match</code>
欄が記述する実現値 <code class="HTTP">&quot;A&quot;</code> と現在 (<code class="HTTP">&quot;C&quot;</code>)
実現値の差分を構築し、 <code class="HTTP">226</code> (<abbr>IM</abbr> 使用中)
応答を <code class="HTTP">IM:vcdiff</code> 応答頭と共に返すことができます。</p><blockquote><p>If the client's request had not included the &quot;If-None-Match: &quot;A&quot;&quot;
header field, the server could not have computed a delta, since it
would not have known which entire instance was already available to
the client.  If the request had not included the &quot;If-Range: &quot;B&quot;&quot;
header field, the server could not have distinguished between the
latter two cases (Tcur = &quot;B&quot; or Tcur = &quot;C&quot;) and would not have been
able to apply the Range selection to the result of delta encoding.</p></blockquote><p>クライアントの要求が <code class="HTTP">If-None-Match: &quot;A&quot;</code>
頭欄を含んでいなかったなら、鯖はクライアントがどの実現値を既に完全に有しているのかを知ることができないので、差分を計算することができません。
要求が <code class="HTTP">If-Range: &quot;B&quot;</code> 頭欄を含んでいなかったなら、
鯖は後の二つの場合 (<code class="math"><var>Tcur</var> = <code class="HTTP">&quot;B&quot;</code></code>
か <code class="math"><var>Tcur</var> = <code class="HTTP">&quot;C&quot;</code></code> か)
を区別することができませんし、差分符号化の結果に <code class="HTTP">Range</code>
選択を適用することができません。</p><blockquote><p>On the other hand, suppose that the client has a cache entry for the
&quot;A&quot; instance of http://bar.example.net/foo.html, and it has already
received the first 900 bytes of a new instance &quot;B&quot; (perhaps as the
result of an aborted transfer).  Now the client wants to receive the
entire current instance, so it could send this request:</p></blockquote><p>他方で、クライアントが <samp class="URI">http://bar.example.net/foo.html</samp>
の <code class="HTTP">&quot;A&quot;</code> 実現値のキャッシュ項目を有していて、
既に新しい実現値 <code class="HTTP">&quot;B&quot;</code> の最初の 900 バイトを
(多分中断した転送の結果として) 素手に受信しているとします。
いま、クライアントは現在実現値を完全に受信したいと思ったとすると、
この要求を送信することができます。</p><blockquote><pre>GET /foo.html HTTP/1.1
host: bar.example.net
If-None-Match: &quot;A&quot;
If-Range: &quot;B&quot;
A-IM: range,vcdiff
Range: bytes=900-</pre></blockquote><blockquote><p>In this example, as in the previous example, if Tcur = &quot;A&quot; then the
server should send 304 (Not Modified), and if Tcur = &quot;C&quot;, then the
server should send the entire new instance, either as a 200 response
or as a delta encoding against instance &quot;A&quot;.</p></blockquote><p>この例では、前の例の通り、 <code class="math"><var>Tcur</var> = <code class="HTTP">&quot;A&quot;</code></code>
なら鯖は <code class="HTTP">304</code> (未修正) を送信するべきであり、
<code class="math"><var>Tcur</var> = <code class="HTTP">&quot;C&quot;</code></code>
なら鯖は完全な新しい実現値を <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">200</anchor></code> 応答として、
または実現値 <code class="HTTP">&quot;A&quot;</code> との差分符号化として送信するべきです。</p><blockquote><p>However, if Tcur = &quot;B&quot;, in this case the server should first select
the specified range (bytes 900 through the end) from both instances
&quot;A&quot; and &quot;B&quot;, then compute the delta encoding between these ranges
(using vcdiff), and then transmit the result using a 226 (IM Used)
response with an &quot;IM:range,vcdiff&quot; response header.</p></blockquote><p>しかし、 <code class="math"><var>Tcur</var> = <code class="HTTP">&quot;B&quot;</code></code>
であるなら、この場合鯖は最初に特定の範囲 (バイト <code class="HTTP">900</code>
から最後まで) を <code class="HTTP">&quot;A&quot;</code> と
<code class="HTTP">&quot;B&quot;</code> の両実現値から選択するべきであり、
それから両範囲の差分符号化を (<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">vcdiff</anchor></code> を使って)
計算し、その結果を <code class="HTTP">226</code> (<abbr>IM</abbr> 使用中)
応答を使って <code class="HTTP">IM:range,vcdiff</code> 応答頭と共に転送します。</p></section></section><section><h1>6 Encoding algorithms and formats</h1><blockquote><p>A number of delta encoding algorithms and formats have been described
in the literature:</p></blockquote><p>数々の差分符号化算法・書式を文章で次に説明しています。</p><blockquote><dl><dt>diff -e</dt><dd>
The UNIX &quot;diff&quot; program is ubiquitously available,
and is relatively fast for both encoding and decoding
(decoding is actually done using the &quot;ed&quot; program).
However, the size of the resulting deltas is
relatively large.  This algorithm can only be used on
text-format files.</dd></dl></blockquote><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UNIX</anchor> <kbd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">diff</anchor></kbd> プログラムは偏在的に利用可能で、
符号化も復号も比較的高速です (復号は通常 <kbd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ed</anchor></kbd> プログラムを使って行います)。
しかし、結果の差分の寸法は比較的大きいです。この算法は文書式ファイルにのみ使用出来ます。</p><blockquote><dl><dt>diff -e | gzip</dt><dd>
Running the output of &quot;diff&quot; through a compression
algorithm such as &quot;gzip&quot; [5] (or, perhaps better,
&quot;deflate&quot; [7, 6]) yields a more compact encoding, but
the costs of encoding and decoding are much higher
than for &quot;diff&quot; by itself.  This algorithm can only
be used on text-format files.</dd></dl></blockquote><p><kbd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">diff</anchor></kbd> の出力に <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">gzip</anchor></code> (あるいは、たぶん <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">deflate</anchor></code> がよりよい) のような圧縮算法を通すとより短小な符号化ができますが、符号化と復号の経費は <kbd>diff</kbd> 自体より高くつきます。
この算法は文書式ファイルにのみ使用できます。</p><blockquote><dl><dt>vcdiff (vdelta)</dt><dd>
The algorithm that generates the &quot;vcdiff&quot; format [19,20] inherently compresses its output, and generally
produces smaller results than the combination of
&quot;diff&quot; and &quot;gzip&quot;.  The algorithm also runs much
faster, and can be applied to binary-format input.
The &quot;vcdiff&quot; format is based on previous work on an
algorithm named &quot;vdelta.&quot;  (Note that the &quot;vcdiff&quot;
format can be used either for delta encoding or as a
compressed format, so two different instance-manipulation values would have to be registered in
order to distinguish these two uses, should its use
as a compressed format be adopted.)  The most recent
published study suggests that &quot;vdelta&quot; is the best
overall delta algorithm [16].</dd></dl></blockquote><p><code>vcdiff</code> 書式を生成する算法は元々出力を圧縮していまして、通常 <code>diff</code> と <code>gzip</code> の組み合わせより小さな結果が得られます。
この算法はより早く実行することもできますし、バイナリ書式入力にも適用できます。 <code>vcdiff</code> 書式は <code>vdelta</code> という名前の算法についての以前の作業に基づいています。 (<code>vcdiff</code> 書式は差分符号化にも圧縮書式にも使用出来るので、圧縮書式としての使用も採用するべきであるなら、両者を区別するために二つの別の実現値操作値を登録しなければならないことに注意。)
最新の研究によれば <code>vdelta</code> は最高の全体差分算法のようです。</p><blockquote><dl><dt>gdiff</dt><dd>
The gdiff format [14] was specified as a generic,
algorithm-independent format for expressing deltas.
Because it is more generic it is easy to implement,
but it may not be the most compact encoding format.</dd></dl></blockquote><p><code>gdiff</code> 書式は差分を表現するための一般的で算法独立の書式として指定されていました。この書式は一般的ですから実装するのは容易ですが、
もっとも短小な符号化書式ではないかもしれません。</p><blockquote><p>Our proposal does not recommend any specific algorithm or format, but
rather encourages client and server implementors to choose the most
appropriate one(s).  However, to avoid the possibility of excessively
long &quot;A-IM&quot; headers, we suggest that, after some period of
experimentation, it might be reasonable to specify a &quot;recommended&quot;
set of delta formats for general-purpose HTTP implementations.</p></blockquote><p>我々の提案では、どの特定の算法や書式をも推奨はせず、
むしろクライアントと鯖の実装者がもっとも適切なもの(達)を選ぶことをお勧めします。
しかし、 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">A-IM</anchor></code> 頭が極端に長くなる可能性を避けるために、
ある程度の実験期間の後に一般目的 HTTP 実装用の「推奨」
差分書式の集合を規定することが合理的かもしれません。</p><blockquote><p>We suspect that it should be possible to devise a delta encoding
algorithm appropriate for use on typical image encodings, such as GIF
and JPEG.  Although experiments with vdelta have not shown much
potential [23], this may simply be because these experiments used
vdelta directly on the already-compressed forms of these encodings.
However, it might be necessary to devise a delta encoding algorithm
that is aware of the two-dimensional nature of images.  We have some
expectation that this is possible, since MPEG compression relies on
computing deltas between successive frames of a video stream.</p></blockquote><p>典型的な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">画像符号化</anchor>、例えば <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GIF</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JPEG</anchor> について使用するのに適切な差分符号化を工夫することも可能かもしれないと思っています。
<code>vdelta</code> での実験はそれほど可能性を示しませんでしたが、
これはその実験で単に既にそれぞれの符号化で圧縮された形に直接 <code>vdelta</code>
を使用したからかもしれません。しかし、画像の二次元性を生かした差分符号化算法を考案することが必要かもしれません。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MPEG</anchor> 圧縮はビデオ流の前のこまとの差分を計算することに依っているのですから、これは可能であると期待しています。</p></section><section><h1>7 Management of base instances</h1><blockquote><p>If the time between modifications of a resource is less than the
typical eviction time for responses in client caches, this means that
the &quot;old instance&quot; indicated in a client's conditional request might
not refer to the most recent prior instance.  This raises the
question of how many old instances of a resource should be maintained
by the server, if any.  We call these old instances &quot;base instances.&quot;</p></blockquote><p>資源の修正と修正の間の時間がクライアントのキャッシュから応答が立ち退く典型的な時間より短いのであれば、このことはクライアントの条件付要求で示される
「古い実現値」が直前の実現値を指していないかもしれません。
ここから、資源の古い実現値を鯖が維持するとしたらどれだけ維持するべきかという疑問が生じます。その実現値を「基底実現値」と呼ぶことにします。</p><blockquote><p>There are many possible options for server implementors.  For example:</p></blockquote><p>鯖実装者には多くの可能な選択肢があります。例えば、</p><blockquote><ul><li>The server might not store any old instances, and so would
never respond with a delta.</li><li>The server might only store the most recent prior instance;
requests attempting to validate this instance could be answered
with a delta, but requests attempting to validate older
instances would be answered with a full copy of the resource.</li><li>The server might store all prior instances, allowing it to
provide a delta response for any client request.</li><li>The server might store only a subset of the prior instances.
The use of a Least Recently Used (LRU) algorithm to determine
this kind of subset has proved effective in some similar
circumstances, such as cache replacement.</li></ul></blockquote><ul><li>鯖は古い実現値を一切蓄積せず、差分で応答することも無い。</li><li>鯖は直前の実現値のみを蓄積する。この実現値を検証しようとする要求には差分で答えることができるが、それより古い実現値を検証しようとする要求には資源の完全な複製で答える。</li><li>鯖はすべての以前の実現値を蓄積し、どんなクライアントの要求にも差分応答を提供することができるようにする。</li><li>鯖は以前の実現値の部分集合だけを蓄積する。
この種の部分集合の決定には最長時間未使用 (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">LRU</anchor>)
算法を使用すると同様の場面、例えばキャッシュ置換で効率的なことが証明されています。</li></ul><blockquote><p>The server might not have to store prior instances explicitly.  It
might, instead, store just the deltas between specific base instances
and subsequent instances (or the inverse deltas between base
instances and prior instances).  This approach might be integrated
with a cache of computed deltas.</p></blockquote><p>鯖は以前の実現値を陽に蓄積しなければならないわけではないでしょう。
代わりに、単に特定の基底実現値と後続実現値の差分
(や基底実現値と以前の実現値との逆差分) を蓄積するかもしれません。
この手法は計算した差分のキャッシュと統合できるかもしれません。</p><blockquote><p>None of these approaches necessarily requires additional protocol
support.  However, if a server administrator wants to store only a
subset of the prior instances, but would like the server to be able
to respond using deltas as often as possible, then the client needs
some additional information.  Otherwise, the client's &quot;If-None-Match&quot;
header might specify a base instance not stored at the server, even
though an appropriate base instance is held in the client's cache.</p></blockquote><p>これらの手法はいずれも、必ずしも追加のプロトコル支援を必要としていません。
しかし、鯖管理者が以前の実現値の部分集合だけを蓄積することを望んでおりながら、鯖を可能な限り多くの機会に差分を使って応答できるようにしたいのであれば、クライアントは追加の情報が必要です。
そうしなければ、クライアントの <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">If-None-Match</anchor></code>
頭は、クライアントのキャッシュに適切な基底実現値を別に保持していたとしても鯖に蓄積されていない基底実現値を指定してしまうかもしれません。</p><blockquote><p>We identify two additional protocol changes to help solve this problem.</p></blockquote><p>この問題を解決するのを助ける二つの追加のプロトコルへの変更があります。</p><section><h1>7.1 Multiple entity tags in the If-None-Match header</h1><blockquote><p>Although the examples we have given so far show only one entity tag
in an &quot;If-None-Match&quot; header, the HTTP/1.1 specification allows the
header to carry more than one entity-tag.  This feature was included
in HTTP/1.1 to support efficient caching of multiple variants of a
resource, but it is not restricted to that use.</p></blockquote><p>我々の示した例は <code class="HTTP">If-None-Match</code> 頭に一つの実体札しか示していませんが、
HTTP/1.1 仕様はこの頭が複数個の <code class="ABNF"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">entity-tag</anchor></code>
を運搬することを認めています。この機能は一つの資源の複数の変体を効率よくキャッシュ付けするのを支援するために
HTTP/1.1 に取り込まれましたが、その用途に制限されてはいません。</p><blockquote><p>Suppose that a client has kept more than one instance of a resource
in its cache.  That is, not only does it keep the most recent
instance, but it also holds onto copies of one or more prior, invalid
instances.  (Alternatively, it might retain sufficient delta or
inverse-delta information to reconstruct older instances.)  In this
case, it could use its conditional request to tell the server about
all of the instances it could apply a delta to.  For example, the
client might send:</p></blockquote><p>クライアントがある資源の複数の実現値をキャッシュに保持しているとします。
つまり、最近の実現値を保持しているだけではなく、
一つ以上の前の、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">非妥当</anchor>な実現値の複製をも保持しています。
(代わりに、古目の実現値を再構築するための十分な差分または逆差分を残しているかもしれません。)
この場合、クライアントは鯖に差分を適用することのできるすべての実現値を伝える条件付要求を使用することができます。
例えば、クライアントはキャッシュ中にこの資源の三つの実現値を有することを示すために</p><blockquote><pre>GET /foo.html HTTP/1.1
host: bar.example.net
If-None-Match: &quot;123xyz&quot;, &quot;337pey&quot;, &quot;489uhw&quot;
A-IM: vcdiff</pre><p>to indicate that it has three instances of this resource in its
cache.  If the server is able to generate a delta from any of these
prior instances, it can select the appropriate base instance, compute
the delta, and return the result to the client.</p></blockquote><p>と送信することができます。鯖が三つの以前の実現値のいずれかから差分を生成することができれば、適切な基底実現値を選択して差分を計算し、
クライアントに結果を返すことができます。</p><blockquote><p>In this case, however, the server must also tell the client which
base instance to use, and so we need to define a response header,
named &quot;Delta-Base&quot;, for this purpose.  For example, the server might reply:</p></blockquote><p>しかし、この場合、鯖はクライアントにどの基底実現値を使用したのかも伝えなければなりませんから、そのために <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Delta-Base</anchor></code> という新しい応答頭を定義する必要があります。
例えば、鯖は次のように返答するかもしれません。</p><blockquote><pre>HTTP/1.1 226 IM Used
ETag: &quot;1acl059&quot;
IM: vcdiff
Delta-Base: &quot;337pey&quot;
Date: Tue, 25 Nov 1997 18:30:05 GMT</pre></blockquote><blockquote><p>This response tells the client to apply the delta to the cached
response with entity tag &quot;337pey&quot;, and to associate the entity tag
&quot;1acl059&quot; with the result.</p></blockquote><p>この応答は、クライアントに実体札 <code class="HTTP">&quot;337pey&quot;</code>
のキャッシュした応答に差分を適用し、結果に実体札
<code class="HTTP">&quot;lac1059&quot;</code> を関連付けるように言っています。</p><blockquote><p>Of course, if the server has retained more than one of the prior
instances identified by the client, this could complicate the problem
of choosing the optimal delta to return, since now the server has a
choice not only of the delta format, but also of the base instance to use.</p></blockquote><p>もちろん、鯖がクライアントの識別する前の実現値の複数個を残しておいていれば、
返すべき最適な差分を選ぶ問題が複雑になるでしょう。
その場合は差分書式についてだけではなく、
使用する基底実現値についても鯖が選ばなければなりませんから。</p></section><section><h1>7.2 Hints for managing the client cache</h1><blockquote><p>Support for multiple entity tags in choosing the base instance
implies that a client might benefit from storing multiple old
instances of a resource in its cache.  A client with finite space
would not want to keep all old instances, so it must manage its cache
for maximal effectiveness by saving those instances most likely to be
useful for future deltas.  Although this could be accomplished using
information purely local to the client (e.g., an LRU algorithm),
certain &quot;hint&quot; information from the server could improve the client's
ability to manage its cache.  The use of hints for improving Web
cache performance has been described previously [4, 22].</p></blockquote><p>基底実現値を選ぶに当たって複数の実体札に対応するためには、
クライアントがキャッシュに資源の複数の古い実現値を蓄積することによる利益がなければなりません。
有限空間のクライアントは古い実現値をすべて保持することを望まないでしょうから、クライアントは古い実現値を保存することによって最大の効率でもってキャッシュが将来の差分に最も有用であるように維持しなければなりません。
これは純粋にクライアントに局所的な情報を使用して達成することもできますが
(例えば <abbr>LRU</abbr> 算法)、鯖からのある「ヒント」でクライアントのキャッシュを維持する能力を向上させることができます。
Web キャッシュの効率向上のためにヒントを使用することは以前に説明されています。</p><blockquote><p>If the server intends to retain certain instances and not others, it
can label the responses that transmit the retained instances.  This
would help the client manage its cache, since it would not have to
retain all prior instances on the possibility that only some of them
might be useful later.  The label is a hint to the client, not a
promise that the server will indefinitely retain an instance.</p></blockquote><p>鯖がある実現値は残して他は残さないことを予定しているのなら、
残す実現値を転送する応答に札付けすることができます。
これは、クライアントが一部だけしか後から有用ではないかもしれない前の実現値をすべて残さなくても構いませんから、クライアントがキャッシュを維持する助けとなるでしょう。
札はクライアントへのヒントであって、鯖が際限なく実現値を残すことを約束はしません。</p><blockquote><p>We propose adding a new directive to the existing &quot;Cache-Control&quot;
header for this purpose, named &quot;retain&quot;.  For example, in response to
an unconditional request, the server might send:</p></blockquote><p>既存の <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Cache-Control</anchor></code> 頭にこの目的で
<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">retain</anchor></code> という新しい指令を加えることを提案します。
例えば、非条件付要求に対する応答で、鯖は差分能力のあるクライアントがこの実現値を残すとよいと提案するために</p><blockquote><pre>HTTP/1.1 200 OK
ETag: &quot;337pey&quot;
Date: Tue, 25 Nov 1997 18:30:05 GMT
Cache-Control: retain</pre><p>to suggest that a delta-capable client should retain this instance.
The &quot;retain&quot; directive could also appear in a delta response,
referring to the current instance:</p></blockquote><p>のような応答を送信するかもしれません。 <code class="HTTP">retain</code>
指令は現在実現値を指して差分応答にも出現するかもしれません。</p><blockquote><pre>HTTP/1.1 226 IM Used
ETag: &quot;1acl059&quot;
Date: Tue, 25 Nov 1997 18:30:05 GMT
Cache-Control: retain
IM: vcdiff
Delta-Base: &quot;337pey&quot;</pre></blockquote><blockquote><p>The &quot;retain&quot; directive includes an optional timeout parameter, which
the server can use if it expects to delete an old base instance at a
particular time.  For example,</p></blockquote><p><code class="HTTP">retain</code> 指令は省略可能な時間切れ引数を含みまして、
鯖が古い基底実現値を特定の時刻に削除する予定であるならこれを使用できます。
例えば、</p><blockquote><pre>HTTP/1.1 200 OK
ETag: &quot;337pey&quot;
Date: Tue, 25 Nov 1997 18:30:05 GMT
Cache-Control: retain=3600</pre><p>means that the server intends to retain this base instance for one hour.</p></blockquote><p>は鯖がこの基底実現値を一時間残すつもりであることを意味します。</p><blockquote><p>Another situation where a server can provide a hint to a client is
where the server supports the delta mechanism in general, but does
not intend to provide delta-encoded responses for a particular
resource.  By sending a &quot;retain=0&quot; directive, it indicates that the
client should not waste request-header bytes attempting to obtain a
delta-encoded response using this base instance (and, by implication,
for this resource).  It also indicates that the client ought not
waste cache space on this instance after it has become stale.  To
avoid wasting response-header bytes, a server ought not send
&quot;retain=0&quot;, except in reply to a request that attempts to obtain a
delta-encoded response.</p></blockquote><p>鯖がクライアントにヒントを提供できる他の状況は、
鯖が差分機構に通常対応しているものの、
特定の資源には差分符号化応答を提供するつもりが無い場合です。
<code class="HTTP">retain=0</code> 指令を送信することで、
クライアントがこの基底実現値を使って (および、暗示により、この資源について) 差分符号化応答を得ようとして要求頭のバイトを無駄にするべきではないと示します。
この指令は、クライアントがこの実現値が腐った後にもキャッシュ空間を浪費するべきではないことも示します。
応答頭のバイトを浪費するのを避けるために、鯖は差分符号化応答を得ようとする要求に対する返答を除いて、
<code class="HTTP">retain=0</code> を送信するべきではありません。</p><blockquote><p>Note that the &quot;retain&quot; directive is orthogonal to the &quot;max-age&quot;
directive.  The &quot;max-age&quot; directive indicates how long a cache
entry remains fresh (i.e.,can be used without contacting the
origin server for revalidation); the &quot;retain&quot; directive is of
interest to a client AFTER the cache entry has become stale.</p></blockquote><p><code class="HTTP">retain</code> 指令は <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">max-age</anchor></code> 指令とは直交することに注意して下さい。
<code class="HTTP">max-age</code> 指令はどれだけの間キャッシュ項目が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">新鮮</anchor>であり続けるか
(すなわち、起源鯖に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">再検証</anchor>のために接触せずに使用できるか)
を示します。 <code class="HTTP">retain</code> 指令はキャッシュ項目が腐った<strong>後</strong>にクライアントがどうするかを示します。</p><blockquote><p>In practice, the &quot;Cache-Control&quot; response-header field might already
be present, so the cost (in bytes) of sending this directive might be
smaller than these examples implies.</p></blockquote><p>実際には、 <code class="HTTP">Cache-Control</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答頭欄</anchor>は既に示されているかもしれませんから、この指令の送信に伴う (バイトでの)
経費はこれらの例が暗示するのよりも小さいかもしれません。</p></section></section><section><h1>8 Deltas and intermediate caches</h1><blockquote><p>Although we have designed the delta-encoded responses so that they
will not be stored by naive proxy caches, if a proxy does understand
the delta mechanism, it might be beneficial for it to participate in
sending and receiving deltas.</p></blockquote><p>差分符号化応答は無邪気な串キャッシュは蓄積しない様に設計していますが、
串が差分機構を理解するのなら、串が差分の送受信に関与することは有益かもしれません。</p><blockquote><p>A proxy could participate in several independent ways:</p></blockquote><p>串は幾つかの独立な方法で関与できます。</p><blockquote><ul><li>In addition to forwarding a delta-encoded response, the proxy
might store it, and then use it to reply to a subsequent
request with a compatible &quot;If-None-Match&quot; field (i.e., one that
is either a superset of the corresponding field of the request
that first elicited the response, or one that includes the
&quot;Delta-Base&quot; value in the cached response), and with a
compatible &quot;IM&quot; response-header field (one that includes the
actual delta-encoding format used in the response.)  Of course,
such uses are subject to all of the other HTTP rules concerning
the validity of cache entries.</li></ul></blockquote><ul><li>串は、差分符号化応答の転送に加えて、これを蓄積し、互換な
(つまり、最初に応答を引き出した要求の対応する欄の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">超集合</anchor>であるか、またはキャッシュした応答の <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Delta-Base</anchor></code> 値を含む)
<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">If-None-Match</anchor></code> 欄と互換な
(応答で使われた実際の差分符号化書式を含む)
<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IM</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答頭欄</anchor>のある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">後続要求</anchor>への返答にそれを使用します。
もちろん、この利用法はキャッシュ項目の妥当性に関する他のすべての
HTTP の規則の対象です。</li></ul><blockquote><ul><li>In addition to forwarding a delta-encoded response, the proxy
might apply the delta to the appropriate entry in its own
cache, which could then be used for later responses (even from
non-delta-capable clients).</li><li>When the proxy receives a conditional request from a delta-capable client, and the proxy has a complete copy of an up-to-date (&quot;fresh,&quot; in HTTP/1.1 terminology) response in its cache,
it could generate a delta locally and return it to the
requesting client.</li><li>When the proxy receives a request from a non-delta-capable
client, it might convert this into a delta request before
forwarding it to the server, and then (after applying a
resulting delta response to one of its own cache entries) it
would return a full-body response to the client (or a response
with status code 206 or 304, as appropriate).</li></ul></blockquote><ul><li>串は、差分符号化応答の転送に加えて、自身のキャッシュの適切な項目に差分を適用して、 (差分能力の無いクライアントからのものであっても) 
それを後の応答に使用することができるようにするかもしれません。</li><li>串は、差分能力のあるクライアントからの条件付要求を受信した時で、
串がそのキャッシュに最新の (HTTP/1.1 の用語で言えば「新鮮」な)
完全な複製を有していれば、自分のところで差分を生成してこれを要求しているクライアントに返すことができるでしょう。</li><li>串が差分能力の無いクライアントから要求を受信した時、
これを鯖に転送する前に差分要求に変換して、それから
(自身のキャッシュ項目の一つに結果の差分応答を適用した後に)
クライアントに完全な本体の応答 (または適切なら状態符号 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">206</anchor></code>
または <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">304</anchor></code> の応答) を返すことができます。</li></ul><blockquote><p>All of these optional techniques increase proxy software complexity,
and might increase proxy storage or CPU requirements.  However, if
applied carefully, they should help to reduce the latencies seen by
end users, and load on the network.  Generally, CPU speed and disk
costs are improving faster than network latencies, so we expect to
see increasing value available from complex proxy implementations.</p></blockquote><p>これらの任意選択の技法のすべてが串ソフトウェアの複雑性を増し、
串の蓄積庫や CPU の要件を増加させるかもしれません。しかし、
注意深く適用すれば、末端利用者から見える待ち時間やネットワークの負荷を削減する助けとなるはずです。
一般に、 CPU 速度とディスク経費はネットワークの待ち時間より速く向上しますから、複雑な串実装から利用可能な値が増加するのを見ることができると期待しています。</p></section><section><h1>9 Digests for data integrity</h1><blockquote><p>When a recipient reassembles a complete HTTP response from several
individual messages, it might be necessary to check the integrity of
the complete response.  For example, the client's cache might be
corrupt, or the implementation of delta encoding (either at client or
server) might have a bug.</p></blockquote><p>受信者が幾つかの個々のメッセージから完全な HTTP 応答を組立てる際に、
完全な応答の整合性の検査が必要かもしれません。
例えば、クライアントのキャッシュが壊れているかもしれませんし、
(クライアントか鯖の) 差分符号化の実装に虫がいるかもしれません。</p><blockquote><p>HTTP/1.1 includes mechanisms for ensuring the integrity of individual
messages.  A message may include a &quot;Content-MD5&quot; response header,
which provides an MD5 message digest of the body of the message (but
not the headers).  The Digest Authentication mechanism [11] provides
a similar message-digest function, except that it includes certain
header fields.  Neither of these mechanisms makes any provision for
covering a set of data transmitted over several messages, as would be
the case for the result of applying a delta-encoded response (or, for
that matter, a Range response).</p></blockquote><p>HTTP/1.1 はここのメッセージの整合性を確保するために仕組みを含んでいます。
メッセージは <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Content-MD5</anchor></code> 応答頭を含んでおり、
この頭欄はメッセージの本体の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MD5</anchor> メッセージ要約を提供します
(が頭群の要約は提供しません)。要約認証機構は、
ある頭欄を含むのを除いて同様の <code>message-digest</code>
関数を提供しています。これらの機構のいずれもが、
差分符号化応答を適用した結果
(や、それを言うなら、 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Range</anchor></code> 応答) の場合のような、
幾つかのメッセージに亘って転送されるデータの集合を覆う準備はしていません。</p><blockquote><p>Data integrity for reassembled messages requires the introduction of
a new message header.  Such a mechanism is proposed in a separate
document [24].  One might still want to use the Digest Authentication
mechanism, or something stronger, to protect delta messages against tampering.</p></blockquote><p>再組立てメッセージのデータ整合性のためには新しいメッセージ頭の導入が必要です。
その仕組みは別の文書で提案しています。それでも、
改竄から差分メッセージを保護するために、要約認証機構やより強い物を使用することを望む人もいるかもしれません。</p></section><section><h1>10 Specification</h1><blockquote><p>In this specification, the key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;SHOULD&quot;,
&quot;SHOULD NOT&quot;, and &quot;MAY&quot; are to be interpreted as described in RFC 2119 [3].</p></blockquote><p>この仕様書では、見出し語「<strong>しなければならない</strong>」、
「<strong>してはならない</strong>」、「<strong>するべきである</strong>」、
「<strong>するべきではない</strong>」、「<strong>して構わない</strong>」
は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 2119</anchor> で記述されている通りに解釈します。</p><section><h1>10.1 Protocol parameter specifications</h1><p>→ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実現値操作</anchor></p></section><section><h1>10.2 IANA Considerations</h1><p>→ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実現値操作</anchor></p></section><section><h1>10.3 Basic requirements for delta-encoded responses</h1><blockquote><p>A server MAY send a delta-encoded response if all of these conditions are true:</p></blockquote><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鯖</anchor>は、次の条件がすべて真であるなら、差分符号化応答を送って<strong>構いません</strong>。</p><blockquote><ul><li>1. The server would be able to send a 200 (OK) response for the request.</li><li>2. The client's request includes an A-IM header field listing at
least one delta-coding.</li><li>3. The client's request includes an If-None-Match header field
listing at least one valid entity tag for an instance of the
Request-URI (a &quot;base instance&quot;).</li></ul></blockquote><ul><li>鯖は要求に <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">200</anchor></code> (了解) 応答を送ることができる。</li><li>クライアントの要求が最低一つの差分符号化を挙げた <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">A-IM</anchor></code> 頭欄を含んでいる。</li><li>クライアントの要求が <code class="ABNF"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Request-URI</anchor></code> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実現値</anchor> (「<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">基底実現値</anchor>」)
についての最低一つの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">妥当</anchor>な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体札</anchor> を含んでいる。</li></ul><blockquote><p>A delta-encoded response:<ul><li>MUST carry a status code of 226 (IM Used).</li><li>MUST include an IM header field listing, at least, the delta-coding employed.</li><li>MAY include a Delta-Base header field listing the entity tag of
the base-instance.</li></ul></p></blockquote><p>差分符号化応答は、<ul><li><code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">226</anchor></code> (<abbr>IM</abbr> 使用中) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>を運搬しなければ<strong>なりません</strong>。</li><li>最低、使用している差分符号化を挙げた <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IM</anchor></code>
頭欄を含めなければ<strong>なりません</strong>。</li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">基底実現値</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体札</anchor>を挙げた <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Delta-Base</anchor></code>
頭欄を含めなければ<strong>なりません</strong>。</li></ul></p></section><section><h1>10.4 Status code specifications</h1><blockquote><p>The following new status code is defined for HTTP.</p></blockquote><p>次の新しい<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>を <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor> 用に定義します。</p><section><h1>10.4.1 226 IM Used</h1><p>→ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">226</anchor></p></section></section><section><h1>10.5 Header specifications</h1><blockquote><p>The following headers are defined, for use as entity-headers.  (Due
to the terminological confusion discussed in section 3, some entity-headers are more properly associated with instances than with entities.)</p></blockquote><p>次の頭群を実体頭として使用する物として定義します。
(3章で議論した用語の混乱により、実体頭の幾つかは<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体</anchor>よりも<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実現値</anchor>に関連付けるのがより適切です。)</p><section><h1>10.5.1 Delta-Base</h1><p>→ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Delta-Base</anchor></p></section><section><h1>10.5.2 IM</h1><p>→ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP//IM</anchor></p></section><section><h1>10.5.3 A-IM</h1><p>→ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">A-IM</anchor></p></section></section><section><h1>10.6 Caching rules for 226 responses</h1><p>→ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">226</anchor></p></section><section><h1>10.7 Rules for deltas in the presence of content-codings</h1><blockquote><p>The use of delta encoding with content-encoded instances adds some
slight complexity.  When a client (perhaps a proxy) has received a
delta encoded response, either or both of that new response and a
cached previous response may have non-identity content-codings.  We
specify rules for the server and client, to prevent situations where
the client is unable to make sense of the server's response.</p></blockquote><p>内容符号化実現値と差分符号化を共用することは甚だ複雑さを増します。
クライアント (おそらくは串) が差分符号化応答を受信した時、
その新しい応答とキャッシュした以前の応答の一方または両方が非<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">同一</anchor>内容符号化を有していても構いません。
クライアントが鯖の応答を理解することができない状況を防ぐために、
鯖とクライアントの規則を規定します。</p><section><h1>10.7.1 Rules for generating deltas in the presence of content-codings</h1><blockquote><p>When a server generates a delta-encoded response, the list of
content-codings the server uses (i.e., the value of the response's
Content-Encoding header field) SHOULD be a prefix of the list of
content-codings the server would have used had it not generated a
delta encoding.</p></blockquote><p>鯖が差分符号化応答を生成する時、鯖が使用する内容符号化の並び
(すなわち応答の <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Content-Encoding</anchor></code> 頭欄の値)
は差分符号化を生成しないとしたらその鯖が使用する内容符号化の並びの頭の部分とする<strong>べきです</strong>。</p><blockquote><p>This requirement allows a client receiving a delta-encoded response
to apply the delta to a cached base instance without having to apply
any content-codings during the process (although the client might, of
course, be required to decode some content-codings).</p></blockquote><p>この要件を課すことで差分符号化応答を受信したクライアントが処理の間に内容符号化を適用する必要なしでキャッシュした<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">基底実現値</anchor>に差分を適用することができるようになります
(が、もちろん、クライアントは幾つかの内容符号化を復号する必要があるかもしれません)。</p></section><section><h1>10.7.2 Rules for applying deltas in the presence of content-codings</h1><blockquote><p>When a client receives a delta response with one or more non-identity
content codings:</p></blockquote><p>クライアントが一つ以上の非<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">同一</anchor>内容符号化のなされた差分応答を受信した時、</p><blockquote><ul><li>1. If both the new (delta) response and the cached response
(instance) have exactly the same set of content-codings, the
client applies the delta response to the cached response
without removing the content-codings from either response.</li><li>2. If the new (delta) response and the cached response have a
different set of content-codings, before applying the delta the
client decodes one or more content-codings from the cached
response, until the result has the same set of content-codings
as the delta response.</li><li>3. If a proxy or cache is forwarding the result of applying the
delta response to a cached base instance response, or later
forwards this result from a cache entry, the forwarded response
MUST carry the same Content-Encoding header field as the new
(delta) response (and so it must be content-encoded as
indicated by that header field).</li></ul></blockquote><ul><li>新しい (差分) 応答とキャッシュした応答 (実現値) の両方がちょうど同じ内容符号化の集合を有する時は、クライアントはどちらの応答からも内容符号化を取り除かずにキャッシュした応答に差分応答を適用します。</li><li>新しい (差分) 応答とキャッシュした応答が異なる内容符号化の集合を有する時は、差分を適用する前に、クライアントはキャッシュした応答から、
結果が差分応答と同じ内容符号化の集合となるまで、
一つ以上の内容符号化を復号します。</li><li>串またはキャッシュがキャッシュした基底実現値応答に差分応答を適用した結果を転送するか、または後でこの結果をキャッシュ項目から転送する場合は、
転送した応答は新しい (差分) 応答と同じ <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Content-Encoding</anchor></code>
頭欄を運搬しなければ<strong>なりません</strong> (し、従ってその頭欄が示す内容符号化を行わなければなりません)。</li></ul><blockquote><p>The intent of these rules (and in particular, rule #3) is that the
results are always consistent with the rule that the entity tag is
associated with the result of the content-coding, and that any
recipient after the application of the delta-coding receives exactly
the same response it would have received as a status-200 response
from the origin server (without any delta-coding).</p></blockquote><p>これらの規則 (特に規則 3) の意図は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体札</anchor>が内容符号化の結果に関連付けられるとの規則に常に整合することと、
差分符号化を適用した後の受信者が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">起源鯖</anchor>から (差分符号化なしの)
状態 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">200</anchor></code> 応答を受信したとする場合と全く同じ応答を受信することです。</p></section><section><h1>10.7.3 Examples for using A-IM, IM, and content-codings</h1><blockquote><p>Suppose a client, with an empty cache, sends this request:</p></blockquote><p>クライアントが、空の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">キャッシュ</anchor>で、この要求を送ります。</p><blockquote><pre>GET /foo.html HTTP/1.1
Host: example.com
Accept-encoding: gzip</pre></blockquote><blockquote><p>and the origin server responds with:</p></blockquote><p>そして起源鯖はこう応答します。</p><blockquote><pre>HTTP/1.1 200 OK
Date: Wed, 24 Dec 1997 14:00:00 GMT
Etag: &quot;abc&quot;
Content-encoding: gzip</pre></blockquote><blockquote><p>We will use the notation URI;entity-tag to denote specific instances,
so this response would cause the client to store in its cache the
entity GZIP(foo.html;&quot;abc&quot;).</p></blockquote><p>特定の実現値を表すのに <samp><var>URI</var>;<var>実体札</var></samp>という記法を使います。
従ってこの応答でクライアントはきゃっ主に実体
<code>GZIP(foo.html;&quot;abc&quot;)</code> を蓄積することとなります。</p><blockquote><p>Then suppose that the client, a minute later, issues this conditional request:</p></blockquote><p>それからこのクライアントが一分後に次の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">条件付要求</anchor>を発行するとします。</p><blockquote><pre>GET /foo.html HTTP/1.1
Host: example.com
If-none-match: &quot;abc&quot;
Accept-encoding: gzip
A-IM: vcdiff</pre></blockquote><blockquote><p>If the server is able to generate a delta-encoded response, it might
choose one of two alternatives.  The first is to compute the delta
from the compressed instances (although this might not yield the most
efficient coding):</p></blockquote><p>鯖が差分符号化応答を生成することができるなら、
二つの選択肢から一つ選ぶことができます。
最初は圧縮した実現値から差分を計算するものです
(がそれは最も効率的な符号化を得ないかもしれません)。</p><blockquote><pre>HTTP/1.1 226 IM Used
Date: Wed, 24 Dec 1997 14:01:00 GMT
Etag: &quot;def&quot;
Delta-base: &quot;abc&quot;
Content-encoding: gzip
IM: vcdiff</pre></blockquote><blockquote><p>The body of this response would be the result of
VCDIFF_DELTA(GZIP(foo.html;&quot;abc&quot;), GZIP(foo.html;&quot;def&quot;)).  The client
would store as a new cache entry the entity GZIP(foo.html;&quot;def&quot;),
after recovering that entity by applying the delta to its previous
cache entry.</p></blockquote><p>この応答の本体は <code>VCDIFF差分(GZIP(foo.html;&quot;abc&quot;), GZIP(foo.html;&quot;def&quot;))</code>
の結果となります。クライアントは以前のキャッシュ項目にこの差分を適用して実体 <code>GZIP(foo.html;&quot;def&quot;)</code> を回復した後にこの実体を新しいキャッシュ項目として蓄積します。</p><blockquote><p>The server's other alternative would be to compute the delta from the
uncompressed values, returning:</p></blockquote><p>鯖の他の選択肢は、未圧縮値の差分を計算することで、次の物を返すことになります。</p><blockquote><pre>HTTP/1.1 226 IM Used
Date: Wed, 24 Dec 1997 14:01:00 GMT
Delta-base: &quot;abc&quot;
Etag: &quot;ghi&quot;
IM: vcdiff</pre></blockquote><blockquote><p>The body of this response would be the result of
VCDIFF_DELTA(GUNZIP(GZIP(foo.html;&quot;abc&quot;)), foo.html;&quot;ghi&quot;), or more
simply VCDIFF_DELTA(foo.html;&quot;abc&quot;, foo.html;&quot;ghi&quot;).  The client
would store as a new cache entry the entity foo.html;&quot;ghi&quot; (i.e.,
without any content-coding), after recovering that entity by applying
the delta to its previous cache entry.</p></blockquote><p>この応答の結果は、
<code>VCDIFF差分(GUNZIP(GZIP(foo.html;&quot;abc&quot;)), foo.html;&quot;ghi&quot;)</code>
か、より簡単に
<code>VCDIFF差分(foo.html;&quot;abc&quot;, foo.html;&quot;ghi&quot;)</code>
となります。クライアントは以前のキャッシュ項目にこの差分を適用して実体 <code>foo.html;&quot;ghi&quot;</code> (つまり内容符号化一切無し) 
を回復した後にこの実体を新しいキャッシュ項目として蓄積します。</p><blockquote><p>Note that the new value of foo.html (at 14:01:00 GMT) without the
gzip content-coding must have a different entity tag from the
compressed instance of the same underlying file.</p></blockquote><p><code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">gzip</anchor></code> 内容符号化無しの
<code class="URI">foo.html</code> の新しい値 (時刻 <code class="HTTP">14:01:00 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GMT</anchor></code>)
は同じ元ファイルの圧縮した実現値とは異なる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体札</anchor>を持たなければならないことに注意して下さい。</p><blockquote><p>The client's second request might have been:</p></blockquote><p>クライアントの二度目の要求はこうかもしれません。</p><blockquote><pre>GET /foo.html HTTP/1.1
Host: example.com
If-none-match: &quot;abc&quot;
Accept-encoding: gzip
A-IM: diffe, gzip</pre></blockquote><blockquote><p>The client lists gzip in both the Accept-Encoding and A-IM headers,
because if the server does not support delta encoding, the client
would at least like to achieve the benefits of compression (as a
content-coding).  However, if the server does support the diffe
delta-coding, the client would like the result to be compressed, and
this must be done as an instance-manipulation.</p></blockquote><p>鯖が差分符号化に対応していない時に、クライアントは少なくても
(内容符号化としての) 圧縮の利益は得たいので、
<code class="HTTP">gzip</code> を <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Accept-Encoding</anchor></code> 頭と
<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">A-IM</anchor></code> 頭の両方に挙げています。しかし、
鯖が <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">diffe</anchor></code> 差分符号化に対応していれば、
クライアントは結果が圧縮されることを望み、
圧縮は実現値操作としてなされなければなりません。</p><blockquote><p>A server that does support diffe might reply:</p></blockquote><p><code class="HTTP">diffe</code> に対応した鯖はこう返答するかもしれません。</p><blockquote><pre>HTTP/1.1 226 IM Used
Date: Wed, 24 Dec 1997 14:01:00 GMT
Delta-base: &quot;abc&quot;
Etag: &quot;ghi&quot;
IM: diffe, gzip</pre></blockquote><blockquote><p>The body of this response would be the result of
GZIP(DIFFE_DELTA(GUNZIP(GZIP(foo.html;&quot;abc&quot;)), foo.html;&quot;ghi&quot;)), or
more simply GZIP(DIFFE_DELTA(foo.html;&quot;abc&quot;, foo.html;&quot;ghi&quot;)).
Because the gzip compression is, in this case, an instance-manipulation and not a content-coding, it is not retained when the
reassembled response is stored or forwarded, so the client would
store as a new cache entry the entity foo.html;&quot;ghi&quot; (without any
content-coding or compression).</p></blockquote><p>この応答の本体は
<code>GZIP(DIFFE_DELTA(GUNZIP(GZIP(foo.html;&quot;abc&quot;)), foo.html;&quot;ghi&quot;))</code>
またはより単純に <code>GZIP(DIFFE_DELTA(foo.html;&quot;abc&quot;, foo.html;&quot;ghi&quot;))</code>
という結果になります。 <code class="HTTP">gzip</code> 圧縮は、
この場合では、実現値操作であって内容符号化ではないので、
再組立て応答が蓄積されたり転送されたりする時には残らないので、
クライアントは新しいキャッシュ項目を実体 <code>foo.html;&quot;ghi&quot;</code>
(内容符号化も圧縮も無し) として蓄積することになります。</p></section></section><section><h1>10.8 New Cache-Control directives</h1><blockquote><p>We define two new cache-directives (see section 14.9 of RFC 2616 [10]
for the specification of cache-directive).</p></blockquote><p>新しい2つの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">キャッシュ指令</anchor>を定義します。
(キャッシュ指令の仕様は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 2616</anchor> 14.9 節を参照。)</p><section><h1>10.8.1 Retain directive</h1><p>→ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">retain</anchor></p></section><section><h1>10.8.2 IM directive</h1><p>→ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP//IM</anchor></p></section></section><section><h1>10.9 Use of compression with delta encoding</h1><blockquote><p>The application of data compression to the diffe and gdiff delta
codings has been shown to greatly reduce the size of the resulting
message bodies, in many cases.  (The vcdiff coding, on the other
hand, is inherently compressed and does not benefit from further
compression.)  Therefore, it is strongly recommended that
implementations that support the diffe and/or gdiff delta codings
also support the gzip and/or deflate compression codings.  (The
deflate coding provides a more compact result.)  However, this is not
a requirement for the use of delta encoding, primarily because the
CPU-time costs associated with compression and decompression may be
excessive in some environments.</p></blockquote><p><code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">diffe</anchor></code> 差分符号化や <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">gdiff</anchor></code>
差分符号化にデータ圧縮を応用すると、多くの場合において、
結果のメッセージ本体の寸法を極めて削減できることが示されています。
(他方 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">vcdiff</anchor></code> 符号化は、
元々圧縮されており、更に圧縮しても利益はありません。)
従って、 <code class="HTTP">diffe</code> 差分符号化<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">及び/又は</anchor>
<code class="HTTP">gdiff</code> 差分符号化に対応する実装は
<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">gzip</anchor></code> 圧縮符号化<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">及び/又は</anchor>
<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">deflate</anchor></code> 圧縮符号化にも対応することを強く推奨します。
(<code class="HTTP">deflate</code> 符号化がより短小な結果を得られます。)
しかし、主として圧縮および展開に伴う CPU 時間経費が環境によっては高くつくかもしれないことから、
差分符号化の使用の際の要件とはしません。</p><blockquote><p>A client that supports both delta encoding and compression as
instance-manipulations signals this by, for example</p></blockquote><p>差分符号化と圧縮の両方に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実現値操作</anchor>として対応するクライアントは、
そのことを例えば次のように通知します。</p><blockquote></blockquote><pre>A-IM: diffe, deflate</pre><blockquote><p>The ordering rule stated in section 10.5.3 requires, if the server
uses both instance-manipulations in the response, that compression be
applied to the result of the delta encoding, rather than vice versa.
I.e., the response in this case would include</p></blockquote><p>10.5.3 節で述べた順序付け規則により、鯖が応答で両方の実現値操作を使用する場合には、差分符号化の結果に圧縮を適用する必要があり、
その逆ではいけません。つまり、この場合の応答は次の頭欄を含みます。</p><blockquote><ul><li>IM: diffe, deflate</li></ul></blockquote><blockquote><p>Note that a client might accept compression either as a content-coding or as an instance-manipulation.  For example:</p></blockquote><p>クライアントは圧縮を内容符号化としても実現値操作としても受入れるかもしれないことに注意して下さい。例:</p><blockquote><pre>Accept-Encoding: gzip
A-IM: gzip, gdiff</pre></blockquote><blockquote><p>In this example, the server may apply the gzip compression, either as
a content-coding or as an instance-manipulation, before delta
encoding.  Remember that the entity tag is assigned after content-coding but before instance-manipulation, so this choice does affect
the semantics of delta encoding.</p></blockquote><p>この例では、鯖は差分符号化の前に <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">gzip</anchor></code> 圧縮を、
内容符号化としても実現値操作としても適用して構いません。
実体札は内容符号化の後で実現値操作の後に割当てることに注意すると、
この選択は差分符号化の意味に影響してしまうことがわかります。</p></section><section><h1>10.10 Delta encoding and multipart/byteranges</h1><blockquote><p>A client may request multiple, non-contiguous byte ranges in a single
request.  The server's response uses the &quot;multipart/byteranges&quot; media
type (section 19.2 of [10]) to convey multiple ranges in a response.
If a multipart/byteranges response is delta encoded (i.e, uses a
delta-coding as an instance-manipulation), the delta-related headers
are associated with the entire response, not with the individual
parts.  (This is because there is only one base instance and one
current instance involved.)  A delta-encoded response with multiple
ranges MUST use the same delta-coding for all of the ranges.</p></blockquote><p>クライアントは複数の連続していないバイト範囲を一つの要求で要求することができます。鯖の応答は複数の範囲を一つの応答で運搬するために
<code class="MIME"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">multipart/byteranges</anchor></code> 媒体型を使用します。
<code class="MIME">multipart/byteranges</code> 応答が差分符号化されている
(つまり差分符号化を実現値操作として使用する) 場合、
差分符号化頭群は個々の部分にではなく、応答全体に関連付けられています。
(これは、一つの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">基底実現値</anchor>と一つの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">現在実現値</anchor>だけが関係しているからです。)
複数の範囲の差分符号化応答はすべての範囲について同じ差分符号化を使用しなければ<strong>なりません</strong>。</p><blockquote><p>If a server chooses to use a delta encoding for a
multipart/byteranges response, it MUST generate a response in
accordance with the following rules.</p></blockquote><p>鯖が <code class="HTTP">multipart/byteranges</code> 応答に差分符号化を使用することを選ぶ場合、次の規則に従って応答を生成しなければ<strong>なりません</strong>。</p><blockquote><p>When a multipart/byteranges response uses a delta-coding prior to a
range selection, the A-IM and IM header fields list the delta-coding
before the &quot;range&quot; literal.  (Recall that this is the approach taken
to obtain a partial response after a premature termination of a
message transmission.)  The server firsts generates a sequence of
bytes representing the difference (delta) between the base instance
and the current instance, then selects the specified ranges of bytes,
and transmits each such range in a part of the multipart/byteranges media type.</p></blockquote><p><code class="HTTP">multipart/byteranges</code> 応答が範囲選択の前に差分符号化を使用する時は、 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">A-IM</anchor></code> 頭欄および <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IM</anchor></code>
頭欄は <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">range</anchor></code> 表記の前に差分符号化を挙げます。
(これはメッセージ転送の早すぎる終端の後に部分応答を得るために取る方法であることを思い出して下さい。)
鯖は最初に基底実現値と現在実現値の差異 (差分)を表現するバイト列を生成し、それから指定されたバイトの範囲群を選択し、
各範囲を <code class="MIME">multipart/byteranges</code> 媒体型の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">部分</anchor>として転送します。</p><blockquote><p>When a multipart/byteranges response uses a delta-coding after a
range selection, the A-IM and IM header fields list the delta-coding
after the &quot;range&quot; literal.  (Recall that this is the approach taken
to obtain an updated version just of selected sections of an
instance.)  The server first selects the specified ranges from the
current instance, and also selects the same specified ranges from the
base instance.  (Some of these selected ranges might be the empty
sequence, if the instance is not long enough.)  The server then
generates the individual differences (deltas) between the pairs of
ranges, and transmits each such difference in a part of the
multipart/byteranges media type.</p></blockquote><p><code class="MIME">multipart/byteranges</code> 応答が範囲選択の後に差分符号化を用いる時は、 <code class="HTTP">A-IM</code> 頭欄および <code class="HTTP">IM</code> 頭欄は
<code class="HTTP">range</code> 表記の後に差分符号化を挙げます。
(これは単に実現値の選択した節の更新版を得るために取る方法であることを思い出して下さい。)
鯖はまず現在実現値から指定された範囲を選択すると共に基底実現値からも指定された範囲を選択します。
(実現値が十分長くなければ、選択された範囲の幾つかは空の列となるかもしれません。)
鯖はそれから範囲の部分間の個々の差異 (差分) を生成し、
各差異を <code class="MIME">multipart/byteranges</code> 媒体型の部分として転送します。</p></section></section><section><h1>11 Quantifying the protocol overhead</h1><blockquote><p>The proposed protocol changes increase the size of the HTTP message
headers slightly.  In the simplest case, a conditional request (i.e.,
one for a URI for which the client already has a cache entry) would
include one more header, e.g.:</p></blockquote><p>提案しているプロトコル変更は HTTP メッセージ頭群の寸法を著しく増加させます。
単純な場合で、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">条件付要求</anchor> (すなわち、クライアントが既に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">キャッシュ項目</anchor>を持っている <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URI</anchor> についての要求)
では一つ余分の頭を例えば次のように含みます。</p><blockquote><ul><li>A-IM:vcdiff</li></ul></blockquote><blockquote><p>This is about 13 extra bytes.  A recent study [23] reports mean
request sizes from two different traces of 281 and 306 bytes, so the
net increase in request size would be between 4% and 5%.</p></blockquote><p>これは約13バイト余分に使います。最新の研究によると二つの異なる追跡による平均要求寸法は281バイトと306バイトであり、
従って要求寸法の増加は4%と5%となります。</p><blockquote><p>Because a client must have an existing cache entry to use as a base
for a delta-encoded response, it would never send &quot;A-IM: vcdiff&quot; (or
listing other delta encoding formats) for its unconditional requests.
The same study showed that at least 46% of the requests in lengthy
traces were for URLs not seen previously in the trace; this means
that no more than about half of typical client requests could be
conditional (and the actual fraction is likely to be smaller, given
the finite size of real caches).</p></blockquote><p>クライアントは差分符号化応答についての基底として使用する既存のキャッシュ項目を有しなければなりませんから、
非条件付要求では <samp class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">A-IM</anchor>: <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">vcdiff</anchor></samp>
(や他の差分符号化書式の列挙) を送信することはありません。
同じ研究は長さにして要求の46%が追跡中で以前に見ていない <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL</anchor>
についてのものであると示しています。これは、典型的要求の高々おおよそ半分が条件付となり得ることを意味します
(そして実際の割合は、実際のキャッシュは有限の寸法なので、より小さくなるでしょう)。</p><blockquote><p>The study also showed that 64% of the responses in a lengthy trace
were for image content-types (GIF and JPEG).  As noted in section 6,
we do not currently know of a delta-encoding format suitable for such
image types.  Unless a client did support such a delta-encoding
format, it would presumably not ask for a delta when making a
conditional request for image content-types.</p></blockquote><p>研究は、長さにして応答の64%が画像内容型 (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GIF</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JPEG</anchor>)
であることも示しています。6章で記したように、
現在このような画像型に適当な差分符号化書式は知られていません。
クライアントがそのような差分符号化書式に対応していない限り、
画像の内容型について<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">条件付要求</anchor>するときには差分を頼まないのももっともらしいことでしょう。</p><blockquote><p>Taken together, these factors suggest that the mean increase in
request header size would be much less than 5%, and probably below 1%.</p></blockquote><p>まとめると、これらの因子によれば要求頭の平均増加が5%未満、
おそらくは1%未満となると思われます。</p><blockquote><p>Delta-encoded responses carry slightly longer headers.  In the
simplest case, a response carries one more header, e.g.:</p></blockquote><p>差分符号化応答は甚だ長い頭を運搬します。
最も簡単な場合、応答は例えば次のような一つ余分な頭を運搬します。</p><blockquote><ul><li>IM:vcdiff</li></ul></blockquote><blockquote><p>This is about 11 bytes.  Other headers (such as &quot;Delta-Base&quot;) might
also be included.  However, none of these extra headers would be
included except in cases where a delta encoding is actually employed,
and the sender of the response can avoid sending a delta encoding if
this results in a net increase in response size.  Thus, a delta-encoded response should never be larger than a regular response for
the same request.</p></blockquote><p>これは約11バイトです。他の頭 (例えば <samp class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Delta-Base</anchor></samp>)
も含まれるかもしれません。しかし、これら余分な頭は差分符号化が実際に行われる場合以外には含まれることとはならず、
応答の送信者はこの結果が応答寸法の増加を招くのであれば避けることができます。
従って、差分符号化応答は同じ要求に対する通常の応答より大きくなることはないはずです。</p><blockquote><p>Simulations suggest that, when delta encoding pays off at all, it
saves several thousand bytes [23].  Thus, adding a few dozen bytes to
the response headers should almost never obviate the savings in the
message-body size.</p></blockquote><p>シミュレーションによれば、差分符号化が完全にうまくいけば、
数千バイトを節約できます。従って、応答頭群に何十バイトか加えることで
<code class="ABNF"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">message-body</anchor></code> の寸法の節約が無駄になることはほとんどないはずです。</p><blockquote><p>Finally, the use of the &quot;retain&quot; Cache-Control directive might cause
some additional overhead.  Some server heuristics might be successful
in limiting the use of these headers to situations where they would
probably optimize future responses.  Neither of these headers is
necessary for the simpler uses of delta encoding.</p></blockquote><p>最後に、 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">retain</anchor></code> <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Cache-Control</anchor></code>
指令の使用によって、幾らかの overhead が更に必要かもしれません。
幾つかの鯖での学習で、おそらく将来の応答を最適化するであろう状況でこれらの頭群を使用することを制限することに成功するかもしれません。
これらの頭群のいずれもが、差分符号化のより簡単な使用には必要ではありません。</p></section><section><h1>12 Security Considerations</h1><blockquote><p>We are not aware of any aspects of the basic delta encoding mechanism
that affect the existing security considerations for the HTTP/1.1 protocol.</p></blockquote><p>基本差分符号化機構が HTTP/1.1 プロトコルの既存の安全についての考察に影響する点は見つかっていません。</p></section><section><h1>13 Acknowledgements</h1><blockquote><p>Phong Vo has provided a great deal of guidance in the choice of delta
encoding algorithms and formats.  Issac Goldstand and Mike Dahlin
provided a number of useful comments on the specification.  Dave
Kristol suggested many textual corrections.</p></blockquote><p>Phong Vo には差分符号化算法・書式の選択の指導で多大な協力を頂きました。
Issac Goldstand と Mike Dahlin には仕様書に数々の有用な意見を頂きました。
Dave Kristol は多くの文面の修正を提案して下さいました。</p></section><section><h1>14 Intellectual Property Rights</h1><pre>   The IETF has been notified of intellectual property rights claimed in
   regard to some or all of the specification contained in this
   document.  For more information consult the online list of claimed
   rights, at <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://www.ietf.org/ipr.html">http://www.ietf.org/ipr.html</anchor-external>.</pre><pre>   The IETF takes no position regarding the validity or scope of any
   intellectual property or other rights that might be claimed to
   pertain to the implementation or use of the technology described in
   this document or the extent to which any license under such rights
   might or might not be available; neither does it represent that it
   has made any effort to identify any such rights.  Information on the
   IETF's procedures with respect to rights in standards-track and
   standards-related documentation can be found in BCP 11.  Copies of
   claims of rights made available for publication and any assurances of
   licenses to be made available, or the result of an attempt made to
   obtain a general license or permission for the use of such
   proprietary rights by implementors or users of this specification can
   be obtained from the IETF Secretariat.</pre></section><section><h1>15 References</h1><pre>   1.  Gaurav Banga, Fred Douglis, and Michael Rabinovich.  Optimistic
       Deltas for WWW Latency Reduction.  Proc. 1997 USENIX Technical
       Conference, Anaheim, CA, January, 1997, pp. 289-303.</pre><pre>   2.  Berners-Lee, T., Fielding, R. and H. Frystyk, &quot;Hypertext Transfer
       Protocol -- HTTP/1.0&quot;, RFC 1945, May 1996.</pre><pre>   3.  Bradner, S., &quot;Key words for use in RFCs to Indicate Requirement
       Levels&quot;, BCP 14, RFC 2119, March 1997.</pre><pre>   4.  Edith Cohen, Balachander Krishnamurthy, and Jennifer Rexford.
       Improving End-to-End Performance of the Web Using Server Volumes
       and Proxy Filters.  Proc. SIGCOMM '98, September, 1998, pp. 241-
       253.</pre><pre>   5.  Deutsch, P., &quot;GZIP file format specification version 4.3&quot;, RFC
       1952, May 1996.</pre><pre>   6.  Deutsch, P., &quot;DEFLATE Compressed Data Format Specification
       version 1.3&quot;, RFC 1951, May 1996.</pre><pre>   7.  Deutsch, P. and J-L. Gailly, &quot;ZLIB Compressed Data Format
       Specification version 3.3&quot;, RFC 1950, May 1996.</pre><pre>   8.  Fred Douglis, Anja Feldmann, Balachander Krishnamurthy, and
       Jeffrey Mogul.  Rate of Change and Other Metrics:  a Live Study
       of the World Wide Web.  Proc. Symposium on Internet Technologies
       and Systems, USENIX, Monterey, CA, December, 1997, pp. 147-158.</pre><pre>   9.  Fielding, R., Gettys, J., Mogul, J., Nielsen, H. and T. Berners-
       Lee, &quot;Hypertext Transfer Protocol -- HTTP/1.1&quot;, RFC 2068, January
       1997.</pre><pre>   10. Fielding, R., Gettys, J., Mogul, J., Nielsen, H., Masinter, L.,
       Leach, P. and T. Berners-Lee, &quot;Hypertext Transfer Protocol --
       HTTP/1.1&quot;, RFC 2616, June 1999.</pre><pre>   11. Franks, J., Hallam-Baker, P., Hostetler, J., Leach, P., Luotonen,
       A., Luotonen, L. and L. Stewart, &quot;HTTP Authentication:  Basic and
       Digest Access Authnetication&quot;, RFC 2617, June 1999.</pre><pre>   12. Freed, N. and N. Borenstein, &quot;Multipurpose Internet Mail
       Extensions (MIME) Part One:  Format of Internet Message Bodies&quot;,
       RFC 2045, November 1996.</pre><pre>   13. Arthur van Hoff, John Giannandrea, Mark Hapner, Steve Carter, and
       Milo Medin.  The HTTP Distribution and Replication Protocol.
       Technical Report NOTE-DRP, World Wide Web Consortium, August,
       1997.</pre><pre>   14. Arthur van Hoff and Jonathan Payne.  Generic Diff Format
       Specification.  Technical Report NOTE-GDIFF, World Wide Web
       Consortium, August, 1997.</pre><pre>   15. Barron C. Housel and David B. Lindquist.  WebExpress: A System
       for Optimizing Web Browsing in a Wireless Environment.  Proc. 2nd
       Annual Intl. Conf. on Mobile Computing and Networking, ACM, Rye,
       New York, November, 1996, pp. 108-116.</pre><pre>   16. James J. Hunt, Kiem-Phong Vo, and Walter F. Tichy.  An Empirical
       Study of Delta Algorithms.  IEEE Soft. Config. and Maint.
       Workshop, 1996.</pre><pre>   17. Jacobson, V., &quot;Compressing TCP/IP Headers for Low-Speed Serial
       Links&quot;, RFC 1144, February 1990.</pre><pre>   18. Khare, R. and S. Lawrence, &quot;Upgrading to TLS Within HTTP/1.1&quot;,
       RFC 2817, May 2000.</pre><pre>   19. David G. Korn and Kiem-Phong Vo.  A Generic Differencing and
       Compression Data Format.  Technical Report HA1630000-021899-02TM,
       AT&amp;T Labs - Research, February, 1999.</pre><pre>   20. Korn, D. and K. Vo, &quot;The VCDIFF Generic Differencing and
       Compression Data Format&quot;, Work in Progress.</pre><pre>   21. Merriam-Webster.   Webster's Seventh New Collegiate Dictionary.
       G. &amp; C. Merriam Co., Springfield, MA, 1963.</pre><pre>   22. Jeffrey C. Mogul.  Hinted caching in the Web.  Proc. Seventh ACM
       SIGOPS European Workshop, Connemara, Ireland, September, 1996,
       pp.  103-108.</pre><pre>   23. Jeffrey C. Mogul, Fred Douglis, Anja Feldmann, and Balachander
       Krishnamurthy.  Potential benefits of delta encoding and data
       compression for HTTP.  Research Report 97/4, DECWRL, July, 1997.</pre><pre>   24. Mogul, J. and A. Van Hoff, &quot;Instance Digests in HTTP&quot;, RFC 3230,
       January 2002.</pre><pre>   25. Narten, T. and H. Alvestrand, &quot;Guidelines for Writing an IANA
       Considerations Section in RFCs&quot;, BCP 26, RFC 2434, October 1998.</pre><pre>   26. The Open Group.  The Single UNIX Specification, Version 2 - 6 Vol
       Set for UNIX 98.  Document number T912, The Open Group, February,
       1997.</pre><pre>   27. W. Tichy.  &quot;RCS - A System For Version Control&quot;.  Software -
       Practice and Experience 15, 7 (July 1985), 637-654.</pre><pre>   28. Andrew Tridgell and Paul Mackerras.  The rsync algorithm.
       Technical Report TR-CS-96-05, Department of Computer Science,
       Australian National University, June, 1996.</pre><pre>   29. Stephen Williams.  Personal communication.
       http://ei.cs.vt.edu/~williams/DIFF/prelim.html.</pre><pre>   30. Stephen Williams, Marc Abrams, Charles R. Standridge, Ghaleb
       Abdulla, and Edward A. Fox.  Removal Policies in Network Caches
       for World-Wide Web Documents.  Proc. SIGCOMM '96, Stanford, CA,
       August, 1996, pp. 293-305.</pre></section><section><h1>16 Authors' addresses</h1><pre>   Jeffrey C. Mogul
   Western Research Laboratory
   Compaq Computer Corporation
   250 University Avenue
   Palo Alto, California, 94305, U.S.A.</pre><pre>   Phone: 1 650 617 3304 (email preferred)
   EMail: JeffMogul@acm.org</pre><pre>   Balachander Krishnamurthy
   AT&amp;T Labs - Research
   180 Park Ave, Room D-229
   Florham Park, NJ 07932-0971, U.S.A.</pre><pre>   EMail: bala@research.att.com</pre><pre>   Fred Douglis
   AT&amp;T Labs - Research
   180 Park Ave, Room B-137
   Florham Park, NJ 07932-0971, U.S.A.</pre><pre>   Phone: 1 973 360-8775
   EMail: douglis@research.att.com</pre><pre>   Anja Feldmann
   University of Saarbruecken, Germany,
   Computer Science Department
   Im Stadtwald, Geb. 36.1, Zimmer 310
   D-66123 Saarbruecken, Germany</pre><pre>   EMail: anja@cs.uni-sb.de</pre><pre>   Yaron Y. Goland</pre><pre>   Email: yaron@goland.org</pre><pre>   Arthur van Hoff
   Marimba, Inc.
   440 Clyde Avenue
   Mountain View, CA 94043, U.S.A.</pre><pre>   Phone: 1 650 930 5283
   EMail: avh@marimba.com</pre><pre>   Daniel M. Hellerstein
   Economic Research Service, USDA
   1909 Franwall Ave, Wheaton MD 20902</pre><pre>   Phone: 1 202 694-5613 or 1 301 649-4728
   EMail: danielh@crosslink.net or webmaster@srehttp.org</pre></section><section><h1>17 Full Copyright Statement</h1><pre>   Copyright (C) The Internet Society (2002).  All Rights Reserved.</pre><pre>   This document and translations of it may be copied and furnished to
   others, and derivative works that comment on or otherwise explain it
   or assist in its implementation may be prepared, copied, published
   and distributed, in whole or in part, without restriction of any
   kind, provided that the above copyright notice and this paragraph are
   included on all such copies and derivative works.  However, this
   document itself may not be modified in any way, such as by removing
   the copyright notice or references to the Internet Society or other
   Internet organizations, except as needed for the purpose of
   developing Internet standards in which case the procedures for
   copyrights defined in the Internet Standards process must be
   followed, or as required to translate it into languages other than
   English.</pre><pre>   The limited permissions granted above are perpetual and will not be
   revoked by the Internet Society or its successors or assigns.</pre><pre>   This document and the information contained herein is provided on an
   &quot;AS IS&quot; basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
   TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
   BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
   HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.</pre></section><section><h1>Acknowledgement</h1><pre>   Funding for the RFC Editor function is currently provided by the
   Internet Society.</pre></section><section><h1>License</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFCのライセンス</anchor></p></section><section><h1>メモ</h1></section></body></html>