blob: f544c4d3f2e79427efc6dbd871a4ee2724ef3f0a [file] [log] [blame]
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Caching Proxies &mdash; Traffic Control 1.7 documentation </title>
<link rel="shortcut icon" href="../_static/favicon.ico"/>
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/theme_overrides.css" type="text/css" />
<link rel="top" title="Traffic Control 1.7 documentation" href="../index.html"/>
<link rel="up" title="CDN Basics" href="index.html"/>
<link rel="next" title="Cache Control Headers and Revalidation" href="cache_revalidation.html"/>
<link rel="prev" title="HTTP 1.1" href="http_11.html"/>
<script src="_static/js/modernizr.min.js"></script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-nav-search">
<a href="/" class="icon icon-home"> Traffic Control
<img src="../_static/tc_logo.png" class="logo" />
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="index.html">CDN Basics</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="content_delivery_networks.html">Content Delivery Networks</a></li>
<li class="toctree-l2"><a class="reference internal" href="http_11.html">HTTP 1.1</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Caching Proxies</a></li>
<li class="toctree-l2"><a class="reference internal" href="cache_revalidation.html">Cache Control Headers and Revalidation</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../overview/index.html">Traffic Control Overview</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../overview/introduction.html">Introduction</a></li>
<li class="toctree-l2"><a class="reference internal" href="../overview/traffic_ops.html">Traffic Ops</a></li>
<li class="toctree-l2"><a class="reference internal" href="../overview/traffic_portal.html">Traffic Portal</a></li>
<li class="toctree-l2"><a class="reference internal" href="../overview/traffic_router.html">Traffic Router</a></li>
<li class="toctree-l2"><a class="reference internal" href="../overview/traffic_monitor.html">Traffic Monitor</a></li>
<li class="toctree-l2"><a class="reference internal" href="../overview/traffic_stats.html">Traffic Stats</a></li>
<li class="toctree-l2"><a class="reference internal" href="../overview/traffic_server.html">Traffic Server</a></li>
<li class="toctree-l2"><a class="reference internal" href="../overview/traffic_vault.html">Traffic Vault</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../admin/index.html">Administrator&#8217;s Guide</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../admin/traffic_ops_install.html">Installing Traffic Ops</a></li>
<li class="toctree-l2"><a class="reference internal" href="../admin/traffic_ops_config.html">Configuring Traffic Ops</a></li>
<li class="toctree-l2"><a class="reference internal" href="../admin/traffic_ops_using.html">Using Traffic Ops</a></li>
<li class="toctree-l2"><a class="reference internal" href="../admin/traffic_ops_extensions.html">Managing Traffic Ops Extensions</a></li>
<li class="toctree-l2"><a class="reference internal" href="../admin/traffic_portal.html">Traffic Portal Administration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../admin/traffic_monitor.html">Traffic Monitor Administration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../admin/traffic_router.html">Traffic Router Administration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../admin/traffic_stats.html">Traffic Stats Administration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../admin/traffic_server.html">Traffic Server Administration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../admin/traffic_vault.html">Traffic Vault Administration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../admin/quick_howto/index.html">Quick How To Guides</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../development/index.html">Developer&#8217;s Guide</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../development/traffic_ops.html">Traffic Ops</a></li>
<li class="toctree-l2"><a class="reference internal" href="../development/traffic_portal.html">Traffic Portal</a></li>
<li class="toctree-l2"><a class="reference internal" href="../development/traffic_router.html">Traffic Router</a></li>
<li class="toctree-l2"><a class="reference internal" href="../development/traffic_monitor.html">Traffic Monitor</a></li>
<li class="toctree-l2"><a class="reference internal" href="../development/traffic_stats.html">Traffic Stats</a></li>
<li class="toctree-l2"><a class="reference internal" href="../development/traffic_server.html">Traffic Server</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../faq/index.html">FAQ</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../faq/general.html">General</a></li>
<li class="toctree-l2"><a class="reference internal" href="../faq/development.html">Development</a></li>
<li class="toctree-l2"><a class="reference internal" href="../faq/administration.html">Running a Traffic Control CDN</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../glossary.html">Glossary</a></li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">Traffic Control</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html">Traffic Control 1.7</a> &raquo;</li>
<li><a href="index.html">CDN Basics</a> &raquo;</li>
<li>Caching Proxies</li>
<li class="wy-breadcrumbs-aside">
<a href="../_sources/basics/caching_proxies.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="cache_revalidation.html" class="btn btn-neutral float-right" title="Cache Control Headers and Revalidation">Next <span class="fa fa-arrow-circle-right"></span></a>
<a href="http_11.html" class="btn btn-neutral" title="HTTP 1.1"><span class="fa fa-arrow-circle-left"></span> Previous</a>
</div>
<div role="main" class="document">
<div class="section" id="caching-proxies">
<span id="rl-caching-proxy"></span><h1>Caching Proxies<a class="headerlink" href="#caching-proxies" title="Permalink to this headline">ΒΆ</a></h1>
<p>The main function of a CDN is to proxy requests from clients to origin servers
and cache the results.
To proxy, in the CDN context, is to obtain content using HTTP from an origin
server on behalf of a client. To cache is to store the results so they can be
reused when other clients are requesting the same content. There are three
types of proxies in use on the Internet today which are described below.</p>
<div class="section" id="arrow-reverse-proxy">
<span id="rl-rev-proxy"></span><span id="index-0"></span><h2><img alt="arrow" src="../_images/fwda.png" /> Reverse Proxy<a class="headerlink" href="#arrow-reverse-proxy" title="Permalink to this headline">ΒΆ</a></h2>
<blockquote>
<div>A reverse proxy acts on behalf of the origin server. The client is mostly unaware it is communicating with a proxy and not the actual origin.
All EDGE caches in a Traffic Control CDN are reverse proxies.
To the end user a Traffic Control based CDN appears as a reverse proxy since
it retrieves content from the origin server, acting on behalf of that origin server. The client requests a URL that has
a hostname which resolves to the reverse proxy&#8217;s IP address and, in compliance
with the HTTP 1.1 specification, the client sends a <code class="docutils literal"><span class="pre">Host:</span></code> header to the reverse
proxy that matches the hostname in the URL.
The proxy looks up this hostname in a
list of mappings to find the origin hostname; if the hostname of the Host header is not found in the list,
the proxy will send an error (<code class="docutils literal"><span class="pre">404</span> <span class="pre">Not</span> <span class="pre">Found</span></code>) to the client.
If the supplied hostname is found in this list of mappings, the proxy checks the cache, and when the content is not already present, connects to the
origin the requested <code class="docutils literal"><span class="pre">Host:</span></code> maps to and requests the path of the original URL, providing the origin hostname in the <code class="docutils literal"><span class="pre">Host</span></code> header. The proxy then stores the URL in cache and serves the contents to the client. When there are subsequent requests for
the same URL, a caching proxy serves the content out of cache thereby reducing
latency and network traffic.</div></blockquote>
<div class="admonition seealso">
<p class="first admonition-title">See also</p>
<p class="last"><a class="reference external" href="https://docs.trafficserver.apache.org/en/latest/admin/reverse-proxy-http-redirects.en.html#http-reverse-proxy">ATS documentation on reverse proxy</a>.</p>
</div>
<p>To insert a reverse proxy into the previous HTTP 1.1 example, the reverse proxy requires provisioning
for <code class="docutils literal"><span class="pre">www.origin.com</span></code>. By adding a remap rule to the cache, the reverse proxy then maps requests to
this origin. The content owner must inform the clients, by updating the URL, to receive the content
from the cache and not from the origin server directly. For this example, the remap rule on the
cache is: <code class="docutils literal"><span class="pre">http://www-origin-cache.cdn.com</span> <span class="pre">http://www.origin.com</span></code>.</p>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">In the previous example minimal headers were shown on both the request and response. In the examples that follow, the origin server response is more realistic.</p>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> <span class="mi">200</span> <span class="n">OK</span>
<span class="n">Date</span><span class="p">:</span> <span class="n">Sun</span><span class="p">,</span> <span class="mi">14</span> <span class="n">Dec</span> <span class="mi">2014</span> <span class="mi">23</span><span class="p">:</span><span class="mi">22</span><span class="p">:</span><span class="mi">44</span> <span class="n">GMT</span>
<span class="n">Server</span><span class="p">:</span> <span class="n">Apache</span><span class="o">/</span><span class="mf">2.2</span><span class="o">.</span><span class="mi">15</span> <span class="p">(</span><span class="n">Red</span> <span class="n">Hat</span><span class="p">)</span>
<span class="n">Last</span><span class="o">-</span><span class="n">Modified</span><span class="p">:</span> <span class="n">Sun</span><span class="p">,</span> <span class="mi">14</span> <span class="n">Dec</span> <span class="mi">2014</span> <span class="mi">23</span><span class="p">:</span><span class="mi">18</span><span class="p">:</span><span class="mi">51</span> <span class="n">GMT</span>
<span class="n">ETag</span><span class="p">:</span> <span class="s2">&quot;1aa008f-2d-50a3559482cc0&quot;</span>
<span class="n">Content</span><span class="o">-</span><span class="n">Length</span><span class="p">:</span> <span class="mi">45</span>
<span class="n">Connection</span><span class="p">:</span> <span class="n">close</span>
<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="p">:</span> <span class="n">text</span><span class="o">/</span><span class="n">html</span><span class="p">;</span> <span class="n">charset</span><span class="o">=</span><span class="n">UTF</span><span class="o">-</span><span class="mi">8</span>
<span class="o">&lt;</span><span class="n">html</span><span class="o">&gt;&lt;</span><span class="n">body</span><span class="o">&gt;</span><span class="n">This</span> <span class="ow">is</span> <span class="n">a</span> <span class="n">fun</span> <span class="n">file</span><span class="o">&lt;/</span><span class="n">body</span><span class="o">&gt;&lt;/</span><span class="n">html</span><span class="o">&gt;</span>
</pre></div>
</div>
<p>The client is given the URL <code class="docutils literal"><span class="pre">http://www-origin-cache.cdn.com/foo/bar/fun.html</span></code> (note the different hostname) and when attempting to obtain that URL, the following occurs:</p>
<ol class="arabic">
<li><p class="first">The client sends a request to the LDNS server to resolve the name <code class="docutils literal"><span class="pre">www-origin-cache.cdn.com</span></code> to an IPv4 address.</p>
</li>
<li><p class="first">Similar to the previous case, the LDNS server resolves the name <code class="docutils literal"><span class="pre">www-origin-cache.cdn.com</span></code> to an IPv4 address, in this example, this address is 55.44.33.22.</p>
</li>
<li><p class="first">The client opens a TCP connection from a random port locally, to port 80 (the HTTP default) on 55.44.33.22, and sends the following:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">GET</span> <span class="o">/</span><span class="n">foo</span><span class="o">/</span><span class="n">bar</span><span class="o">/</span><span class="n">fun</span><span class="o">.</span><span class="n">html</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span>
<span class="n">Host</span><span class="p">:</span> <span class="n">www</span><span class="o">-</span><span class="n">origin</span><span class="o">-</span><span class="n">cache</span><span class="o">.</span><span class="n">cdn</span><span class="o">.</span><span class="n">com</span>
</pre></div>
</div>
</li>
<li><p class="first">The reverse proxy looks up <code class="docutils literal"><span class="pre">www-origin-cache.cdn.com</span></code> in its remap rules, and finds the origin is <code class="docutils literal"><span class="pre">www.origin.com</span></code>.</p>
</li>
<li><p class="first">The proxy checks its cache to see if the response for <code class="docutils literal"><span class="pre">http://www-origin-cache.cdn.com/foo/bar/fun.html</span></code> is already in the cache.</p>
</li>
</ol>
<p>6a. If the response is not in the cache:</p>
<blockquote>
<div><ol class="arabic">
<li><p class="first">The proxy uses DNS to get the IPv4 address for <code class="docutils literal"><span class="pre">www.origin.com</span></code>, connect to it on port 80, and sends:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">GET</span> <span class="o">/</span><span class="n">foo</span><span class="o">/</span><span class="n">bar</span><span class="o">/</span><span class="n">fun</span><span class="o">.</span><span class="n">html</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span>
<span class="n">Host</span><span class="p">:</span> <span class="n">www</span><span class="o">.</span><span class="n">origin</span><span class="o">.</span><span class="n">com</span>
</pre></div>
</div>
</li>
<li><p class="first">The origin server responds with the headers and content as shown:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> <span class="mi">200</span> <span class="n">OK</span>
<span class="n">Date</span><span class="p">:</span> <span class="n">Sun</span><span class="p">,</span> <span class="mi">14</span> <span class="n">Dec</span> <span class="mi">2014</span> <span class="mi">23</span><span class="p">:</span><span class="mi">22</span><span class="p">:</span><span class="mi">44</span> <span class="n">GMT</span>
<span class="n">Server</span><span class="p">:</span> <span class="n">Apache</span><span class="o">/</span><span class="mf">2.2</span><span class="o">.</span><span class="mi">15</span> <span class="p">(</span><span class="n">Red</span> <span class="n">Hat</span><span class="p">)</span>
<span class="n">Last</span><span class="o">-</span><span class="n">Modified</span><span class="p">:</span> <span class="n">Sun</span><span class="p">,</span> <span class="mi">14</span> <span class="n">Dec</span> <span class="mi">2014</span> <span class="mi">23</span><span class="p">:</span><span class="mi">18</span><span class="p">:</span><span class="mi">51</span> <span class="n">GMT</span>
<span class="n">ETag</span><span class="p">:</span> <span class="s2">&quot;1aa008f-2d-50a3559482cc0&quot;</span>
<span class="n">Content</span><span class="o">-</span><span class="n">Length</span><span class="p">:</span> <span class="mi">45</span>
<span class="n">Connection</span><span class="p">:</span> <span class="n">close</span>
<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="p">:</span> <span class="n">text</span><span class="o">/</span><span class="n">html</span><span class="p">;</span> <span class="n">charset</span><span class="o">=</span><span class="n">UTF</span><span class="o">-</span><span class="mi">8</span>
<span class="o">&lt;</span><span class="n">html</span><span class="o">&gt;&lt;</span><span class="n">body</span><span class="o">&gt;</span><span class="n">This</span> <span class="ow">is</span> <span class="n">a</span> <span class="n">fun</span> <span class="n">file</span><span class="o">&lt;/</span><span class="n">body</span><span class="o">&gt;&lt;/</span><span class="n">html</span><span class="o">&gt;</span>
</pre></div>
</div>
</li>
<li><p class="first">The proxy sends the origin response on to the client adding a <code class="docutils literal"><span class="pre">Via:</span></code> header (and maybe others):</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> <span class="mi">200</span> <span class="n">OK</span>
<span class="n">Date</span><span class="p">:</span> <span class="n">Sun</span><span class="p">,</span> <span class="mi">14</span> <span class="n">Dec</span> <span class="mi">2014</span> <span class="mi">23</span><span class="p">:</span><span class="mi">22</span><span class="p">:</span><span class="mi">44</span> <span class="n">GMT</span>
<span class="n">Last</span><span class="o">-</span><span class="n">Modified</span><span class="p">:</span> <span class="n">Sun</span><span class="p">,</span> <span class="mi">14</span> <span class="n">Dec</span> <span class="mi">2014</span> <span class="mi">23</span><span class="p">:</span><span class="mi">18</span><span class="p">:</span><span class="mi">51</span> <span class="n">GMT</span>
<span class="n">ETag</span><span class="p">:</span> <span class="s2">&quot;1aa008f-2d-50a3559482cc0&quot;</span>
<span class="n">Content</span><span class="o">-</span><span class="n">Length</span><span class="p">:</span> <span class="mi">45</span>
<span class="n">Connection</span><span class="p">:</span> <span class="n">close</span>
<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="p">:</span> <span class="n">text</span><span class="o">/</span><span class="n">html</span><span class="p">;</span> <span class="n">charset</span><span class="o">=</span><span class="n">UTF</span><span class="o">-</span><span class="mi">8</span>
<span class="n">Age</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">Via</span><span class="p">:</span> <span class="n">http</span><span class="o">/</span><span class="mf">1.1</span> <span class="n">cache01</span><span class="o">.</span><span class="n">cdn</span><span class="o">.</span><span class="n">kabletown</span><span class="o">.</span><span class="n">net</span> <span class="p">(</span><span class="n">ApacheTrafficServer</span><span class="o">/</span><span class="mf">4.2</span><span class="o">.</span><span class="mi">1</span> <span class="p">[</span><span class="n">uScSsSfUpSeN</span><span class="p">:</span><span class="n">t</span> <span class="n">cCSi</span> <span class="n">p</span> <span class="n">sS</span><span class="p">])</span>
<span class="n">Server</span><span class="p">:</span> <span class="n">ATS</span><span class="o">/</span><span class="mf">4.2</span><span class="o">.</span><span class="mi">1</span>
<span class="o">&lt;</span><span class="n">html</span><span class="o">&gt;&lt;</span><span class="n">body</span><span class="o">&gt;</span><span class="n">This</span> <span class="ow">is</span> <span class="n">a</span> <span class="n">fun</span> <span class="n">file</span><span class="o">&lt;/</span><span class="n">body</span><span class="o">&gt;&lt;/</span><span class="n">html</span><span class="o">&gt;</span>
</pre></div>
</div>
</li>
</ol>
</div></blockquote>
<p>6b. If it <em>is</em> in the cache:</p>
<blockquote>
<div><p>The proxy responds to the client with the previously retrieved result:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> <span class="mi">200</span> <span class="n">OK</span>
<span class="n">Date</span><span class="p">:</span> <span class="n">Sun</span><span class="p">,</span> <span class="mi">14</span> <span class="n">Dec</span> <span class="mi">2014</span> <span class="mi">23</span><span class="p">:</span><span class="mi">22</span><span class="p">:</span><span class="mi">44</span> <span class="n">GMT</span>
<span class="n">Last</span><span class="o">-</span><span class="n">Modified</span><span class="p">:</span> <span class="n">Sun</span><span class="p">,</span> <span class="mi">14</span> <span class="n">Dec</span> <span class="mi">2014</span> <span class="mi">23</span><span class="p">:</span><span class="mi">18</span><span class="p">:</span><span class="mi">51</span> <span class="n">GMT</span>
<span class="n">ETag</span><span class="p">:</span> <span class="s2">&quot;1aa008f-2d-50a3559482cc0&quot;</span>
<span class="n">Content</span><span class="o">-</span><span class="n">Length</span><span class="p">:</span> <span class="mi">45</span>
<span class="n">Connection</span><span class="p">:</span> <span class="n">close</span>
<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="p">:</span> <span class="n">text</span><span class="o">/</span><span class="n">html</span><span class="p">;</span> <span class="n">charset</span><span class="o">=</span><span class="n">UTF</span><span class="o">-</span><span class="mi">8</span>
<span class="n">Age</span><span class="p">:</span> <span class="mi">39711</span>
<span class="n">Via</span><span class="p">:</span> <span class="n">http</span><span class="o">/</span><span class="mf">1.1</span> <span class="n">cache01</span><span class="o">.</span><span class="n">cdn</span><span class="o">.</span><span class="n">kabletown</span><span class="o">.</span><span class="n">net</span> <span class="p">(</span><span class="n">ApacheTrafficServer</span><span class="o">/</span><span class="mf">4.2</span><span class="o">.</span><span class="mi">1</span> <span class="p">[</span><span class="n">uScSsSfUpSeN</span><span class="p">:</span><span class="n">t</span> <span class="n">cCSi</span> <span class="n">p</span> <span class="n">sS</span><span class="p">])</span>
<span class="n">Server</span><span class="p">:</span> <span class="n">ATS</span><span class="o">/</span><span class="mf">4.2</span><span class="o">.</span><span class="mi">1</span>
<span class="o">&lt;</span><span class="n">html</span><span class="o">&gt;&lt;</span><span class="n">body</span><span class="o">&gt;</span><span class="n">This</span> <span class="ow">is</span> <span class="n">a</span> <span class="n">fun</span> <span class="n">file</span><span class="o">&lt;/</span><span class="n">body</span><span class="o">&gt;&lt;/</span><span class="n">html</span><span class="o">&gt;</span>
</pre></div>
</div>
</div></blockquote>
</div>
<div class="section" id="arrow-forward-proxy">
<span id="rl-fwd-proxy"></span><span id="index-1"></span><h2><img alt="arrow" src="../_images/fwda.png" /> Forward Proxy<a class="headerlink" href="#arrow-forward-proxy" title="Permalink to this headline">ΒΆ</a></h2>
<blockquote>
<div>A forward proxy acts on behalf of the client. The origin server is mostly
unaware of the proxy, the client requests the proxy to retrieve content from a
particular origin server. All MID caches in a Traffic Control based CDN are
forward proxies. In a forward proxy scenario, the client is explicitely configured to use the
the proxy&#8217;s IP address and port as a forward proxy. The client always connects to the forward
proxy for content. The content provider does not have to change the URL the
client obtains, and is unaware of the proxy in the middle.</div></blockquote>
<div class="admonition seealso">
<p class="first admonition-title">See also</p>
<p class="last"><a class="reference external" href="https://docs.trafficserver.apache.org/en/latest/admin/forward-proxy.en.html">ATS documentation on forward proxy</a>.</p>
</div>
<p>Below is an example of the client retrieving the URL <code class="docutils literal"><span class="pre">http://www.origin.com/foo/bar/fun.html</span></code> through a forward proxy:</p>
<ol class="arabic simple">
<li>The client requires configuration to use the proxy, as opposed to the reverse proxy example. Assume the client configuration is through preferences entries or other to use the proxy IP address 99.88.77.66 and proxy port 8080.</li>
<li>To retrieve <code class="docutils literal"><span class="pre">http://www.origin.com/foo/bar/fun.html</span></code> URL, the client connects to 99.88.77.66 on port 8080 and sends:</li>
</ol>
<blockquote>
<div><div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">GET</span> <span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">www</span><span class="o">.</span><span class="n">origin</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">foo</span><span class="o">/</span><span class="n">bar</span><span class="o">/</span><span class="n">fun</span><span class="o">.</span><span class="n">html</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span>
</pre></div>
</div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">In this case, the client places the entire URL after GET, including protocol and hostname (<code class="docutils literal"><span class="pre">http://www.origin.com</span></code>), but in the reverse proxy and direct-to-origin case it puts only the path portion of the URL (<code class="docutils literal"><span class="pre">/foo/bar/fun.html</span></code>) after the GET.</p>
</div>
</div></blockquote>
<ol class="arabic simple" start="3">
<li>The proxy verifies whether the response for <code class="docutils literal"><span class="pre">http://www-origin-cache.cdn.com/foo/bar/fun.html</span></code> is already in the cache.</li>
</ol>
<p>4a. If it is not in the cache:</p>
<blockquote>
<div><ol class="arabic">
<li><p class="first">The proxy uses DNS to obtain the IPv4 address for <code class="docutils literal"><span class="pre">www.origin.com</span></code>, connects to it on port 80, and sends:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">GET</span> <span class="o">/</span><span class="n">foo</span><span class="o">/</span><span class="n">bar</span><span class="o">/</span><span class="n">fun</span><span class="o">.</span><span class="n">html</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span>
<span class="n">Host</span><span class="p">:</span> <span class="n">www</span><span class="o">.</span><span class="n">origin</span><span class="o">.</span><span class="n">com</span>
</pre></div>
</div>
</li>
<li><p class="first">The origin server responds with the headers and content as shown below:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> <span class="mi">200</span> <span class="n">OK</span>
<span class="n">Date</span><span class="p">:</span> <span class="n">Sun</span><span class="p">,</span> <span class="mi">14</span> <span class="n">Dec</span> <span class="mi">2014</span> <span class="mi">23</span><span class="p">:</span><span class="mi">22</span><span class="p">:</span><span class="mi">44</span> <span class="n">GMT</span>
<span class="n">Server</span><span class="p">:</span> <span class="n">Apache</span><span class="o">/</span><span class="mf">2.2</span><span class="o">.</span><span class="mi">15</span> <span class="p">(</span><span class="n">Red</span> <span class="n">Hat</span><span class="p">)</span>
<span class="n">Last</span><span class="o">-</span><span class="n">Modified</span><span class="p">:</span> <span class="n">Sun</span><span class="p">,</span> <span class="mi">14</span> <span class="n">Dec</span> <span class="mi">2014</span> <span class="mi">23</span><span class="p">:</span><span class="mi">18</span><span class="p">:</span><span class="mi">51</span> <span class="n">GMT</span>
<span class="n">ETag</span><span class="p">:</span> <span class="s2">&quot;1aa008f-2d-50a3559482cc0&quot;</span>
<span class="n">Content</span><span class="o">-</span><span class="n">Length</span><span class="p">:</span> <span class="mi">45</span>
<span class="n">Connection</span><span class="p">:</span> <span class="n">close</span>
<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="p">:</span> <span class="n">text</span><span class="o">/</span><span class="n">html</span><span class="p">;</span> <span class="n">charset</span><span class="o">=</span><span class="n">UTF</span><span class="o">-</span><span class="mi">8</span>
<span class="o">&lt;</span><span class="n">html</span><span class="o">&gt;&lt;</span><span class="n">body</span><span class="o">&gt;</span><span class="n">This</span> <span class="ow">is</span> <span class="n">a</span> <span class="n">fun</span> <span class="n">file</span><span class="o">&lt;/</span><span class="n">body</span><span class="o">&gt;&lt;/</span><span class="n">html</span><span class="o">&gt;</span>
</pre></div>
</div>
</li>
<li><p class="first">The proxy sends this on to the client adding a <code class="docutils literal"><span class="pre">Via:</span></code> header (and maybe others):</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> <span class="mi">200</span> <span class="n">OK</span>
<span class="n">Date</span><span class="p">:</span> <span class="n">Sun</span><span class="p">,</span> <span class="mi">14</span> <span class="n">Dec</span> <span class="mi">2014</span> <span class="mi">23</span><span class="p">:</span><span class="mi">22</span><span class="p">:</span><span class="mi">44</span> <span class="n">GMT</span>
<span class="n">Last</span><span class="o">-</span><span class="n">Modified</span><span class="p">:</span> <span class="n">Sun</span><span class="p">,</span> <span class="mi">14</span> <span class="n">Dec</span> <span class="mi">2014</span> <span class="mi">23</span><span class="p">:</span><span class="mi">18</span><span class="p">:</span><span class="mi">51</span> <span class="n">GMT</span>
<span class="n">ETag</span><span class="p">:</span> <span class="s2">&quot;1aa008f-2d-50a3559482cc0&quot;</span>
<span class="n">Content</span><span class="o">-</span><span class="n">Length</span><span class="p">:</span> <span class="mi">45</span>
<span class="n">Connection</span><span class="p">:</span> <span class="n">close</span>
<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="p">:</span> <span class="n">text</span><span class="o">/</span><span class="n">html</span><span class="p">;</span> <span class="n">charset</span><span class="o">=</span><span class="n">UTF</span><span class="o">-</span><span class="mi">8</span>
<span class="n">Age</span><span class="p">:</span> <span class="mi">0</span>
<span class="n">Via</span><span class="p">:</span> <span class="n">http</span><span class="o">/</span><span class="mf">1.1</span> <span class="n">cache01</span><span class="o">.</span><span class="n">cdn</span><span class="o">.</span><span class="n">kabletown</span><span class="o">.</span><span class="n">net</span> <span class="p">(</span><span class="n">ApacheTrafficServer</span><span class="o">/</span><span class="mf">4.2</span><span class="o">.</span><span class="mi">1</span> <span class="p">[</span><span class="n">uScSsSfUpSeN</span><span class="p">:</span><span class="n">t</span> <span class="n">cCSi</span> <span class="n">p</span> <span class="n">sS</span><span class="p">])</span>
<span class="n">Server</span><span class="p">:</span> <span class="n">ATS</span><span class="o">/</span><span class="mf">4.2</span><span class="o">.</span><span class="mi">1</span>
<span class="o">&lt;</span><span class="n">html</span><span class="o">&gt;&lt;</span><span class="n">body</span><span class="o">&gt;</span><span class="n">This</span> <span class="ow">is</span> <span class="n">a</span> <span class="n">fun</span> <span class="n">file</span><span class="o">&lt;/</span><span class="n">body</span><span class="o">&gt;&lt;/</span><span class="n">html</span><span class="o">&gt;</span>
</pre></div>
</div>
</li>
</ol>
</div></blockquote>
<p>4b. If it <em>is</em> in the cache:</p>
<blockquote>
<div><p>The proxy responds to the client with the previously retrieved result:</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span> <span class="mi">200</span> <span class="n">OK</span>
<span class="n">Date</span><span class="p">:</span> <span class="n">Sun</span><span class="p">,</span> <span class="mi">14</span> <span class="n">Dec</span> <span class="mi">2014</span> <span class="mi">23</span><span class="p">:</span><span class="mi">22</span><span class="p">:</span><span class="mi">44</span> <span class="n">GMT</span>
<span class="n">Last</span><span class="o">-</span><span class="n">Modified</span><span class="p">:</span> <span class="n">Sun</span><span class="p">,</span> <span class="mi">14</span> <span class="n">Dec</span> <span class="mi">2014</span> <span class="mi">23</span><span class="p">:</span><span class="mi">18</span><span class="p">:</span><span class="mi">51</span> <span class="n">GMT</span>
<span class="n">ETag</span><span class="p">:</span> <span class="s2">&quot;1aa008f-2d-50a3559482cc0&quot;</span>
<span class="n">Content</span><span class="o">-</span><span class="n">Length</span><span class="p">:</span> <span class="mi">45</span>
<span class="n">Connection</span><span class="p">:</span> <span class="n">close</span>
<span class="n">Content</span><span class="o">-</span><span class="n">Type</span><span class="p">:</span> <span class="n">text</span><span class="o">/</span><span class="n">html</span><span class="p">;</span> <span class="n">charset</span><span class="o">=</span><span class="n">UTF</span><span class="o">-</span><span class="mi">8</span>
<span class="n">Age</span><span class="p">:</span> <span class="mi">99711</span>
<span class="n">Via</span><span class="p">:</span> <span class="n">http</span><span class="o">/</span><span class="mf">1.1</span> <span class="n">cache01</span><span class="o">.</span><span class="n">cdn</span><span class="o">.</span><span class="n">kabletown</span><span class="o">.</span><span class="n">net</span> <span class="p">(</span><span class="n">ApacheTrafficServer</span><span class="o">/</span><span class="mf">4.2</span><span class="o">.</span><span class="mi">1</span> <span class="p">[</span><span class="n">uScSsSfUpSeN</span><span class="p">:</span><span class="n">t</span> <span class="n">cCSi</span> <span class="n">p</span> <span class="n">sS</span><span class="p">])</span>
<span class="n">Server</span><span class="p">:</span> <span class="n">ATS</span><span class="o">/</span><span class="mf">4.2</span><span class="o">.</span><span class="mi">1</span>
<span class="o">&lt;</span><span class="n">html</span><span class="o">&gt;&lt;</span><span class="n">body</span><span class="o">&gt;</span><span class="n">This</span> <span class="ow">is</span> <span class="n">a</span> <span class="n">fun</span> <span class="n">file</span><span class="o">&lt;/</span><span class="n">body</span><span class="o">&gt;&lt;/</span><span class="n">html</span><span class="o">&gt;</span>
</pre></div>
</div>
</div></blockquote>
</div>
<div class="section" id="arrow-transparent-proxy">
<span id="index-2"></span><h2><img alt="arrow" src="../_images/fwda.png" /> Transparent Proxy<a class="headerlink" href="#arrow-transparent-proxy" title="Permalink to this headline">ΒΆ</a></h2>
<blockquote>
<div>Neither the origin nor the client are aware of the actions performed by the transparent proxies. A Traffic Control based CDN does not use transparent proxies. If you are interested you can learn more about transparent proxies on <a class="reference external" href="http://en.wikipedia.org/wiki/Proxy_server#Transparent_proxy">wikipedia</a>.</div></blockquote>
</div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="cache_revalidation.html" class="btn btn-neutral float-right" title="Cache Control Headers and Revalidation">Next <span class="fa fa-arrow-circle-right"></span></a>
<a href="http_11.html" class="btn btn-neutral" title="HTTP 1.1"><span class="fa fa-arrow-circle-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<p>
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'../',
VERSION:'1.7',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.StickyNav.enable();
});
</script>
</body>
</html>